diff options
author | Peng Tao <tao.peng@primarydata.com> | 2015-06-23 07:51:56 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-06-24 10:17:37 -0400 |
commit | 1b4a4bd82c308aed36f13fff4beb33d3840cfa0e (patch) | |
tree | 40f96e3082a9806234e5fdfe22431d53bb7f28ea | |
parent | be3a5d233922d73f27002ce2767f6ec03c3f473d (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.c | 47 |
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 | ||
14 | static int nfs42_set_rw_stateid(nfs4_stateid *dst, struct file *file, | 19 | static 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 | ||
174 | static void | ||
175 | nfs42_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 | |||
184 | static void | ||
185 | nfs42_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 | |||
197 | static void | ||
198 | nfs42_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 | |||
169 | static const struct rpc_call_ops nfs42_layoutstat_ops = { | 208 | static 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 | ||
172 | int nfs42_proc_layoutstats_generic(struct nfs_server *server, | 214 | int 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)) |