OSDN Git Service

[PATCH] dcache: avoid race when updating nr_unused count of unused dentries
authorNeilBrown <neilb@cse.unsw.edu.au>
Tue, 29 Nov 2005 12:04:13 +0000 (13:04 +0100)
committerMarcelo Tosatti <marcelo@dmt.cnet>
Fri, 9 Dec 2005 17:35:10 +0000 (15:35 -0200)
 ChangeSet
   2004/05/29 10:58:56-07:00 akpm@osdl.org
   [PATCH] fs/dcache.c: avoid race when updating nr_unused count of unused dentries.

   From: NeilBrown <neilb@cse.unsw.edu.au>

   d_count == 1 is no guarantee that dentry is on the dentry_unused list, even
   if it has just been incremented inside dcache_lock, as dput can decrement
   at any time.

   This test from Greg Banks is much safer, and is more transparently correct.

Cc: Maneesh Soni <maneesh@in.ibm.com>, Dipankar Sarma <dipankar@in.ibm.com>
   From: Greg Banks <gnb@melbourne.sgi.com>
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/dcache.c

index d120eb5..fce3e77 100644 (file)
@@ -221,7 +221,7 @@ int d_invalidate(struct dentry * dentry)
 static inline struct dentry * __dget_locked(struct dentry *dentry)
 {
        atomic_inc(&dentry->d_count);
-       if (atomic_read(&dentry->d_count) == 1) {
+       if (!list_empty(&dentry->d_lru)) {
                dentry_stat.nr_unused--;
                list_del_init(&dentry->d_lru);
        }