Unionfs: don't check parent dentries
authorErez Zadok <ezk@cs.sunysb.edu>
Fri, 28 Dec 2007 15:40:43 +0000 (10:40 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 28 Dec 2007 15:40:43 +0000 (10:40 -0500)
Parent dentries may not be locked and may change, so don't check them.  But
do check parent inodes if they are passed to the method.  Also, ensure the
checks are done only if no error occurred.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/commonfops.c
fs/unionfs/file.c
fs/unionfs/inode.c

index b8357a726ecacc455cc86188e5e52e7ae19a4736..2c32ada1612e69891ffb6838a02ca1d61b54b26a 100644 (file)
@@ -588,7 +588,6 @@ out_nofree:
                unionfs_copy_attr_times(dentry->d_parent->d_inode);
                unionfs_copy_attr_times(inode);
                unionfs_check_file(file);
-               unionfs_check_dentry(dentry->d_parent);
                unionfs_check_inode(inode);
        }
        unionfs_read_unlock(inode->i_sb);
index fd7f5a7a1b0fe559bc702d816e44f880b5526532..0ff8ee783414fb1e093fd9d4f23ddd1555eba50d 100644 (file)
@@ -66,7 +66,6 @@ out:
                /* copyup could cause parent dir times to change */
                unionfs_copy_attr_times(file->f_path.dentry->d_parent->d_inode);
                unionfs_check_file(file);
-               unionfs_check_dentry(file->f_path.dentry->d_parent);
        }
        unionfs_read_unlock(file->f_path.dentry->d_sb);
        return err;
index 822a7d6a8427068a6267c5b42093b1e622e11805..01dec7c8d77c35064a7c75b40ee7671044d2192e 100644 (file)
@@ -151,7 +151,6 @@ out:
 
        unionfs_check_inode(parent);
        if (!err) {
-               unionfs_check_dentry(dentry->d_parent);
                unionfs_check_dentry(dentry);
        }
        unionfs_unlock_dentry(dentry);
@@ -200,13 +199,15 @@ static struct dentry *unionfs_lookup(struct inode *parent,
        }
 
        unionfs_check_inode(parent);
-       unionfs_check_dentry(dentry);
-       unionfs_check_dentry(dentry->d_parent);
-       if (!IS_ERR(ret))
+       if (!IS_ERR(ret)) {
+               unionfs_check_dentry(dentry);
                unionfs_unlock_dentry(dentry);
+       }
 
-       if (dentry != dentry->d_parent)
+       if (dentry != dentry->d_parent) {
+               unionfs_check_dentry(dentry->d_parent);
                unionfs_unlock_dentry(dentry->d_parent);
+       }
        unionfs_read_unlock(dentry->d_sb);
 
        return ret;
@@ -512,8 +513,7 @@ out:
 
        unionfs_check_inode(parent);
        if (!err)
-               unionfs_check_dentry(dentry->d_parent);
-       unionfs_check_dentry(dentry);
+               unionfs_check_dentry(dentry);
        unionfs_unlock_dentry(dentry);
        unionfs_read_unlock(dentry->d_sb);
        return err;
@@ -807,8 +807,7 @@ out:
 
        unionfs_check_inode(parent);
        if (!err)
-               unionfs_check_dentry(dentry->d_parent);
-       unionfs_check_dentry(dentry);
+               unionfs_check_dentry(dentry);
        unionfs_unlock_dentry(dentry);
        unionfs_read_unlock(dentry->d_sb);
        return err;
@@ -1092,8 +1091,8 @@ static int unionfs_setattr(struct dentry *dentry, struct iattr *ia)
        /* if setattr succeeded, then parent dir may have changed */
        unionfs_copy_attr_times(dentry->d_parent->d_inode);
 out:
-       unionfs_check_dentry(dentry);
-       unionfs_check_dentry(dentry->d_parent);
+       if (!err)
+               unionfs_check_dentry(dentry);
        unionfs_unlock_dentry(dentry);
        unionfs_read_unlock(dentry->d_sb);