• Linus Torvalds's avatar
    vfs: clean up __d_lookup_rcu() and dentry_cmp() interfaces · 12f8ad4b
    Linus Torvalds authored
    The calling conventions for __d_lookup_rcu() and dentry_cmp() are
    annoying in different ways, and there is actually one single underlying
    reason for both of the annoyances.
    
    The fundamental reason is that we do the returned dentry sequence number
    check inside __d_lookup_rcu() instead of doing it in the caller.  This
    results in two annoyances:
    
     - __d_lookup_rcu() now not only needs to return the dentry and the
       sequence number that goes along with the lookup, it also needs to
       return the inode pointer that was validated by that sequence number
       check.
    
     - and because we did the sequence number check early (to validate the
       name pointer and length) we also couldn't just pass the dentry itself
       to dentry_cmp(), we had to pass the counted string that contained the
       name.
    
    So that sequence number decision caused two separate ugly calling
    conventions.
    
    Both of these problems would be solved if we just did the sequence
    number check in the caller instead.  There's only one caller, and that
    caller already has to do the sequence number check for the parent
    anyway, so just do that.
    
    That allows us to stop returning the dentry->d_inode in that in-out
    argument (pointer-to-pointer-to-inode), so we can make the inode
    argument just a regular input inode pointer.  The caller can just load
    the inode from dentry->d_inode, and then do the sequence number check
    after that to make sure that it's synchronized with the name we looked
    up.
    
    And it allows us to just pass in the dentry to dentry_cmp(), which is
    what all the callers really wanted.  Sure, dentry_cmp() has to be a bit
    careful about the dentry (which is not stable during RCU lookup), but
    that's actually very simple.
    
    And now that dentry_cmp() can clearly see that the first string argument
    is a dentry, we can use the direct word access for that, instead of the
    careful unaligned zero-padding.  The dentry name is always properly
    aligned, since it is a single path component that is either embedded
    into the dentry itself, or was allocated with kmalloc() (see __d_alloc).
    
    Finally, this also uninlines the nasty slow-case for dentry comparisons:
    that one *does* need to do a sequence number check, since it will call
    in to the low-level filesystems, and we want to give those a stable
    inode pointer and path component length/start arguments.  Doing an extra
    sequence check for that slow case is not a problem, though.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    12f8ad4b
namei.c 84.8 KB