lkml.org 
[lkml]   [2011]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] vfs: fix race in rcu lookup of pruned dentry
    On Sun, Jul 17, 2011 at 04:47:45PM -0700, Hugh Dickins wrote:
    > On Sun, 17 Jul 2011, Linus Torvalds wrote:
    > > On Sun, Jul 17, 2011 at 4:16 PM, Al Viro <viro@zeniv.linux.org.uk> wrote:
    > > >
    > > > OR
    > > >
    > > > ?- keep part of the patch from Hugh, treating negative in RCU mode as
    > > > "need to unlazy".
    > >
    > > No, urgh, that's horrible.
    > >
    > > Not being able to do an RCU lookup of negative dentries would be
    > > really sad. There are some loads where a negative dentry is the
    > > *common* case.
    >
    > Yes, that worried me too.

    Grr... What do you think we need to do when we find a negative dentry in
    RCU lookup? We can
    * check its ->d_seq, to see if it's valid
    * somehow (e.g. with what Linus suggested) try to walk further and
    leave staleness checks for dentries we would encounter later in the walk.

    If it's in the end of pathname, there is no choice at all - we need to
    check ->d_seq of this one. Right? And we do exactly that. If we see
    that it's for real, fine we got ourselves a reference to negative dentry
    and can go ahead. If it's something like stat(2), we'll just do dput()
    and bugger off. Refcounts of everything on the path to it are unaffected,
    no global locks played with...

    If it's in the middle of pathname, we could try to delay the check. And
    what would it buy us? If that dentry was stale, we'd just walk a bit
    deeper. And found a stale one at some later point. And restarted pathname
    resolution in non-lazy mode from the very beginning. If it wasn't stale
    (i.e. real negative dentry), we *do* want -ENOENT and we'll get it as soon
    as unlazy_walk() will check ->d_seq and we plod through the rest of
    do_lookup() to check in walk_component(). We won't redo d_lookup(), lock
    i_mutex, etc.


    \
     
     \ /
      Last update: 2011-07-18 02:27    [W:3.581 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site