fs: improve DCACHE_REFERENCED usage
authorNick Piggin <npiggin@suse.de>
Sun, 10 Oct 2010 09:36:24 +0000 (05:36 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 26 Oct 2010 01:26:12 +0000 (21:26 -0400)
dentry referenced bit is only set when installing the dentry back
onto the LRU. However with lazy LRU, the dentry can already be on
the LRU list at dput time, thus missing out on setting the referenced
bit. Fix this.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c

index c37a656802b0f5da26b7bf800f46982834c039d0..1a976d4efbe1c20fc75a776cb79c9b1c48a403b3 100644 (file)
@@ -246,13 +246,16 @@ repeat:
                if (dentry->d_op->d_delete(dentry))
                        goto unhash_it;
        }
+
        /* Unreachable? Get rid of it */
        if (d_unhashed(dentry))
                goto kill_it;
-       if (list_empty(&dentry->d_lru)) {
-               dentry->d_flags |= DCACHE_REFERENCED;
+
+       /* Otherwise leave it cached and ensure it's on the LRU */
+       dentry->d_flags |= DCACHE_REFERENCED;
+       if (list_empty(&dentry->d_lru))
                dentry_lru_add(dentry);
-       }
+
        spin_unlock(&dentry->d_lock);
        spin_unlock(&dcache_lock);
        return;