summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-03-01 12:13:34 -0500
committerBen Hutchings <ben@decadent.org.uk>2019-07-09 22:04:09 +0100
commit30771a3b62c9dd59525ed34268b93d1cef024e7e (patch)
tree5abc18161ffdc0e17b2c8d9bba66b97e4785edab
parent5b4f9ccfd4565b156f11aa4dffdb6c69a290b918 (diff)
downloadlinux-stable-30771a3b62c9dd59525ed34268b93d1cef024e7e.tar.gz
linux-stable-30771a3b62c9dd59525ed34268b93d1cef024e7e.tar.bz2
linux-stable-30771a3b62c9dd59525ed34268b93d1cef024e7e.zip
NFSv4.1: Reinitialise sequence results before retransmitting a request
commit c1dffe0bf7f9c3d57d9f237a7cb2a81e62babd2b upstream. If we have to retransmit a request, we should ensure that we reinitialise the sequence results structure, since in the event of a signal we need to treat the request as if it had not been sent. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> [bwh: Backported to 3.16: adjust context] Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--fs/nfs/nfs4proc.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 7f9b6f799aa2..c5168c77479a 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -694,6 +694,13 @@ static int nfs4_sequence_done(struct rpc_task *task,
return nfs41_sequence_done(task, res);
}
+static void nfs41_sequence_res_init(struct nfs4_sequence_res *res)
+{
+ res->sr_timestamp = jiffies;
+ res->sr_status_flags = 0;
+ res->sr_status = 1;
+}
+
int nfs41_setup_sequence(struct nfs4_session *session,
struct nfs4_sequence_args *args,
struct nfs4_sequence_res *res,
@@ -735,15 +742,9 @@ int nfs41_setup_sequence(struct nfs4_session *session,
slot->slot_nr, slot->seq_nr);
res->sr_slot = slot;
- res->sr_timestamp = jiffies;
- res->sr_status_flags = 0;
- /*
- * sr_status is only set in decode_sequence, and so will remain
- * set to 1 if an rpc level failure occurs.
- */
- res->sr_status = 1;
trace_nfs4_setup_sequence(session, args);
out_success:
+ nfs41_sequence_res_init(res);
rpc_call_start(task);
return 0;
out_sleep: