diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-02-26 14:19:14 -0500 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-03-01 14:51:53 -0500 |
commit | b7e63a1079b266866a732cf699d8c4d61391bbda (patch) | |
tree | 960f747d97a632effa5179788cd08e077a26cd10 /fs/nfs | |
parent | 146d70caaa1b87f64597743429d7da4b8073d0c9 (diff) |
NFSv4: Fix another nfs4_sequence corruptor
nfs4_release_lockowner needs to set the rpc_message reply to point to
the nfs4_sequence_res in order to avoid another Oopsable situation
in nfs41_assign_slot.
Fixes: fbd4bfd1d9d21 (NFS: Add nfs4_sequence calls for RELEASE_LOCKOWNER)
Cc: stable@vger.kernel.org # 3.12+
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 2da6a698b8f7..44e088dc357c 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -5828,8 +5828,7 @@ struct nfs_release_lockowner_data { | |||
5828 | struct nfs4_lock_state *lsp; | 5828 | struct nfs4_lock_state *lsp; |
5829 | struct nfs_server *server; | 5829 | struct nfs_server *server; |
5830 | struct nfs_release_lockowner_args args; | 5830 | struct nfs_release_lockowner_args args; |
5831 | struct nfs4_sequence_args seq_args; | 5831 | struct nfs_release_lockowner_res res; |
5832 | struct nfs4_sequence_res seq_res; | ||
5833 | unsigned long timestamp; | 5832 | unsigned long timestamp; |
5834 | }; | 5833 | }; |
5835 | 5834 | ||
@@ -5837,7 +5836,7 @@ static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata | |||
5837 | { | 5836 | { |
5838 | struct nfs_release_lockowner_data *data = calldata; | 5837 | struct nfs_release_lockowner_data *data = calldata; |
5839 | nfs40_setup_sequence(data->server, | 5838 | nfs40_setup_sequence(data->server, |
5840 | &data->seq_args, &data->seq_res, task); | 5839 | &data->args.seq_args, &data->res.seq_res, task); |
5841 | data->timestamp = jiffies; | 5840 | data->timestamp = jiffies; |
5842 | } | 5841 | } |
5843 | 5842 | ||
@@ -5846,7 +5845,7 @@ static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata) | |||
5846 | struct nfs_release_lockowner_data *data = calldata; | 5845 | struct nfs_release_lockowner_data *data = calldata; |
5847 | struct nfs_server *server = data->server; | 5846 | struct nfs_server *server = data->server; |
5848 | 5847 | ||
5849 | nfs40_sequence_done(task, &data->seq_res); | 5848 | nfs40_sequence_done(task, &data->res.seq_res); |
5850 | 5849 | ||
5851 | switch (task->tk_status) { | 5850 | switch (task->tk_status) { |
5852 | case 0: | 5851 | case 0: |
@@ -5887,7 +5886,6 @@ static int nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_st | |||
5887 | data = kmalloc(sizeof(*data), GFP_NOFS); | 5886 | data = kmalloc(sizeof(*data), GFP_NOFS); |
5888 | if (!data) | 5887 | if (!data) |
5889 | return -ENOMEM; | 5888 | return -ENOMEM; |
5890 | nfs4_init_sequence(&data->seq_args, &data->seq_res, 0); | ||
5891 | data->lsp = lsp; | 5889 | data->lsp = lsp; |
5892 | data->server = server; | 5890 | data->server = server; |
5893 | data->args.lock_owner.clientid = server->nfs_client->cl_clientid; | 5891 | data->args.lock_owner.clientid = server->nfs_client->cl_clientid; |
@@ -5895,6 +5893,8 @@ static int nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_st | |||
5895 | data->args.lock_owner.s_dev = server->s_dev; | 5893 | data->args.lock_owner.s_dev = server->s_dev; |
5896 | 5894 | ||
5897 | msg.rpc_argp = &data->args; | 5895 | msg.rpc_argp = &data->args; |
5896 | msg.rpc_resp = &data->res; | ||
5897 | nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0); | ||
5898 | rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data); | 5898 | rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data); |
5899 | return 0; | 5899 | return 0; |
5900 | } | 5900 | } |