diff options
Diffstat (limited to 'fs/nfs/nfs42proc.c')
| -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)) |
