lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.4 005/167] NFSv4.1: RECLAIM_COMPLETE must handle NFS4ERR_CONN_NOT_BOUND_TO_SESSION
    Date
    From: Trond Myklebust <trond.myklebust@primarydata.com>

    [ Upstream commit 0048fdd06614a4ea088f9fcad11511956b795698 ]

    If the server returns NFS4ERR_CONN_NOT_BOUND_TO_SESSION because we
    are trunking, then RECLAIM_COMPLETE must handle that by calling
    nfs4_schedule_session_recovery() and then retrying.

    Reported-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    Tested-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    fs/nfs/nfs4proc.c | 7 ++++++-
    fs/nfs/nfs4state.c | 10 +++++++---
    2 files changed, 13 insertions(+), 4 deletions(-)

    diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
    index 8ef6f70c9e25..bcfddfc7a1f4 100644
    --- a/fs/nfs/nfs4proc.c
    +++ b/fs/nfs/nfs4proc.c
    @@ -7670,6 +7670,12 @@ static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nf
    /* fall through */
    case -NFS4ERR_RETRY_UNCACHED_REP:
    return -EAGAIN;
    + case -NFS4ERR_BADSESSION:
    + case -NFS4ERR_DEADSESSION:
    + case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
    + nfs4_schedule_session_recovery(clp->cl_session,
    + task->tk_status);
    + break;
    default:
    nfs4_schedule_lease_recovery(clp);
    }
    @@ -7748,7 +7754,6 @@ static int nfs41_proc_reclaim_complete(struct nfs_client *clp,
    if (status == 0)
    status = task->tk_status;
    rpc_put_task(task);
    - return 0;
    out:
    dprintk("<-- %s status=%d\n", __func__, status);
    return status;
    diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
    index 9a0b219ff74d..83fba40396ae 100644
    --- a/fs/nfs/nfs4state.c
    +++ b/fs/nfs/nfs4state.c
    @@ -1593,13 +1593,14 @@ static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp)
    nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot);
    }

    -static void nfs4_reclaim_complete(struct nfs_client *clp,
    +static int nfs4_reclaim_complete(struct nfs_client *clp,
    const struct nfs4_state_recovery_ops *ops,
    struct rpc_cred *cred)
    {
    /* Notify the server we're done reclaiming our state */
    if (ops->reclaim_complete)
    - (void)ops->reclaim_complete(clp, cred);
    + return ops->reclaim_complete(clp, cred);
    + return 0;
    }

    static void nfs4_clear_reclaim_server(struct nfs_server *server)
    @@ -1646,13 +1647,16 @@ static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp)
    {
    const struct nfs4_state_recovery_ops *ops;
    struct rpc_cred *cred;
    + int err;

    if (!nfs4_state_clear_reclaim_reboot(clp))
    return;
    ops = clp->cl_mvops->reboot_recovery_ops;
    cred = nfs4_get_clid_cred(clp);
    - nfs4_reclaim_complete(clp, ops, cred);
    + err = nfs4_reclaim_complete(clp, ops, cred);
    put_rpccred(cred);
    + if (err == -NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
    + set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state);
    }

    static void nfs_delegation_clear_all(struct nfs_client *clp)
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-19 18:38    [W:4.129 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site