Unionfs: fix d_revalidate for corner case
authorErez Zadok <ezk@cs.sunysb.edu>
Tue, 12 Aug 2014 02:10:28 +0000 (22:10 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 12 Aug 2014 02:10:28 +0000 (22:10 -0400)
In some cases, lower_dentry may goes to NULL.  Return 0 here to mark it
as invalid dentry.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
Signed-off-by: Mengyang Li <li.mengyang@stonybrook.edu>
fs/unionfs/dentry.c

index 3bf8845b609c8c76e1c1da710d77823d43d9ea8b..1e388e20ef27e731e3b3589a68d8f883db9ea1bb 100644 (file)
@@ -328,6 +328,11 @@ static int unionfs_d_revalidate(struct dentry *dentry,
        parent = unionfs_lock_parent(dentry, UNIONFS_DMUTEX_PARENT);
        unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
 
+       if (!unionfs_lower_dentry(dentry)) {
+               err = 0;
+               goto out;
+       }
+
        valid = __unionfs_d_revalidate(dentry, parent, false);
        if (valid) {
                unionfs_postcopyup_setmnt(dentry);
@@ -336,6 +341,7 @@ static int unionfs_d_revalidate(struct dentry *dentry,
                d_drop(dentry);
                err = valid;
        }
+out:
        unionfs_unlock_dentry(dentry);
        unionfs_unlock_parent(dentry, parent);
        unionfs_read_unlock(dentry->d_sb);