commit cda7f6e2cb32f594f35afd34a7cadc186896c6fc
Author: Rachita Kothiyal <[EMAIL PROTECTED]>
Date:   Mon Mar 31 15:46:51 2008 -0400

    Unionfs: ensure consistent lower inodes types
    
    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 <[EMAIL PROTECTED]>
    Signed-off-by: Erez Zadok <[EMAIL PROTECTED]>

diff --git a/fs/unionfs/lookup.c b/fs/unionfs/lookup.c
index b5a390f..17e4f71 100644
--- a/fs/unionfs/lookup.c
+++ b/fs/unionfs/lookup.c
@@ -187,6 +187,20 @@ 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 ((lookupmode != INTERPOSE_PARTIAL) &&
+                   !S_ISDIR(lower_dentry->d_inode->i_mode) && dentry_count) {
+                       dput(lower_dentry);
+                       continue;
+               }
+
                /* number of positive dentries */
                dentry_count++;
 
@@ -213,10 +227,6 @@ struct dentry *unionfs_lookup_backend(struct dentry 
*dentry,
                                continue;
                        if (dentry_count == 1)
                                goto out_positive;
-                       /* This can only happen with mixed D-*-F-* */
-                       BUG_ON(!S_ISDIR(unionfs_lower_dentry(dentry)->
-                                       d_inode->i_mode));
-                       continue;
                }
        }
 
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs

Reply via email to