Unionfs: simplify stale-inode detection code
authorErez Zadok <ezk@cs.sunysb.edu>
Mon, 28 Jul 2008 06:15:43 +0000 (02:15 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Mon, 28 Jul 2008 06:15:43 +0000 (02:15 -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 919cbdbec049f679b0463dcbb2427e018711cb7c..d602ad70b481b35f3f6bf4690a1212e946873dce 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 7dfacc5aee37af3d0cd356cd38abf8c4e0b2ea1f..a2362065f49616bd57281c0c109bf44fc098b185 100644 (file)
@@ -326,11 +326,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;
@@ -436,7 +434,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);
@@ -445,9 +442,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 cdb4c805db5dfcfd64ea7fa11cfc82575098c34e..594c8c9b2aeea81dbf880ce841bad6f96d5ce8c9 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 12bb4b8ce3009dd1fab5e82ad7523093e25114ee..ee347225196b73c2d85a0b97c440c80505d877b0 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;
@@ -383,6 +382,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);