lkml.org 
[lkml]   [2019]   [Dec]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 014/243] exportfs_decode_fh(): negative pinned may become positive without the parent locked
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    [ Upstream commit a2ece088882666e1dc7113744ac912eb161e3f87 ]

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/exportfs/expfs.c | 31 +++++++++++++++++++------------
    1 file changed, 19 insertions(+), 12 deletions(-)

    diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
    index 63707abcbeb3e..808cae6d5f50f 100644
    --- a/fs/exportfs/expfs.c
    +++ b/fs/exportfs/expfs.c
    @@ -517,26 +517,33 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
    * inode is actually connected to the parent.
    */
    err = exportfs_get_name(mnt, target_dir, nbuf, result);
    - if (!err) {
    - inode_lock(target_dir->d_inode);
    - nresult = lookup_one_len(nbuf, target_dir,
    - strlen(nbuf));
    - inode_unlock(target_dir->d_inode);
    - if (!IS_ERR(nresult)) {
    - if (nresult->d_inode) {
    - dput(result);
    - result = nresult;
    - } else
    - dput(nresult);
    - }
    + if (err) {
    + dput(target_dir);
    + goto err_result;
    }

    + inode_lock(target_dir->d_inode);
    + nresult = lookup_one_len(nbuf, target_dir, strlen(nbuf));
    + if (!IS_ERR(nresult)) {
    + if (unlikely(nresult->d_inode != result->d_inode)) {
    + dput(nresult);
    + nresult = ERR_PTR(-ESTALE);
    + }
    + }
    + inode_unlock(target_dir->d_inode);
    /*
    * At this point we are done with the parent, but it's pinned
    * by the child dentry anyway.
    */
    dput(target_dir);

    + if (IS_ERR(nresult)) {
    + err = PTR_ERR(nresult);
    + goto err_result;
    + }
    + dput(result);
    + result = nresult;
    +
    /*
    * And finally make sure the dentry is actually acceptable
    * to NFSD.
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-12-11 16:17    [W:3.216 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site