Messages in this thread | | | Date | Wed, 30 Apr 2014 17:18:23 -0700 | Subject | Re: dcache shrink list corruption? | From | Linus Torvalds <> |
| |
On Wed, Apr 30, 2014 at 4:43 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: > > OK, done and force-pushed. Should propagate in a few...
That made it more obvious how the DCACHE_MAY_FREE case ends up working. And in particular, mind rewriting this:
if (dentry->d_flags & DCACHE_MAY_FREE) { spin_unlock(&dentry->d_lock); dentry_free(dentry); } else { spin_unlock(&dentry->d_lock); } return parent;
as just
bool free = dentry->d_flags & DCACHE_MAY_FREE; spin_unlock(&dentry->d_lock); if (free) dentry_free(dentry); return parent;
instead? In fact, I get the feeling that the other case later on really fits the same model:
spin_lock(&dentry->d_lock); if (dentry->d_flags & DCACHE_SHRINK_LIST) { dentry->d_flags |= DCACHE_MAY_FREE; spin_unlock(&dentry->d_lock); } else { spin_unlock(&dentry->d_lock); dentry_free(dentry); }
ends up really being better as
spin_lock(&dentry->d_lock); free = 1; if (dentry->d_flags & DCACHE_SHRINK_LIST) { dentry->d_flags |= DCACHE_MAY_FREE; free = 0; } spin_unlock(&dentry->d_lock); if (free) dentry_free(dentry); return parent;
and then suddenly it looks like we have a common exit sequence from that dentry_kill() function, no?
(The earlier "unlock_on_failure" exit case is altogether a different case).
I dunno. Maybe not a big deal, but one reason I prefer doing that "free" flag is because I really tend to prefer the simple case of lock-unlock pairing cleanly at the same level. NOT the pattern where you have one lock at one indentation level, paired with multiple unlocks for all the different cases.
Linus
| |