commit 1db0861e149fea2985258b8da9cf9a05a5636ce4
Author: Yiannis Pericleous <[EMAIL PROTECTED]>
Date:   Tue Apr 10 22:10:27 2007 -0400

    fixed a lookup bug

diff --git a/fs/unionfs/lookup.c b/fs/unionfs/lookup.c
index 
e33346106ddeb167b19f06936de4395b50081273..f51a027c4d55b7c43d908778078b11b88a31b3a1
 100644
--- a/fs/unionfs/lookup.c
+++ b/fs/unionfs/lookup.c
@@ -72,6 +72,20 @@ struct dentry *unionfs_lookup_backend(st
        name = dentry->d_name.name;
        namelen = dentry->d_name.len;
 
+       /* check if whiteout here */
+       if (dentry && UNIONFS_D(dentry) && UNIONFS_D(dentry->d_parent)){
+               err = odf_lookup(dentry->d_parent, dentry, 0);
+               if (err)
+                       goto out;
+               
+               /* return negative dentry if a whiteout */
+               if (UNIONFS_D(dentry)->odf_info && 
+                       UNIONFS_D(dentry)->odf_info->whiteout){
+                       bindex = 0; 
+                       goto out_negative;
+               }
+       }
+
        /* Now start the actual lookup procedure. */
        bstart = dbstart(parent_dentry);
        bend = dbend(parent_dentry);
@@ -191,8 +205,12 @@ out_negative:
                nd->dentry = dentry;
                /* FIXME: fix following line for mount point crossing */
                nd->mnt = unionfs_lower_mnt_idx(parent_dentry, bindex);
-               first_hidden_dentry = lookup_one_len_nd(name, hidden_dir_dentry,
-                                                    namelen, nd);
+               hidden_dir_dentry = unionfs_lower_dentry_idx(parent_dentry, 
bindex);
+               if (hidden_dir_dentry && hidden_dir_dentry->d_inode)
+                       first_hidden_dentry = lookup_one_len_nd(name,
+                                       hidden_dir_dentry, namelen, nd);
+               else
+                       first_hidden_dentry = NULL;
                first_dentry_offset = bindex;
                if (IS_ERR(first_hidden_dentry)) {
                        err = PTR_ERR(first_hidden_dentry);
@@ -219,15 +237,7 @@ out_negative:
 /* This part of the code is for positive dentries. */
 out_positive:
        BUG_ON(dentry_count <= 0);
-       
-       /* if what we found is a whiteout then this is really a negative dentry 
*/
-       err = odf_lookup(dentry->d_parent, dentry, 0);
-       if (UNIONFS_D(dentry)->odf_info && 
UNIONFS_D(dentry)->odf_info->whiteout){
-               first_dentry_offset = -1;
-               bindex = 0; /* FIXME: Always create at branch 0? can we 
guarantee that */
-                           /* if there is a wh, then branch 0 has negative 
dentry?    */
-               goto out;
-       }
+       BUG_ON(UNIONFS_D(dentry)->odf_info && 
UNIONFS_D(dentry)->odf_info->whiteout);
 
        /* If we're holding onto the first negative dentry & corresponding
         * vfsmount - throw it out.
diff --git a/fs/unionfs/odf.c b/fs/unionfs/odf.c
index 
867099ba65ff845821b3789b725e686166fdb708..fdd59966dc2738f488bea91b85e61312121aace4
 100644
--- a/fs/unionfs/odf.c
+++ b/fs/unionfs/odf.c
@@ -789,7 +789,7 @@ int odf_lookup(struct dentry *parent, st
                bstart = dbstart(dentry);
        }
 
-       if (lower_dentry && lower_dentry->d_inode &&
+       if (bstart != -1 && lower_dentry && lower_dentry->d_inode &&
                lower_dentry->d_inode->i_nlink > 1 &&
                !S_ISDIR(lower_dentry->d_inode->i_mode) &&
                !(flags & ODF_LOOKUP_WH)) {
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs

Reply via email to