Unionfs: simplify stale-inode detection code
authorErez Zadok <ezk@cs.sunysb.edu>
Mon, 28 Jul 2008 02:26:31 +0000 (22:26 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Mon, 28 Jul 2008 02:26:31 +0000 (22:26 -0400)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/dentry.c
fs/unionfs/lookup.c
fs/unionfs/main.c
fs/unionfs/union.h

index bb50ac72ecae66006dbf8e36b767be240504892c..e6a633225f3d323290593c335f603a85155c42bc 100644 (file)
 
 #include "union.h"
 
+bool is_negative_lower(const struct dentry *dentry)
+{
+       int bindex;
+       struct dentry *lower_dentry;
+
+       BUG_ON(!dentry || dbstart(dentry) < 0);
+       for (bindex = dbstart(dentry); bindex <= dbend(dentry); bindex++) {
+               lower_dentry = unionfs_lower_dentry_idx(dentry, bindex);
+               /* XXX: what if lower_dentry is NULL? */
+               if (lower_dentry && lower_dentry->d_inode)
+                       return false;
+       }
+       return true;
+}
 
 static inline void __dput_lowers(struct dentry *dentry, int start, int end)
 {
@@ -113,7 +127,7 @@ static bool __unionfs_d_revalidate_one(struct dentry *dentry,
                        dentry = result;
                }
 
-               if (unlikely(positive && UNIONFS_I(dentry->d_inode)->stale)) {
+               if (unlikely(positive && is_negative_lower(dentry))) {
                        make_bad_inode(dentry->d_inode);
                        d_drop(dentry);
                        valid = false;
index 988d0bd6d039c93354b31d5ae7ae1ff055c27bcd..497d37d162cbc1d89ad61b158adc3830f096e9c8 100644 (file)
@@ -325,11 +325,9 @@ out_negative:
                goto out;
 
        /* If we've only got negative dentries, then use the leftmost one. */
-       if (lookupmode == INTERPOSE_REVAL) {
-               if (dentry->d_inode)
-                       UNIONFS_I(dentry->d_inode)->stale = 1;
+       if (lookupmode == INTERPOSE_REVAL)
                goto out;
-       }
+
        if (!lower_dir_dentry) {
                err = -ENOENT;
                goto out;
@@ -434,7 +432,6 @@ out:
                     !UNIONFS_I(dentry->d_inode)->lower_inodes)) {
                        unionfs_mntput(dentry->d_sb->s_root, bstart);
                        dput(first_lower_dentry);
-                       UNIONFS_I(dentry->d_inode)->stale = 1;
                }
        }
        kfree(whname);
@@ -443,9 +440,6 @@ out:
                unionfs_unlock_dentry(dentry);
        if (!err && d_interposed)
                return d_interposed;
-       if (dentry->d_inode && UNIONFS_I(dentry->d_inode)->stale &&
-           first_dentry_offset >= 0)
-               unionfs_mntput(dentry->d_sb->s_root, first_dentry_offset);
        return ERR_PTR(err);
 }
 
index 96ca46d44b04a0e6f5d1f0531952b5284c98be11..67a44d710e062a3926433431109a9f02cabb1a79 100644 (file)
@@ -83,25 +83,13 @@ struct dentry *unionfs_interpose(struct dentry *dentry, struct super_block *sb,
 {
        int err = 0;
        struct inode *inode;
-       int is_negative_dentry = 1;
-       int bindex, bstart, bend;
        int need_fill_inode = 1;
        struct dentry *spliced = NULL;
 
        verify_locked(dentry);
 
-       bstart = dbstart(dentry);
-       bend = dbend(dentry);
-
        /* Make sure that we didn't get a negative dentry. */
-       for (bindex = bstart; bindex <= bend; bindex++) {
-               if (unionfs_lower_dentry_idx(dentry, bindex) &&
-                   unionfs_lower_dentry_idx(dentry, bindex)->d_inode) {
-                       is_negative_dentry = 0;
-                       break;
-               }
-       }
-       BUG_ON(is_negative_dentry);
+       BUG_ON(is_negative_lower(dentry));
 
        /*
         * We allocate our new inode below, by calling iget.
index b0f0eda9a96fb13ba0b1445bfbe8d12a086d9857..fde19c1ddadd180fae7b71a157b313b785f699ca 100644 (file)
@@ -109,7 +109,6 @@ struct unionfs_inode_info {
        int bstart;
        int bend;
        atomic_t generation;
-       int stale;
        /* Stuff for readdir over NFS. */
        spinlock_t rdlock;
        struct list_head readdircache;
@@ -384,6 +383,7 @@ extern bool __unionfs_d_revalidate_one_locked(struct dentry *dentry,
                                              bool willwrite);
 extern bool __unionfs_d_revalidate_chain(struct dentry *dentry,
                                         struct nameidata *nd, bool willwrite);
+extern bool is_negative_lower(const struct dentry *dentry);
 extern bool is_newer_lower(const struct dentry *dentry);
 extern void purge_sb_data(struct super_block *sb);