OSDN Git Service

NFSv4: Don't busy wait if NFSv4 session draining is interrupted
authorTrond Myklebust <trondmy@gmail.com>
Sat, 11 Aug 2018 15:52:38 +0000 (11:52 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 13 Aug 2018 21:23:37 +0000 (17:23 -0400)
Catch the ERESTARTSYS error so that it can be processed by the callers.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4state.c

index b6882e0..3df0eb5 100644 (file)
@@ -274,7 +274,7 @@ static int nfs4_drain_slot_tbl(struct nfs4_slot_table *tbl)
 static int nfs4_begin_drain_session(struct nfs_client *clp)
 {
        struct nfs4_session *ses = clp->cl_session;
-       int ret = 0;
+       int ret;
 
        if (clp->cl_slot_tbl)
                return nfs4_drain_slot_tbl(clp->cl_slot_tbl);
@@ -1958,7 +1958,9 @@ static int nfs4_establish_lease(struct nfs_client *clp)
                clp->cl_mvops->reboot_recovery_ops;
        int status;
 
-       nfs4_begin_drain_session(clp);
+       status = nfs4_begin_drain_session(clp);
+       if (status != 0)
+               return status;
        cred = nfs4_get_clid_cred(clp);
        if (cred == NULL)
                return -ENOENT;
@@ -2046,7 +2048,9 @@ static int nfs4_try_migration(struct nfs_server *server, struct rpc_cred *cred)
                goto out;
        }
 
-       nfs4_begin_drain_session(clp);
+       status = nfs4_begin_drain_session(clp);
+       if (status != 0)
+               return status;
 
        status = nfs4_replace_transport(server, locations);
        if (status != 0) {
@@ -2396,7 +2400,9 @@ static int nfs4_reset_session(struct nfs_client *clp)
 
        if (!nfs4_has_session(clp))
                return 0;
-       nfs4_begin_drain_session(clp);
+       status = nfs4_begin_drain_session(clp);
+       if (status != 0)
+               return status;
        cred = nfs4_get_clid_cred(clp);
        status = nfs4_proc_destroy_session(clp->cl_session, cred);
        switch (status) {
@@ -2439,7 +2445,9 @@ static int nfs4_bind_conn_to_session(struct nfs_client *clp)
 
        if (!nfs4_has_session(clp))
                return 0;
-       nfs4_begin_drain_session(clp);
+       ret = nfs4_begin_drain_session(clp);
+       if (ret != 0)
+               return ret;
        cred = nfs4_get_clid_cred(clp);
        ret = nfs4_proc_bind_conn_to_session(clp, cred);
        if (cred)