Unionfs: don't check parent dentries
authorErez Zadok <ezk@cs.sunysb.edu>
Thu, 10 Jan 2008 12:13:01 +0000 (07:13 -0500)
committerRachita Kothiyal <rachita@dewey.fsl.cs.sunysb.edu>
Thu, 1 May 2008 23:03:33 +0000 (19:03 -0400)
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 55f016ee102a1f74e8c7755cd39cda2d7a2e7760..00500f6b14093a3f875c53200f245ac67ee3e2ae 100644 (file)
@@ -680,7 +680,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 b63204285e9b6c4978fc3c5ab8ec4da7849c6ccb..0c424f62c2ad67591ff788b2a85eefc9c2780539 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 12754a1d1d046992731350c981583a523436cd33..087c5f2b20de3f82dfcc82fbe43e500847f4f40e 100644 (file)
@@ -123,7 +123,6 @@ out:
 
        unionfs_check_inode(parent);
        if (!err) {
-               unionfs_check_dentry(dentry->d_parent);
                unionfs_check_dentry(dentry);
                unionfs_check_nd(nd);
        }
@@ -173,14 +172,16 @@ static struct dentry *unionfs_lookup(struct inode *parent,
        }
 
        unionfs_check_inode(parent);
-       unionfs_check_dentry(dentry);
-       unionfs_check_dentry(dentry->d_parent);
-       unionfs_check_nd(nd);
-       if (!IS_ERR(ret))
+       if (!IS_ERR(ret)) {
+               unionfs_check_dentry(dentry);
+               unionfs_check_nd(nd);
                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;
@@ -430,7 +431,8 @@ out:
                unionfs_postcopyup_setmnt(dentry);
 
        unionfs_check_inode(dir);
-       unionfs_check_dentry(dentry);
+       if (!err)
+               unionfs_check_dentry(dentry);
        unionfs_unlock_dentry(dentry);
        unionfs_read_unlock(dentry->d_sb);
 
@@ -632,7 +634,8 @@ out:
                unionfs_postcopyup_setmnt(dentry);
 
        unionfs_check_inode(dir);
-       unionfs_check_dentry(dentry);
+       if (!err)
+               unionfs_check_dentry(dentry);
        unionfs_unlock_dentry(dentry);
        unionfs_read_unlock(dentry->d_sb);
 
@@ -927,8 +930,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);