lkml.org 
[lkml]   [2021]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.12 165/363] NFSv4.x: Dont return NFS4ERR_NOMATCHING_LAYOUT if were unmounting
    Date
    From: Trond Myklebust <trond.myklebust@hammerspace.com>

    [ Upstream commit 8926cc8302819be9e67f70409ed001ecb2c924a9 ]

    If the NFS super block is being unmounted, then we currently may end up
    telling the server that we've forgotten the layout while it is actually
    still in use by the client.
    In that case, just assume that the client will soon return the layout
    anyway, and so return NFS4ERR_DELAY in response to the layout recall.

    Fixes: 58ac3e59235f ("NFSv4/pnfs: Clean up nfs_layout_find_inode()")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfs/callback_proc.c | 17 +++++++++--------
    1 file changed, 9 insertions(+), 8 deletions(-)

    diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
    index f7786e00a6a7..ed9d580826f5 100644
    --- a/fs/nfs/callback_proc.c
    +++ b/fs/nfs/callback_proc.c
    @@ -137,12 +137,12 @@ static struct inode *nfs_layout_find_inode_by_stateid(struct nfs_client *clp,
    list_for_each_entry_rcu(lo, &server->layouts, plh_layouts) {
    if (!pnfs_layout_is_valid(lo))
    continue;
    - if (stateid != NULL &&
    - !nfs4_stateid_match_other(stateid, &lo->plh_stateid))
    + if (!nfs4_stateid_match_other(stateid, &lo->plh_stateid))
    continue;
    - if (!nfs_sb_active(server->super))
    - continue;
    - inode = igrab(lo->plh_inode);
    + if (nfs_sb_active(server->super))
    + inode = igrab(lo->plh_inode);
    + else
    + inode = ERR_PTR(-EAGAIN);
    rcu_read_unlock();
    if (inode)
    return inode;
    @@ -176,9 +176,10 @@ static struct inode *nfs_layout_find_inode_by_fh(struct nfs_client *clp,
    continue;
    if (nfsi->layout != lo)
    continue;
    - if (!nfs_sb_active(server->super))
    - continue;
    - inode = igrab(lo->plh_inode);
    + if (nfs_sb_active(server->super))
    + inode = igrab(lo->plh_inode);
    + else
    + inode = ERR_PTR(-EAGAIN);
    rcu_read_unlock();
    if (inode)
    return inode;
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-05-17 16:20    [W:4.045 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site