dcache: don't need rcu in shrink_dentry_list()
authorMiklos Szeredi <mszeredi@suse.cz>
Fri, 2 May 2014 19:38:39 +0000 (15:38 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 3 May 2014 20:46:16 +0000 (16:46 -0400)
Since now the shrink list is private and nobody can free the dentry while
it is on the shrink list, we can remove RCU protection from this.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/dcache.c

index 2321e1a861f6e62e659e2be3caecd9842d9b09b9..42ae01eefc0767902b4827ef4113199fd6e57a1a 100644 (file)
@@ -796,23 +796,9 @@ static void shrink_dentry_list(struct list_head *list)
 {
        struct dentry *dentry, *parent;
 
-       rcu_read_lock();
-       for (;;) {
-               dentry = list_entry_rcu(list->prev, struct dentry, d_lru);
-               if (&dentry->d_lru == list)
-                       break; /* empty */
-
-               /*
-                * Get the dentry lock, and re-verify that the dentry is
-                * this on the shrinking list. If it is, we know that
-                * DCACHE_SHRINK_LIST and DCACHE_LRU_LIST are set.
-                */
+       while (!list_empty(list)) {
+               dentry = list_entry(list->prev, struct dentry, d_lru);
                spin_lock(&dentry->d_lock);
-               if (dentry != list_entry(list->prev, struct dentry, d_lru)) {
-                       spin_unlock(&dentry->d_lock);
-                       continue;
-               }
-
                /*
                 * The dispose list is isolated and dentries are not accounted
                 * to the LRU here, so we can simply remove it from the list
@@ -828,23 +814,20 @@ static void shrink_dentry_list(struct list_head *list)
                        spin_unlock(&dentry->d_lock);
                        continue;
                }
-               rcu_read_unlock();
 
                parent = dentry_kill(dentry, 0);
                /*
                 * If dentry_kill returns NULL, we have nothing more to do.
                 */
-               if (!parent) {
-                       rcu_read_lock();
+               if (!parent)
                        continue;
-               }
+
                if (unlikely(parent == dentry)) {
                        /*
                         * trylocks have failed and d_lock has been held the
                         * whole time, so it could not have been added to any
                         * other lists. Just add it back to the shrink list.
                         */
-                       rcu_read_lock();
                        d_shrink_add(dentry, list);
                        spin_unlock(&dentry->d_lock);
                        continue;
@@ -858,9 +841,7 @@ static void shrink_dentry_list(struct list_head *list)
                dentry = parent;
                while (dentry && !lockref_put_or_lock(&dentry->d_lockref))
                        dentry = dentry_kill(dentry, 1);
-               rcu_read_lock();
        }
-       rcu_read_unlock();
 }
 
 static enum lru_status