Unionfs: ensure consistent lower inodes types
authorErez Zadok <ezk@cs.sunysb.edu>
Sat, 16 Feb 2008 02:45:34 +0000 (21:45 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Sat, 16 Feb 2008 02:45:34 +0000 (21:45 -0500)
When looking up a lower object in multiple branches, especially for
directories, ignore any existing entries whose type is different than the
type of the first found object (otherwise we'll be trying to, say, call
readdir on a non-dir inode).

Signed-off-by: Himanshu Kanda <hkanda@fsl.cs.sunysb.edu>
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/lookup.c

index b9b8b0608785f127b2092735e527c7687006c68a..4966e0c38f24c4c3231198cb9ecccce3f764e8ab 100644 (file)
@@ -262,6 +262,19 @@ struct dentry *unionfs_lookup_backend(struct dentry *dentry,
                        continue;
                }
 
+               /*
+                * If we already found at least one positive dentry
+                * (dentry_count is non-zero), then we skip all remaining
+                * positive dentries if their type is a non-dir.  This is
+                * because only directories are allowed to stack on multiple
+                * branches, but we have to skip non-dirs (to avoid, say,
+                * calling readdir on a regular file).
+                */
+               if (!S_ISDIR(lower_dentry->d_inode->i_mode) && dentry_count) {
+                       dput(lower_dentry);
+                       continue;
+               }
+
                /* number of positive dentries */
                dentry_count++;