aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeng Tao <tao.peng@primarydata.com>2015-06-23 07:51:56 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2015-06-24 10:17:37 -0400
commit1b4a4bd82c308aed36f13fff4beb33d3840cfa0e (patch)
tree40f96e3082a9806234e5fdfe22431d53bb7f28ea
parentbe3a5d233922d73f27002ce2767f6ec03c3f473d (diff)
pNFS: fill in nfs42_layoutstat_ops
Reviewed-by: Jeff Layton <jeff.layton@primarydata.com> Signed-off-by: Peng Tao <tao.peng@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r--fs/nfs/nfs42proc.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
index ac929685350b..a0530418255f 100644
--- a/fs/nfs/nfs42proc.c
+++ b/fs/nfs/nfs42proc.c
@@ -10,6 +10,11 @@
10#include <linux/nfs_fs.h> 10#include <linux/nfs_fs.h>
11#include "nfs4_fs.h" 11#include "nfs4_fs.h"
12#include "nfs42.h" 12#include "nfs42.h"
13#include "iostat.h"
14#include "pnfs.h"
15#include "internal.h"
16
17#define NFSDBG_FACILITY NFSDBG_PNFS
13 18
14static int nfs42_set_rw_stateid(nfs4_stateid *dst, struct file *file, 19static int nfs42_set_rw_stateid(nfs4_stateid *dst, struct file *file,
15 fmode_t fmode) 20 fmode_t fmode)
@@ -166,7 +171,44 @@ loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence)
166 return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes); 171 return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes);
167} 172}
168 173
174static void
175nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata)
176{
177 struct nfs42_layoutstat_data *data = calldata;
178 struct nfs_server *server = NFS_SERVER(data->args.inode);
179
180 nfs41_setup_sequence(nfs4_get_session(server), &data->args.seq_args,
181 &data->res.seq_res, task);
182}
183
184static void
185nfs42_layoutstat_done(struct rpc_task *task, void *calldata)
186{
187 struct nfs42_layoutstat_data *data = calldata;
188
189 if (!nfs4_sequence_done(task, &data->res.seq_res))
190 return;
191
192 /* well, we don't care about errors at all! */
193 if (task->tk_status)
194 dprintk("%s server returns %d\n", __func__, task->tk_status);
195}
196
197static void
198nfs42_layoutstat_release(void *calldata)
199{
200 struct nfs42_layoutstat_data *data = calldata;
201
202 pnfs_put_layout_hdr(NFS_I(data->args.inode)->layout);
203 nfs_iput_and_deactive(data->inode);
204 kfree(data->args.devinfo);
205 kfree(data);
206}
207
169static const struct rpc_call_ops nfs42_layoutstat_ops = { 208static const struct rpc_call_ops nfs42_layoutstat_ops = {
209 .rpc_call_prepare = nfs42_layoutstat_prepare,
210 .rpc_call_done = nfs42_layoutstat_done,
211 .rpc_release = nfs42_layoutstat_release,
170}; 212};
171 213
172int nfs42_proc_layoutstats_generic(struct nfs_server *server, 214int nfs42_proc_layoutstats_generic(struct nfs_server *server,
@@ -186,6 +228,11 @@ int nfs42_proc_layoutstats_generic(struct nfs_server *server,
186 }; 228 };
187 struct rpc_task *task; 229 struct rpc_task *task;
188 230
231 data->inode = nfs_igrab_and_active(data->args.inode);
232 if (!data->inode) {
233 nfs42_layoutstat_release(data);
234 return -EAGAIN;
235 }
189 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0); 236 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0);
190 task = rpc_run_task(&task_setup); 237 task = rpc_run_task(&task_setup);
191 if (IS_ERR(task)) 238 if (IS_ERR(task))