aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2014-02-26 14:19:14 -0500
committerTrond Myklebust <trond.myklebust@primarydata.com>2014-03-01 14:51:53 -0500
commitb7e63a1079b266866a732cf699d8c4d61391bbda (patch)
tree960f747d97a632effa5179788cd08e077a26cd10 /fs/nfs
parent146d70caaa1b87f64597743429d7da4b8073d0c9 (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.c10
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}