• Linus Torvalds's avatar
    proc: move fd symlink i_mode calculations into tid_fd_revalidate() · 30a08bf2
    Linus Torvalds authored
    Instead of doing the i_mode calculations at proc_fd_instantiate() time,
    move them into tid_fd_revalidate(), which is where the other inode state
    (notably uid/gid information) is updated too.
    
    Otherwise we'll end up with stale i_mode information if an fd is re-used
    while the dentry still hangs around.  Not that anything really *cares*
    (symlink permissions don't really matter), but Tetsuo Handa noticed that
    the owner read/write bits don't always match the state of the
    readability of the file descriptor, and we _used_ to get this right a
    long time ago in a galaxy far, far away.
    
    Besides, aside from fixing an ugly detail (that has apparently been this
    way since commit 61a28784: "proc: Remove the hard coded inode
    numbers" in 2006), this removes more lines of code than it adds.  And it
    just makes sense to update i_mode in the same place we update i_uid/gid.
    
    Al Viro correctly points out that we could just do the inode fill in the
    inode iops ->getattr() function instead.  However, that does require
    somewhat slightly more invasive changes, and adds yet *another* lookup
    of the file descriptor.  We need to do the revalidate() for other
    reasons anyway, and have the file descriptor handy, so we might as well
    fill in the information at this point.
    Reported-by: default avatarTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Acked-by: default avatarEric Biederman <ebiederm@xmission.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    30a08bf2
base.c 85.2 KB