2007-04-22 23:56:11 +00:00
|
|
|
---
|
|
|
|
fs/namei.c | 13 +++++++------
|
|
|
|
1 file changed, 7 insertions(+), 6 deletions(-)
|
|
|
|
|
|
|
|
--- a/fs/namei.c
|
|
|
|
+++ b/fs/namei.c
|
2007-04-23 02:06:00 +00:00
|
|
|
@@ -1385,8 +1385,9 @@ static inline int check_sticky(struct in
|
2007-04-22 23:56:11 +00:00
|
|
|
* 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)
|
2007-04-23 02:06:00 +00:00
|
|
|
@@ -1395,7 +1396,7 @@ static int may_delete(struct inode *dir,
|
2007-04-22 23:56:11 +00:00
|
|
|
BUG_ON(victim->d_parent->d_inode != dir);
|
|
|
|
audit_inode_child(victim->d_name.name, victim->d_inode, dir);
|
|
|
|
|
|
|
|
- error = permission(dir,MAY_WRITE | MAY_EXEC, NULL);
|
|
|
|
+ error = permission(dir, MAY_WRITE | MAY_EXEC, nd);
|
|
|
|
if (error)
|
|
|
|
return error;
|
|
|
|
if (IS_APPEND(dir))
|
2007-04-23 02:06:00 +00:00
|
|
|
@@ -2011,7 +2012,7 @@ void dentry_unhash(struct dentry *dentry
|
2007-04-22 23:56:11 +00:00
|
|
|
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;
|
2007-04-23 02:06:00 +00:00
|
|
|
@@ -2093,7 +2094,7 @@ asmlinkage long sys_rmdir(const char __u
|
2007-04-22 23:56:11 +00:00
|
|
|
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;
|
2007-04-23 02:06:00 +00:00
|
|
|
@@ -2479,14 +2480,14 @@ int vfs_rename(struct nameidata2 *old_nd
|
2007-04-22 23:56:11 +00:00
|
|
|
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;
|
|
|
|
|