1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2014 Anna Schumaker <Anna.Schumaker@Netapp.com>
6 #include <linux/sunrpc/sched.h>
8 #include <linux/nfs3.h>
9 #include <linux/nfs4.h>
10 #include <linux/nfs_xdr.h>
11 #include <linux/nfs_fs.h>
16 #include "nfs4session.h"
19 #define NFSDBG_FACILITY NFSDBG_PROC
20 static int nfs42_do_offload_cancel_async(struct file
*dst
, nfs4_stateid
*std
);
22 static int _nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
23 struct nfs_lock_context
*lock
, loff_t offset
, loff_t len
)
25 struct inode
*inode
= file_inode(filep
);
26 struct nfs_server
*server
= NFS_SERVER(inode
);
27 struct nfs42_falloc_args args
= {
28 .falloc_fh
= NFS_FH(inode
),
29 .falloc_offset
= offset
,
31 .falloc_bitmask
= server
->cache_consistency_bitmask
,
33 struct nfs42_falloc_res res
= {
34 .falloc_server
= server
,
38 msg
->rpc_argp
= &args
;
41 status
= nfs4_set_rw_stateid(&args
.falloc_stateid
, lock
->open_context
,
46 res
.falloc_fattr
= nfs_alloc_fattr();
47 if (!res
.falloc_fattr
)
50 status
= nfs4_call_sync(server
->client
, server
, msg
,
51 &args
.seq_args
, &res
.seq_res
, 0);
53 status
= nfs_post_op_update_inode(inode
, res
.falloc_fattr
);
55 kfree(res
.falloc_fattr
);
59 static int nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
60 loff_t offset
, loff_t len
)
62 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
63 struct nfs4_exception exception
= { };
64 struct nfs_lock_context
*lock
;
67 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
71 exception
.inode
= file_inode(filep
);
72 exception
.state
= lock
->open_context
->state
;
75 err
= _nfs42_proc_fallocate(msg
, filep
, lock
, offset
, len
);
76 if (err
== -ENOTSUPP
) {
80 err
= nfs4_handle_exception(server
, err
, &exception
);
81 } while (exception
.retry
);
83 nfs_put_lock_context(lock
);
87 int nfs42_proc_allocate(struct file
*filep
, loff_t offset
, loff_t len
)
89 struct rpc_message msg
= {
90 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_ALLOCATE
],
92 struct inode
*inode
= file_inode(filep
);
95 if (!nfs_server_capable(inode
, NFS_CAP_ALLOCATE
))
100 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
101 if (err
== -EOPNOTSUPP
)
102 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_ALLOCATE
;
108 int nfs42_proc_deallocate(struct file
*filep
, loff_t offset
, loff_t len
)
110 struct rpc_message msg
= {
111 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_DEALLOCATE
],
113 struct inode
*inode
= file_inode(filep
);
116 if (!nfs_server_capable(inode
, NFS_CAP_DEALLOCATE
))
120 err
= nfs_sync_inode(inode
);
124 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
126 truncate_pagecache_range(inode
, offset
, (offset
+ len
) -1);
127 if (err
== -EOPNOTSUPP
)
128 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_DEALLOCATE
;
134 static int handle_async_copy(struct nfs42_copy_res
*res
,
135 struct nfs_server
*server
,
138 nfs4_stateid
*src_stateid
)
140 struct nfs4_copy_state
*copy
, *tmp_copy
;
141 int status
= NFS4_OK
;
142 bool found_pending
= false;
143 struct nfs_open_context
*ctx
= nfs_file_open_context(dst
);
145 copy
= kzalloc(sizeof(struct nfs4_copy_state
), GFP_NOFS
);
149 spin_lock(&server
->nfs_client
->cl_lock
);
150 list_for_each_entry(tmp_copy
, &server
->nfs_client
->pending_cb_stateids
,
152 if (memcmp(&res
->write_res
.stateid
, &tmp_copy
->stateid
,
155 found_pending
= true;
156 list_del(&tmp_copy
->copies
);
160 spin_unlock(&server
->nfs_client
->cl_lock
);
166 memcpy(©
->stateid
, &res
->write_res
.stateid
, NFS4_STATEID_SIZE
);
167 init_completion(©
->completion
);
168 copy
->parent_state
= ctx
->state
;
170 list_add_tail(©
->copies
, &server
->ss_copies
);
171 spin_unlock(&server
->nfs_client
->cl_lock
);
173 status
= wait_for_completion_interruptible(©
->completion
);
174 spin_lock(&server
->nfs_client
->cl_lock
);
175 list_del_init(©
->copies
);
176 spin_unlock(&server
->nfs_client
->cl_lock
);
177 if (status
== -ERESTARTSYS
) {
179 } else if (copy
->flags
) {
184 res
->write_res
.count
= copy
->count
;
185 memcpy(&res
->write_res
.verifier
, ©
->verf
, sizeof(copy
->verf
));
186 status
= -copy
->error
;
191 nfs42_do_offload_cancel_async(dst
, ©
->stateid
);
196 static int process_copy_commit(struct file
*dst
, loff_t pos_dst
,
197 struct nfs42_copy_res
*res
)
199 struct nfs_commitres cres
;
200 int status
= -ENOMEM
;
202 cres
.verf
= kzalloc(sizeof(struct nfs_writeverf
), GFP_NOFS
);
206 status
= nfs4_proc_commit(dst
, pos_dst
, res
->write_res
.count
, &cres
);
209 if (nfs_write_verifier_cmp(&res
->write_res
.verifier
.verifier
,
210 &cres
.verf
->verifier
)) {
211 dprintk("commit verf differs from copy verf\n");
220 static ssize_t
_nfs42_proc_copy(struct file
*src
,
221 struct nfs_lock_context
*src_lock
,
223 struct nfs_lock_context
*dst_lock
,
224 struct nfs42_copy_args
*args
,
225 struct nfs42_copy_res
*res
)
227 struct rpc_message msg
= {
228 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_COPY
],
232 struct inode
*dst_inode
= file_inode(dst
);
233 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
234 loff_t pos_src
= args
->src_pos
;
235 loff_t pos_dst
= args
->dst_pos
;
236 size_t count
= args
->count
;
239 status
= nfs4_set_rw_stateid(&args
->src_stateid
, src_lock
->open_context
,
240 src_lock
, FMODE_READ
);
244 status
= nfs_filemap_write_and_wait_range(file_inode(src
)->i_mapping
,
245 pos_src
, pos_src
+ (loff_t
)count
- 1);
249 status
= nfs4_set_rw_stateid(&args
->dst_stateid
, dst_lock
->open_context
,
250 dst_lock
, FMODE_WRITE
);
254 status
= nfs_sync_inode(dst_inode
);
258 res
->commit_res
.verf
= NULL
;
260 res
->commit_res
.verf
=
261 kzalloc(sizeof(struct nfs_writeverf
), GFP_NOFS
);
262 if (!res
->commit_res
.verf
)
265 set_bit(NFS_CLNT_DST_SSC_COPY_STATE
,
266 &dst_lock
->open_context
->state
->flags
);
268 status
= nfs4_call_sync(server
->client
, server
, &msg
,
269 &args
->seq_args
, &res
->seq_res
, 0);
270 if (status
== -ENOTSUPP
)
271 server
->caps
&= ~NFS_CAP_COPY
;
276 nfs_write_verifier_cmp(&res
->write_res
.verifier
.verifier
,
277 &res
->commit_res
.verf
->verifier
)) {
282 if (!res
->synchronous
) {
283 status
= handle_async_copy(res
, server
, src
, dst
,
289 if ((!res
->synchronous
|| !args
->sync
) &&
290 res
->write_res
.verifier
.committed
!= NFS_FILE_SYNC
) {
291 status
= process_copy_commit(dst
, pos_dst
, res
);
296 truncate_pagecache_range(dst_inode
, pos_dst
,
297 pos_dst
+ res
->write_res
.count
);
299 status
= res
->write_res
.count
;
302 kfree(res
->commit_res
.verf
);
306 ssize_t
nfs42_proc_copy(struct file
*src
, loff_t pos_src
,
307 struct file
*dst
, loff_t pos_dst
,
310 struct nfs_server
*server
= NFS_SERVER(file_inode(dst
));
311 struct nfs_lock_context
*src_lock
;
312 struct nfs_lock_context
*dst_lock
;
313 struct nfs42_copy_args args
= {
314 .src_fh
= NFS_FH(file_inode(src
)),
316 .dst_fh
= NFS_FH(file_inode(dst
)),
321 struct nfs42_copy_res res
;
322 struct nfs4_exception src_exception
= {
323 .inode
= file_inode(src
),
324 .stateid
= &args
.src_stateid
,
326 struct nfs4_exception dst_exception
= {
327 .inode
= file_inode(dst
),
328 .stateid
= &args
.dst_stateid
,
332 if (!nfs_server_capable(file_inode(dst
), NFS_CAP_COPY
))
335 src_lock
= nfs_get_lock_context(nfs_file_open_context(src
));
336 if (IS_ERR(src_lock
))
337 return PTR_ERR(src_lock
);
339 src_exception
.state
= src_lock
->open_context
->state
;
341 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst
));
342 if (IS_ERR(dst_lock
)) {
343 err
= PTR_ERR(dst_lock
);
344 goto out_put_src_lock
;
347 dst_exception
.state
= dst_lock
->open_context
->state
;
350 inode_lock(file_inode(dst
));
351 err
= _nfs42_proc_copy(src
, src_lock
,
354 inode_unlock(file_inode(dst
));
358 if (err
== -ENOTSUPP
) {
361 } else if (err
== -EAGAIN
) {
362 dst_exception
.retry
= 1;
364 } else if (err
== -NFS4ERR_OFFLOAD_NO_REQS
&& !args
.sync
) {
366 dst_exception
.retry
= 1;
370 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
371 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
374 } while (src_exception
.retry
|| dst_exception
.retry
);
376 nfs_put_lock_context(dst_lock
);
378 nfs_put_lock_context(src_lock
);
382 struct nfs42_offloadcancel_data
{
383 struct nfs_server
*seq_server
;
384 struct nfs42_offload_status_args args
;
385 struct nfs42_offload_status_res res
;
388 static void nfs42_offload_cancel_prepare(struct rpc_task
*task
, void *calldata
)
390 struct nfs42_offloadcancel_data
*data
= calldata
;
392 nfs4_setup_sequence(data
->seq_server
->nfs_client
,
393 &data
->args
.osa_seq_args
,
394 &data
->res
.osr_seq_res
, task
);
397 static void nfs42_offload_cancel_done(struct rpc_task
*task
, void *calldata
)
399 struct nfs42_offloadcancel_data
*data
= calldata
;
401 nfs41_sequence_done(task
, &data
->res
.osr_seq_res
);
402 if (task
->tk_status
&&
403 nfs4_async_handle_error(task
, data
->seq_server
, NULL
,
405 rpc_restart_call_prepare(task
);
408 static void nfs42_free_offloadcancel_data(void *data
)
413 static const struct rpc_call_ops nfs42_offload_cancel_ops
= {
414 .rpc_call_prepare
= nfs42_offload_cancel_prepare
,
415 .rpc_call_done
= nfs42_offload_cancel_done
,
416 .rpc_release
= nfs42_free_offloadcancel_data
,
419 static int nfs42_do_offload_cancel_async(struct file
*dst
,
420 nfs4_stateid
*stateid
)
422 struct nfs_server
*dst_server
= NFS_SERVER(file_inode(dst
));
423 struct nfs42_offloadcancel_data
*data
= NULL
;
424 struct nfs_open_context
*ctx
= nfs_file_open_context(dst
);
425 struct rpc_task
*task
;
426 struct rpc_message msg
= {
427 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_OFFLOAD_CANCEL
],
428 .rpc_cred
= ctx
->cred
,
430 struct rpc_task_setup task_setup_data
= {
431 .rpc_client
= dst_server
->client
,
433 .callback_ops
= &nfs42_offload_cancel_ops
,
434 .workqueue
= nfsiod_workqueue
,
435 .flags
= RPC_TASK_ASYNC
,
439 if (!(dst_server
->caps
& NFS_CAP_OFFLOAD_CANCEL
))
442 data
= kzalloc(sizeof(struct nfs42_offloadcancel_data
), GFP_NOFS
);
446 data
->seq_server
= dst_server
;
447 data
->args
.osa_src_fh
= NFS_FH(file_inode(dst
));
448 memcpy(&data
->args
.osa_stateid
, stateid
,
449 sizeof(data
->args
.osa_stateid
));
450 msg
.rpc_argp
= &data
->args
;
451 msg
.rpc_resp
= &data
->res
;
452 task_setup_data
.callback_data
= data
;
453 nfs4_init_sequence(&data
->args
.osa_seq_args
, &data
->res
.osr_seq_res
,
455 task
= rpc_run_task(&task_setup_data
);
457 return PTR_ERR(task
);
458 status
= rpc_wait_for_completion_task(task
);
459 if (status
== -ENOTSUPP
)
460 dst_server
->caps
&= ~NFS_CAP_OFFLOAD_CANCEL
;
465 static loff_t
_nfs42_proc_llseek(struct file
*filep
,
466 struct nfs_lock_context
*lock
, loff_t offset
, int whence
)
468 struct inode
*inode
= file_inode(filep
);
469 struct nfs42_seek_args args
= {
470 .sa_fh
= NFS_FH(inode
),
472 .sa_what
= (whence
== SEEK_HOLE
) ?
473 NFS4_CONTENT_HOLE
: NFS4_CONTENT_DATA
,
475 struct nfs42_seek_res res
;
476 struct rpc_message msg
= {
477 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_SEEK
],
481 struct nfs_server
*server
= NFS_SERVER(inode
);
484 if (!nfs_server_capable(inode
, NFS_CAP_SEEK
))
487 status
= nfs4_set_rw_stateid(&args
.sa_stateid
, lock
->open_context
,
492 status
= nfs_filemap_write_and_wait_range(inode
->i_mapping
,
497 status
= nfs4_call_sync(server
->client
, server
, &msg
,
498 &args
.seq_args
, &res
.seq_res
, 0);
499 if (status
== -ENOTSUPP
)
500 server
->caps
&= ~NFS_CAP_SEEK
;
504 return vfs_setpos(filep
, res
.sr_offset
, inode
->i_sb
->s_maxbytes
);
507 loff_t
nfs42_proc_llseek(struct file
*filep
, loff_t offset
, int whence
)
509 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
510 struct nfs4_exception exception
= { };
511 struct nfs_lock_context
*lock
;
514 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
516 return PTR_ERR(lock
);
518 exception
.inode
= file_inode(filep
);
519 exception
.state
= lock
->open_context
->state
;
522 err
= _nfs42_proc_llseek(filep
, lock
, offset
, whence
);
525 if (err
== -ENOTSUPP
) {
529 err
= nfs4_handle_exception(server
, err
, &exception
);
530 } while (exception
.retry
);
532 nfs_put_lock_context(lock
);
538 nfs42_layoutstat_prepare(struct rpc_task
*task
, void *calldata
)
540 struct nfs42_layoutstat_data
*data
= calldata
;
541 struct inode
*inode
= data
->inode
;
542 struct nfs_server
*server
= NFS_SERVER(inode
);
543 struct pnfs_layout_hdr
*lo
;
545 spin_lock(&inode
->i_lock
);
546 lo
= NFS_I(inode
)->layout
;
547 if (!pnfs_layout_is_valid(lo
)) {
548 spin_unlock(&inode
->i_lock
);
552 nfs4_stateid_copy(&data
->args
.stateid
, &lo
->plh_stateid
);
553 spin_unlock(&inode
->i_lock
);
554 nfs4_setup_sequence(server
->nfs_client
, &data
->args
.seq_args
,
555 &data
->res
.seq_res
, task
);
559 nfs42_layoutstat_done(struct rpc_task
*task
, void *calldata
)
561 struct nfs42_layoutstat_data
*data
= calldata
;
562 struct inode
*inode
= data
->inode
;
563 struct pnfs_layout_hdr
*lo
;
565 if (!nfs4_sequence_done(task
, &data
->res
.seq_res
))
568 switch (task
->tk_status
) {
571 case -NFS4ERR_BADHANDLE
:
573 pnfs_destroy_layout(NFS_I(inode
));
575 case -NFS4ERR_EXPIRED
:
576 case -NFS4ERR_ADMIN_REVOKED
:
577 case -NFS4ERR_DELEG_REVOKED
:
578 case -NFS4ERR_STALE_STATEID
:
579 case -NFS4ERR_BAD_STATEID
:
580 spin_lock(&inode
->i_lock
);
581 lo
= NFS_I(inode
)->layout
;
582 if (pnfs_layout_is_valid(lo
) &&
583 nfs4_stateid_match(&data
->args
.stateid
,
588 * Mark the bad layout state as invalid, then retry
589 * with the current stateid.
591 pnfs_mark_layout_stateid_invalid(lo
, &head
);
592 spin_unlock(&inode
->i_lock
);
593 pnfs_free_lseg_list(&head
);
594 nfs_commit_inode(inode
, 0);
596 spin_unlock(&inode
->i_lock
);
598 case -NFS4ERR_OLD_STATEID
:
599 spin_lock(&inode
->i_lock
);
600 lo
= NFS_I(inode
)->layout
;
601 if (pnfs_layout_is_valid(lo
) &&
602 nfs4_stateid_match_other(&data
->args
.stateid
,
604 /* Do we need to delay before resending? */
605 if (!nfs4_stateid_is_newer(&lo
->plh_stateid
,
606 &data
->args
.stateid
))
608 rpc_restart_call_prepare(task
);
610 spin_unlock(&inode
->i_lock
);
614 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_LAYOUTSTATS
;
619 nfs42_layoutstat_release(void *calldata
)
621 struct nfs42_layoutstat_data
*data
= calldata
;
622 struct nfs42_layoutstat_devinfo
*devinfo
= data
->args
.devinfo
;
625 for (i
= 0; i
< data
->args
.num_dev
; i
++) {
626 if (devinfo
[i
].ld_private
.ops
&& devinfo
[i
].ld_private
.ops
->free
)
627 devinfo
[i
].ld_private
.ops
->free(&devinfo
[i
].ld_private
);
630 pnfs_put_layout_hdr(NFS_I(data
->args
.inode
)->layout
);
631 smp_mb__before_atomic();
632 clear_bit(NFS_INO_LAYOUTSTATS
, &NFS_I(data
->args
.inode
)->flags
);
633 smp_mb__after_atomic();
634 nfs_iput_and_deactive(data
->inode
);
635 kfree(data
->args
.devinfo
);
639 static const struct rpc_call_ops nfs42_layoutstat_ops
= {
640 .rpc_call_prepare
= nfs42_layoutstat_prepare
,
641 .rpc_call_done
= nfs42_layoutstat_done
,
642 .rpc_release
= nfs42_layoutstat_release
,
645 int nfs42_proc_layoutstats_generic(struct nfs_server
*server
,
646 struct nfs42_layoutstat_data
*data
)
648 struct rpc_message msg
= {
649 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_LAYOUTSTATS
],
650 .rpc_argp
= &data
->args
,
651 .rpc_resp
= &data
->res
,
653 struct rpc_task_setup task_setup
= {
654 .rpc_client
= server
->client
,
656 .callback_ops
= &nfs42_layoutstat_ops
,
657 .callback_data
= data
,
658 .flags
= RPC_TASK_ASYNC
,
660 struct rpc_task
*task
;
662 data
->inode
= nfs_igrab_and_active(data
->args
.inode
);
664 nfs42_layoutstat_release(data
);
667 nfs4_init_sequence(&data
->args
.seq_args
, &data
->res
.seq_res
, 0, 0);
668 task
= rpc_run_task(&task_setup
);
670 return PTR_ERR(task
);
675 static int _nfs42_proc_clone(struct rpc_message
*msg
, struct file
*src_f
,
676 struct file
*dst_f
, struct nfs_lock_context
*src_lock
,
677 struct nfs_lock_context
*dst_lock
, loff_t src_offset
,
678 loff_t dst_offset
, loff_t count
)
680 struct inode
*src_inode
= file_inode(src_f
);
681 struct inode
*dst_inode
= file_inode(dst_f
);
682 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
683 struct nfs42_clone_args args
= {
684 .src_fh
= NFS_FH(src_inode
),
685 .dst_fh
= NFS_FH(dst_inode
),
686 .src_offset
= src_offset
,
687 .dst_offset
= dst_offset
,
689 .dst_bitmask
= server
->cache_consistency_bitmask
,
691 struct nfs42_clone_res res
= {
696 msg
->rpc_argp
= &args
;
697 msg
->rpc_resp
= &res
;
699 status
= nfs4_set_rw_stateid(&args
.src_stateid
, src_lock
->open_context
,
700 src_lock
, FMODE_READ
);
704 status
= nfs4_set_rw_stateid(&args
.dst_stateid
, dst_lock
->open_context
,
705 dst_lock
, FMODE_WRITE
);
709 res
.dst_fattr
= nfs_alloc_fattr();
713 status
= nfs4_call_sync(server
->client
, server
, msg
,
714 &args
.seq_args
, &res
.seq_res
, 0);
716 status
= nfs_post_op_update_inode(dst_inode
, res
.dst_fattr
);
718 kfree(res
.dst_fattr
);
722 int nfs42_proc_clone(struct file
*src_f
, struct file
*dst_f
,
723 loff_t src_offset
, loff_t dst_offset
, loff_t count
)
725 struct rpc_message msg
= {
726 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_CLONE
],
728 struct inode
*inode
= file_inode(src_f
);
729 struct nfs_server
*server
= NFS_SERVER(file_inode(src_f
));
730 struct nfs_lock_context
*src_lock
;
731 struct nfs_lock_context
*dst_lock
;
732 struct nfs4_exception src_exception
= { };
733 struct nfs4_exception dst_exception
= { };
736 if (!nfs_server_capable(inode
, NFS_CAP_CLONE
))
739 src_lock
= nfs_get_lock_context(nfs_file_open_context(src_f
));
740 if (IS_ERR(src_lock
))
741 return PTR_ERR(src_lock
);
743 src_exception
.inode
= file_inode(src_f
);
744 src_exception
.state
= src_lock
->open_context
->state
;
746 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst_f
));
747 if (IS_ERR(dst_lock
)) {
748 err
= PTR_ERR(dst_lock
);
749 goto out_put_src_lock
;
752 dst_exception
.inode
= file_inode(dst_f
);
753 dst_exception
.state
= dst_lock
->open_context
->state
;
756 err
= _nfs42_proc_clone(&msg
, src_f
, dst_f
, src_lock
, dst_lock
,
757 src_offset
, dst_offset
, count
);
758 if (err
== -ENOTSUPP
|| err
== -EOPNOTSUPP
) {
759 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_CLONE
;
764 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
765 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
768 } while (src_exception
.retry
|| dst_exception
.retry
);
770 nfs_put_lock_context(dst_lock
);
772 nfs_put_lock_context(src_lock
);