From: Andreas Gruenbacher Subject: Pass nameidata2 to may_delete() Pass the nameidata through to may_delete(), and pass it on to the permission() call. Signed-off-by: Andreas Gruenbacher --- fs/namei.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) --- a/fs/namei.c +++ b/fs/namei.c @@ -1418,8 +1418,9 @@ static inline int check_sticky(struct in * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir,struct dentry *victim,int isdir) +static int may_delete(struct nameidata2 *nd, struct dentry *victim, int isdir) { + struct inode *dir = nd->dentry->d_inode; int error; if (!victim->d_inode) @@ -1428,11 +1429,8 @@ static int may_delete(struct inode *dir, BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(victim->d_name.name, victim->d_inode, dir); -#if 0 - if (nd) - nd->flags |= LOOKUP_CONTINUE; -#endif - error = permission(dir,MAY_WRITE | MAY_EXEC, NULL); + nd->flags |= LOOKUP_CONTINUE; + error = permission(dir,MAY_WRITE | MAY_EXEC, nd); if (error) return error; if (IS_APPEND(dir)) @@ -2049,7 +2047,7 @@ void dentry_unhash(struct dentry *dentry int vfs_rmdir(struct nameidata2 *nd, struct dentry *dentry) { struct inode *dir = nd->dentry->d_inode; - int error = may_delete(dir, dentry, 1); + int error = may_delete(nd, dentry, 1); if (error) return error; @@ -2131,7 +2129,7 @@ asmlinkage long sys_rmdir(const char __u int vfs_unlink(struct nameidata2 *nd, struct dentry *dentry) { struct inode *dir = nd->dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(nd, dentry, 0); if (error) return error; @@ -2517,14 +2515,14 @@ int vfs_rename(struct nameidata2 *old_nd if (old_dentry->d_inode == new_dentry->d_inode) return 0; - error = may_delete(old_dir, old_dentry, is_dir); + error = may_delete(old_nd, old_dentry, is_dir); if (error) return error; if (!new_dentry->d_inode) error = may_create(new_nd, new_dentry); else - error = may_delete(new_dir, new_dentry, is_dir); + error = may_delete(new_nd, new_dentry, is_dir); if (error) return error;