diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-03-01 12:13:34 -0500 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2019-07-09 22:04:09 +0100 |
commit | 30771a3b62c9dd59525ed34268b93d1cef024e7e (patch) | |
tree | 5abc18161ffdc0e17b2c8d9bba66b97e4785edab /fs | |
parent | 5b4f9ccfd4565b156f11aa4dffdb6c69a290b918 (diff) |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 15 |
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: |