• Al Viro's avatar
    __follow_mount_rcu(): verify that mount_lock remains unchanged · 20aac6c6
    Al Viro authored
    Validate mount_lock seqcount as soon as we cross into mount in RCU
    mode.  Sure, ->mnt_root is pinned and will remain so until we
    do rcu_read_unlock() anyway, and we will eventually fail to unlazy if
    the mount_lock had been touched, but we might run into a hard error
    (e.g. -ENOENT) before trying to unlazy.  And it's possible to end
    up with RCU pathwalk racing with rename() and umount() in a way
    that would fail with -ENOENT while non-RCU pathwalk would've
    succeeded with any timings.
    
    Once upon a time we hadn't needed that, but analysis had been subtle,
    brittle and went out of window as soon as RENAME_EXCHANGE had been
    added.
    
    It's narrow, hard to hit and won't get you anything other than
    stray -ENOENT that could be arranged in much easier way with the
    same priveleges, but it's a bug all the same.
    
    Cc: stable@kernel.org
    X-sky-is-falling: unlikely
    Fixes: da1ce067 "vfs: add cross-rename"
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    20aac6c6
namei.c 135 KB