2 * Copyright (c) 2014 Anna Schumaker <Anna.Schumaker@Netapp.com>
5 #include <linux/sunrpc/sched.h>
7 #include <linux/nfs3.h>
8 #include <linux/nfs4.h>
9 #include <linux/nfs_xdr.h>
10 #include <linux/nfs_fs.h>
15 #include "nfs4session.h"
18 #define NFSDBG_FACILITY NFSDBG_PROC
20 static int _nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
21 struct nfs_lock_context
*lock
, loff_t offset
, loff_t len
)
23 struct inode
*inode
= file_inode(filep
);
24 struct nfs_server
*server
= NFS_SERVER(inode
);
25 struct nfs42_falloc_args args
= {
26 .falloc_fh
= NFS_FH(inode
),
27 .falloc_offset
= offset
,
29 .falloc_bitmask
= server
->cache_consistency_bitmask
,
31 struct nfs42_falloc_res res
= {
32 .falloc_server
= server
,
36 msg
->rpc_argp
= &args
;
39 status
= nfs4_set_rw_stateid(&args
.falloc_stateid
, lock
->open_context
,
44 res
.falloc_fattr
= nfs_alloc_fattr();
45 if (!res
.falloc_fattr
)
48 status
= nfs4_call_sync(server
->client
, server
, msg
,
49 &args
.seq_args
, &res
.seq_res
, 0);
51 status
= nfs_post_op_update_inode(inode
, res
.falloc_fattr
);
53 kfree(res
.falloc_fattr
);
57 static int nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
58 loff_t offset
, loff_t len
)
60 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
61 struct nfs4_exception exception
= { };
62 struct nfs_lock_context
*lock
;
65 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
69 exception
.inode
= file_inode(filep
);
70 exception
.state
= lock
->open_context
->state
;
73 err
= _nfs42_proc_fallocate(msg
, filep
, lock
, offset
, len
);
74 if (err
== -ENOTSUPP
) {
78 err
= nfs4_handle_exception(server
, err
, &exception
);
79 } while (exception
.retry
);
81 nfs_put_lock_context(lock
);
85 int nfs42_proc_allocate(struct file
*filep
, loff_t offset
, loff_t len
)
87 struct rpc_message msg
= {
88 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_ALLOCATE
],
90 struct inode
*inode
= file_inode(filep
);
93 if (!nfs_server_capable(inode
, NFS_CAP_ALLOCATE
))
98 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
99 if (err
== -EOPNOTSUPP
)
100 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_ALLOCATE
;
106 int nfs42_proc_deallocate(struct file
*filep
, loff_t offset
, loff_t len
)
108 struct rpc_message msg
= {
109 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_DEALLOCATE
],
111 struct inode
*inode
= file_inode(filep
);
114 if (!nfs_server_capable(inode
, NFS_CAP_DEALLOCATE
))
118 err
= nfs_sync_inode(inode
);
122 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
124 truncate_pagecache_range(inode
, offset
, (offset
+ len
) -1);
125 if (err
== -EOPNOTSUPP
)
126 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_DEALLOCATE
;
132 static ssize_t
_nfs42_proc_copy(struct file
*src
,
133 struct nfs_lock_context
*src_lock
,
135 struct nfs_lock_context
*dst_lock
,
136 struct nfs42_copy_args
*args
,
137 struct nfs42_copy_res
*res
)
139 struct rpc_message msg
= {
140 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_COPY
],
144 struct inode
*dst_inode
= file_inode(dst
);
145 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
146 loff_t pos_src
= args
->src_pos
;
147 loff_t pos_dst
= args
->dst_pos
;
148 size_t count
= args
->count
;
151 status
= nfs4_set_rw_stateid(&args
->src_stateid
, src_lock
->open_context
,
152 src_lock
, FMODE_READ
);
156 status
= nfs_filemap_write_and_wait_range(file_inode(src
)->i_mapping
,
157 pos_src
, pos_src
+ (loff_t
)count
- 1);
161 status
= nfs4_set_rw_stateid(&args
->dst_stateid
, dst_lock
->open_context
,
162 dst_lock
, FMODE_WRITE
);
166 status
= nfs_sync_inode(dst_inode
);
170 res
->commit_res
.verf
= kzalloc(sizeof(struct nfs_writeverf
), GFP_NOFS
);
171 if (!res
->commit_res
.verf
)
173 status
= nfs4_call_sync(server
->client
, server
, &msg
,
174 &args
->seq_args
, &res
->seq_res
, 0);
175 if (status
== -ENOTSUPP
)
176 server
->caps
&= ~NFS_CAP_COPY
;
180 if (nfs_write_verifier_cmp(&res
->write_res
.verifier
.verifier
,
181 &res
->commit_res
.verf
->verifier
)) {
186 truncate_pagecache_range(dst_inode
, pos_dst
,
187 pos_dst
+ res
->write_res
.count
);
189 status
= res
->write_res
.count
;
191 kfree(res
->commit_res
.verf
);
195 ssize_t
nfs42_proc_copy(struct file
*src
, loff_t pos_src
,
196 struct file
*dst
, loff_t pos_dst
,
199 struct nfs_server
*server
= NFS_SERVER(file_inode(dst
));
200 struct nfs_lock_context
*src_lock
;
201 struct nfs_lock_context
*dst_lock
;
202 struct nfs42_copy_args args
= {
203 .src_fh
= NFS_FH(file_inode(src
)),
205 .dst_fh
= NFS_FH(file_inode(dst
)),
209 struct nfs42_copy_res res
;
210 struct nfs4_exception src_exception
= {
211 .inode
= file_inode(src
),
212 .stateid
= &args
.src_stateid
,
214 struct nfs4_exception dst_exception
= {
215 .inode
= file_inode(dst
),
216 .stateid
= &args
.dst_stateid
,
220 if (!nfs_server_capable(file_inode(dst
), NFS_CAP_COPY
))
223 src_lock
= nfs_get_lock_context(nfs_file_open_context(src
));
224 if (IS_ERR(src_lock
))
225 return PTR_ERR(src_lock
);
227 src_exception
.state
= src_lock
->open_context
->state
;
229 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst
));
230 if (IS_ERR(dst_lock
)) {
231 err
= PTR_ERR(dst_lock
);
232 goto out_put_src_lock
;
235 dst_exception
.state
= dst_lock
->open_context
->state
;
238 inode_lock(file_inode(dst
));
239 err
= _nfs42_proc_copy(src
, src_lock
,
242 inode_unlock(file_inode(dst
));
246 if (err
== -ENOTSUPP
) {
249 } if (err
== -EAGAIN
) {
250 dst_exception
.retry
= 1;
254 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
255 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
258 } while (src_exception
.retry
|| dst_exception
.retry
);
260 nfs_put_lock_context(dst_lock
);
262 nfs_put_lock_context(src_lock
);
266 static loff_t
_nfs42_proc_llseek(struct file
*filep
,
267 struct nfs_lock_context
*lock
, loff_t offset
, int whence
)
269 struct inode
*inode
= file_inode(filep
);
270 struct nfs42_seek_args args
= {
271 .sa_fh
= NFS_FH(inode
),
273 .sa_what
= (whence
== SEEK_HOLE
) ?
274 NFS4_CONTENT_HOLE
: NFS4_CONTENT_DATA
,
276 struct nfs42_seek_res res
;
277 struct rpc_message msg
= {
278 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_SEEK
],
282 struct nfs_server
*server
= NFS_SERVER(inode
);
285 if (!nfs_server_capable(inode
, NFS_CAP_SEEK
))
288 status
= nfs4_set_rw_stateid(&args
.sa_stateid
, lock
->open_context
,
293 status
= nfs_filemap_write_and_wait_range(inode
->i_mapping
,
298 status
= nfs4_call_sync(server
->client
, server
, &msg
,
299 &args
.seq_args
, &res
.seq_res
, 0);
300 if (status
== -ENOTSUPP
)
301 server
->caps
&= ~NFS_CAP_SEEK
;
305 return vfs_setpos(filep
, res
.sr_offset
, inode
->i_sb
->s_maxbytes
);
308 loff_t
nfs42_proc_llseek(struct file
*filep
, loff_t offset
, int whence
)
310 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
311 struct nfs4_exception exception
= { };
312 struct nfs_lock_context
*lock
;
315 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
317 return PTR_ERR(lock
);
319 exception
.inode
= file_inode(filep
);
320 exception
.state
= lock
->open_context
->state
;
323 err
= _nfs42_proc_llseek(filep
, lock
, offset
, whence
);
326 if (err
== -ENOTSUPP
) {
330 err
= nfs4_handle_exception(server
, err
, &exception
);
331 } while (exception
.retry
);
333 nfs_put_lock_context(lock
);
339 nfs42_layoutstat_prepare(struct rpc_task
*task
, void *calldata
)
341 struct nfs42_layoutstat_data
*data
= calldata
;
342 struct inode
*inode
= data
->inode
;
343 struct nfs_server
*server
= NFS_SERVER(inode
);
344 struct pnfs_layout_hdr
*lo
;
346 spin_lock(&inode
->i_lock
);
347 lo
= NFS_I(inode
)->layout
;
348 if (!pnfs_layout_is_valid(lo
)) {
349 spin_unlock(&inode
->i_lock
);
353 nfs4_stateid_copy(&data
->args
.stateid
, &lo
->plh_stateid
);
354 spin_unlock(&inode
->i_lock
);
355 nfs4_setup_sequence(server
->nfs_client
, &data
->args
.seq_args
,
356 &data
->res
.seq_res
, task
);
360 nfs42_layoutstat_done(struct rpc_task
*task
, void *calldata
)
362 struct nfs42_layoutstat_data
*data
= calldata
;
363 struct inode
*inode
= data
->inode
;
364 struct pnfs_layout_hdr
*lo
;
366 if (!nfs4_sequence_done(task
, &data
->res
.seq_res
))
369 switch (task
->tk_status
) {
372 case -NFS4ERR_EXPIRED
:
373 case -NFS4ERR_ADMIN_REVOKED
:
374 case -NFS4ERR_DELEG_REVOKED
:
375 case -NFS4ERR_STALE_STATEID
:
376 case -NFS4ERR_BAD_STATEID
:
377 spin_lock(&inode
->i_lock
);
378 lo
= NFS_I(inode
)->layout
;
379 if (pnfs_layout_is_valid(lo
) &&
380 nfs4_stateid_match(&data
->args
.stateid
,
385 * Mark the bad layout state as invalid, then retry
386 * with the current stateid.
388 pnfs_mark_layout_stateid_invalid(lo
, &head
);
389 spin_unlock(&inode
->i_lock
);
390 pnfs_free_lseg_list(&head
);
391 nfs_commit_inode(inode
, 0);
393 spin_unlock(&inode
->i_lock
);
395 case -NFS4ERR_OLD_STATEID
:
396 spin_lock(&inode
->i_lock
);
397 lo
= NFS_I(inode
)->layout
;
398 if (pnfs_layout_is_valid(lo
) &&
399 nfs4_stateid_match_other(&data
->args
.stateid
,
401 /* Do we need to delay before resending? */
402 if (!nfs4_stateid_is_newer(&lo
->plh_stateid
,
403 &data
->args
.stateid
))
405 rpc_restart_call_prepare(task
);
407 spin_unlock(&inode
->i_lock
);
411 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_LAYOUTSTATS
;
416 nfs42_layoutstat_release(void *calldata
)
418 struct nfs42_layoutstat_data
*data
= calldata
;
419 struct nfs42_layoutstat_devinfo
*devinfo
= data
->args
.devinfo
;
422 for (i
= 0; i
< data
->args
.num_dev
; i
++) {
423 if (devinfo
[i
].ld_private
.ops
&& devinfo
[i
].ld_private
.ops
->free
)
424 devinfo
[i
].ld_private
.ops
->free(&devinfo
[i
].ld_private
);
427 pnfs_put_layout_hdr(NFS_I(data
->args
.inode
)->layout
);
428 smp_mb__before_atomic();
429 clear_bit(NFS_INO_LAYOUTSTATS
, &NFS_I(data
->args
.inode
)->flags
);
430 smp_mb__after_atomic();
431 nfs_iput_and_deactive(data
->inode
);
432 kfree(data
->args
.devinfo
);
436 static const struct rpc_call_ops nfs42_layoutstat_ops
= {
437 .rpc_call_prepare
= nfs42_layoutstat_prepare
,
438 .rpc_call_done
= nfs42_layoutstat_done
,
439 .rpc_release
= nfs42_layoutstat_release
,
442 int nfs42_proc_layoutstats_generic(struct nfs_server
*server
,
443 struct nfs42_layoutstat_data
*data
)
445 struct rpc_message msg
= {
446 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_LAYOUTSTATS
],
447 .rpc_argp
= &data
->args
,
448 .rpc_resp
= &data
->res
,
450 struct rpc_task_setup task_setup
= {
451 .rpc_client
= server
->client
,
453 .callback_ops
= &nfs42_layoutstat_ops
,
454 .callback_data
= data
,
455 .flags
= RPC_TASK_ASYNC
,
457 struct rpc_task
*task
;
459 data
->inode
= nfs_igrab_and_active(data
->args
.inode
);
461 nfs42_layoutstat_release(data
);
464 nfs4_init_sequence(&data
->args
.seq_args
, &data
->res
.seq_res
, 0);
465 task
= rpc_run_task(&task_setup
);
467 return PTR_ERR(task
);
472 static int _nfs42_proc_clone(struct rpc_message
*msg
, struct file
*src_f
,
473 struct file
*dst_f
, struct nfs_lock_context
*src_lock
,
474 struct nfs_lock_context
*dst_lock
, loff_t src_offset
,
475 loff_t dst_offset
, loff_t count
)
477 struct inode
*src_inode
= file_inode(src_f
);
478 struct inode
*dst_inode
= file_inode(dst_f
);
479 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
480 struct nfs42_clone_args args
= {
481 .src_fh
= NFS_FH(src_inode
),
482 .dst_fh
= NFS_FH(dst_inode
),
483 .src_offset
= src_offset
,
484 .dst_offset
= dst_offset
,
486 .dst_bitmask
= server
->cache_consistency_bitmask
,
488 struct nfs42_clone_res res
= {
493 msg
->rpc_argp
= &args
;
494 msg
->rpc_resp
= &res
;
496 status
= nfs4_set_rw_stateid(&args
.src_stateid
, src_lock
->open_context
,
497 src_lock
, FMODE_READ
);
501 status
= nfs4_set_rw_stateid(&args
.dst_stateid
, dst_lock
->open_context
,
502 dst_lock
, FMODE_WRITE
);
506 res
.dst_fattr
= nfs_alloc_fattr();
510 status
= nfs4_call_sync(server
->client
, server
, msg
,
511 &args
.seq_args
, &res
.seq_res
, 0);
513 status
= nfs_post_op_update_inode(dst_inode
, res
.dst_fattr
);
515 kfree(res
.dst_fattr
);
519 int nfs42_proc_clone(struct file
*src_f
, struct file
*dst_f
,
520 loff_t src_offset
, loff_t dst_offset
, loff_t count
)
522 struct rpc_message msg
= {
523 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_CLONE
],
525 struct inode
*inode
= file_inode(src_f
);
526 struct nfs_server
*server
= NFS_SERVER(file_inode(src_f
));
527 struct nfs_lock_context
*src_lock
;
528 struct nfs_lock_context
*dst_lock
;
529 struct nfs4_exception src_exception
= { };
530 struct nfs4_exception dst_exception
= { };
533 if (!nfs_server_capable(inode
, NFS_CAP_CLONE
))
536 src_lock
= nfs_get_lock_context(nfs_file_open_context(src_f
));
537 if (IS_ERR(src_lock
))
538 return PTR_ERR(src_lock
);
540 src_exception
.inode
= file_inode(src_f
);
541 src_exception
.state
= src_lock
->open_context
->state
;
543 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst_f
));
544 if (IS_ERR(dst_lock
)) {
545 err
= PTR_ERR(dst_lock
);
546 goto out_put_src_lock
;
549 dst_exception
.inode
= file_inode(dst_f
);
550 dst_exception
.state
= dst_lock
->open_context
->state
;
553 err
= _nfs42_proc_clone(&msg
, src_f
, dst_f
, src_lock
, dst_lock
,
554 src_offset
, dst_offset
, count
);
555 if (err
== -ENOTSUPP
|| err
== -EOPNOTSUPP
) {
556 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_CLONE
;
561 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
562 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
565 } while (src_exception
.retry
|| dst_exception
.retry
);
567 nfs_put_lock_context(dst_lock
);
569 nfs_put_lock_context(src_lock
);