1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2014 Anna Schumaker <Anna.Schumaker@Netapp.com>
6 #include <linux/sunrpc/addr.h>
7 #include <linux/sunrpc/sched.h>
9 #include <linux/nfs3.h>
10 #include <linux/nfs4.h>
11 #include <linux/nfs_xdr.h>
12 #include <linux/nfs_fs.h>
17 #include "nfs4session.h"
19 #include "delegation.h"
20 #include "nfs4trace.h"
22 #define NFSDBG_FACILITY NFSDBG_PROC
23 static int nfs42_do_offload_cancel_async(struct file
*dst
, nfs4_stateid
*std
);
25 static void nfs42_set_netaddr(struct file
*filep
, struct nfs42_netaddr
*naddr
)
27 struct nfs_client
*clp
= (NFS_SERVER(file_inode(filep
)))->nfs_client
;
28 unsigned short port
= 2049;
31 naddr
->netid_len
= scnprintf(naddr
->netid
,
32 sizeof(naddr
->netid
), "%s",
33 rpc_peeraddr2str(clp
->cl_rpcclient
,
35 naddr
->addr_len
= scnprintf(naddr
->addr
,
38 rpc_peeraddr2str(clp
->cl_rpcclient
,
40 port
>> 8, port
& 255);
44 static int _nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
45 struct nfs_lock_context
*lock
, loff_t offset
, loff_t len
)
47 struct inode
*inode
= file_inode(filep
);
48 struct nfs_server
*server
= NFS_SERVER(inode
);
49 struct nfs42_falloc_args args
= {
50 .falloc_fh
= NFS_FH(inode
),
51 .falloc_offset
= offset
,
53 .falloc_bitmask
= nfs4_fattr_bitmap
,
55 struct nfs42_falloc_res res
= {
56 .falloc_server
= server
,
60 msg
->rpc_argp
= &args
;
63 status
= nfs4_set_rw_stateid(&args
.falloc_stateid
, lock
->open_context
,
66 if (status
== -EAGAIN
)
67 status
= -NFS4ERR_BAD_STATEID
;
71 res
.falloc_fattr
= nfs_alloc_fattr();
72 if (!res
.falloc_fattr
)
75 status
= nfs4_call_sync(server
->client
, server
, msg
,
76 &args
.seq_args
, &res
.seq_res
, 0);
78 status
= nfs_post_op_update_inode(inode
, res
.falloc_fattr
);
80 kfree(res
.falloc_fattr
);
84 static int nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
85 loff_t offset
, loff_t len
)
87 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
88 struct nfs4_exception exception
= { };
89 struct nfs_lock_context
*lock
;
92 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
96 exception
.inode
= file_inode(filep
);
97 exception
.state
= lock
->open_context
->state
;
100 err
= _nfs42_proc_fallocate(msg
, filep
, lock
, offset
, len
);
101 if (err
== -ENOTSUPP
) {
105 err
= nfs4_handle_exception(server
, err
, &exception
);
106 } while (exception
.retry
);
108 nfs_put_lock_context(lock
);
112 int nfs42_proc_allocate(struct file
*filep
, loff_t offset
, loff_t len
)
114 struct rpc_message msg
= {
115 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_ALLOCATE
],
117 struct inode
*inode
= file_inode(filep
);
120 if (!nfs_server_capable(inode
, NFS_CAP_ALLOCATE
))
125 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
126 if (err
== -EOPNOTSUPP
)
127 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_ALLOCATE
;
133 int nfs42_proc_deallocate(struct file
*filep
, loff_t offset
, loff_t len
)
135 struct rpc_message msg
= {
136 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_DEALLOCATE
],
138 struct inode
*inode
= file_inode(filep
);
141 if (!nfs_server_capable(inode
, NFS_CAP_DEALLOCATE
))
145 err
= nfs_sync_inode(inode
);
149 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
151 truncate_pagecache_range(inode
, offset
, (offset
+ len
) -1);
152 if (err
== -EOPNOTSUPP
)
153 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_DEALLOCATE
;
159 static int handle_async_copy(struct nfs42_copy_res
*res
,
160 struct nfs_server
*dst_server
,
161 struct nfs_server
*src_server
,
164 nfs4_stateid
*src_stateid
,
167 struct nfs4_copy_state
*copy
, *tmp_copy
;
168 int status
= NFS4_OK
;
169 bool found_pending
= false;
170 struct nfs_open_context
*dst_ctx
= nfs_file_open_context(dst
);
171 struct nfs_open_context
*src_ctx
= nfs_file_open_context(src
);
173 copy
= kzalloc(sizeof(struct nfs4_copy_state
), GFP_NOFS
);
177 spin_lock(&dst_server
->nfs_client
->cl_lock
);
178 list_for_each_entry(tmp_copy
,
179 &dst_server
->nfs_client
->pending_cb_stateids
,
181 if (memcmp(&res
->write_res
.stateid
, &tmp_copy
->stateid
,
184 found_pending
= true;
185 list_del(&tmp_copy
->copies
);
189 spin_unlock(&dst_server
->nfs_client
->cl_lock
);
195 memcpy(©
->stateid
, &res
->write_res
.stateid
, NFS4_STATEID_SIZE
);
196 init_completion(©
->completion
);
197 copy
->parent_dst_state
= dst_ctx
->state
;
198 copy
->parent_src_state
= src_ctx
->state
;
200 list_add_tail(©
->copies
, &dst_server
->ss_copies
);
201 spin_unlock(&dst_server
->nfs_client
->cl_lock
);
203 if (dst_server
!= src_server
) {
204 spin_lock(&src_server
->nfs_client
->cl_lock
);
205 list_add_tail(©
->src_copies
, &src_server
->ss_copies
);
206 spin_unlock(&src_server
->nfs_client
->cl_lock
);
209 status
= wait_for_completion_interruptible(©
->completion
);
210 spin_lock(&dst_server
->nfs_client
->cl_lock
);
211 list_del_init(©
->copies
);
212 spin_unlock(&dst_server
->nfs_client
->cl_lock
);
213 if (dst_server
!= src_server
) {
214 spin_lock(&src_server
->nfs_client
->cl_lock
);
215 list_del_init(©
->src_copies
);
216 spin_unlock(&src_server
->nfs_client
->cl_lock
);
218 if (status
== -ERESTARTSYS
) {
220 } else if (copy
->flags
|| copy
->error
== NFS4ERR_PARTNER_NO_AUTH
) {
226 res
->write_res
.count
= copy
->count
;
227 memcpy(&res
->write_res
.verifier
, ©
->verf
, sizeof(copy
->verf
));
228 status
= -copy
->error
;
234 nfs42_do_offload_cancel_async(dst
, ©
->stateid
);
235 if (!nfs42_files_from_same_server(src
, dst
))
236 nfs42_do_offload_cancel_async(src
, src_stateid
);
240 static int process_copy_commit(struct file
*dst
, loff_t pos_dst
,
241 struct nfs42_copy_res
*res
)
243 struct nfs_commitres cres
;
244 int status
= -ENOMEM
;
246 cres
.verf
= kzalloc(sizeof(struct nfs_writeverf
), GFP_NOFS
);
250 status
= nfs4_proc_commit(dst
, pos_dst
, res
->write_res
.count
, &cres
);
253 if (nfs_write_verifier_cmp(&res
->write_res
.verifier
.verifier
,
254 &cres
.verf
->verifier
)) {
255 dprintk("commit verf differs from copy verf\n");
264 static ssize_t
_nfs42_proc_copy(struct file
*src
,
265 struct nfs_lock_context
*src_lock
,
267 struct nfs_lock_context
*dst_lock
,
268 struct nfs42_copy_args
*args
,
269 struct nfs42_copy_res
*res
,
270 struct nl4_server
*nss
,
271 nfs4_stateid
*cnr_stateid
,
274 struct rpc_message msg
= {
275 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_COPY
],
279 struct inode
*dst_inode
= file_inode(dst
);
280 struct inode
*src_inode
= file_inode(src
);
281 struct nfs_server
*dst_server
= NFS_SERVER(dst_inode
);
282 struct nfs_server
*src_server
= NFS_SERVER(src_inode
);
283 loff_t pos_src
= args
->src_pos
;
284 loff_t pos_dst
= args
->dst_pos
;
285 size_t count
= args
->count
;
290 nfs4_stateid_copy(&args
->src_stateid
, cnr_stateid
);
292 status
= nfs4_set_rw_stateid(&args
->src_stateid
,
293 src_lock
->open_context
, src_lock
, FMODE_READ
);
295 if (status
== -EAGAIN
)
296 status
= -NFS4ERR_BAD_STATEID
;
300 status
= nfs_filemap_write_and_wait_range(file_inode(src
)->i_mapping
,
301 pos_src
, pos_src
+ (loff_t
)count
- 1);
305 status
= nfs4_set_rw_stateid(&args
->dst_stateid
, dst_lock
->open_context
,
306 dst_lock
, FMODE_WRITE
);
308 if (status
== -EAGAIN
)
309 status
= -NFS4ERR_BAD_STATEID
;
313 status
= nfs_sync_inode(dst_inode
);
317 res
->commit_res
.verf
= NULL
;
319 res
->commit_res
.verf
=
320 kzalloc(sizeof(struct nfs_writeverf
), GFP_NOFS
);
321 if (!res
->commit_res
.verf
)
324 set_bit(NFS_CLNT_SRC_SSC_COPY_STATE
,
325 &src_lock
->open_context
->state
->flags
);
326 set_bit(NFS_CLNT_DST_SSC_COPY_STATE
,
327 &dst_lock
->open_context
->state
->flags
);
329 status
= nfs4_call_sync(dst_server
->client
, dst_server
, &msg
,
330 &args
->seq_args
, &res
->seq_res
, 0);
331 if (status
== -ENOTSUPP
)
332 dst_server
->caps
&= ~NFS_CAP_COPY
;
337 nfs_write_verifier_cmp(&res
->write_res
.verifier
.verifier
,
338 &res
->commit_res
.verf
->verifier
)) {
343 if (!res
->synchronous
) {
344 status
= handle_async_copy(res
, dst_server
, src_server
, src
,
345 dst
, &args
->src_stateid
, restart
);
350 if ((!res
->synchronous
|| !args
->sync
) &&
351 res
->write_res
.verifier
.committed
!= NFS_FILE_SYNC
) {
352 status
= process_copy_commit(dst
, pos_dst
, res
);
357 truncate_pagecache_range(dst_inode
, pos_dst
,
358 pos_dst
+ res
->write_res
.count
);
359 spin_lock(&dst_inode
->i_lock
);
360 NFS_I(dst_inode
)->cache_validity
|= (NFS_INO_REVAL_PAGECACHE
|
361 NFS_INO_REVAL_FORCED
| NFS_INO_INVALID_SIZE
|
362 NFS_INO_INVALID_ATTR
| NFS_INO_INVALID_DATA
);
363 spin_unlock(&dst_inode
->i_lock
);
364 spin_lock(&src_inode
->i_lock
);
365 NFS_I(src_inode
)->cache_validity
|= (NFS_INO_REVAL_PAGECACHE
|
366 NFS_INO_REVAL_FORCED
| NFS_INO_INVALID_ATIME
);
367 spin_unlock(&src_inode
->i_lock
);
368 status
= res
->write_res
.count
;
371 kfree(res
->commit_res
.verf
);
375 ssize_t
nfs42_proc_copy(struct file
*src
, loff_t pos_src
,
376 struct file
*dst
, loff_t pos_dst
, size_t count
,
377 struct nl4_server
*nss
,
378 nfs4_stateid
*cnr_stateid
, bool sync
)
380 struct nfs_server
*server
= NFS_SERVER(file_inode(dst
));
381 struct nfs_lock_context
*src_lock
;
382 struct nfs_lock_context
*dst_lock
;
383 struct nfs42_copy_args args
= {
384 .src_fh
= NFS_FH(file_inode(src
)),
386 .dst_fh
= NFS_FH(file_inode(dst
)),
391 struct nfs42_copy_res res
;
392 struct nfs4_exception src_exception
= {
393 .inode
= file_inode(src
),
394 .stateid
= &args
.src_stateid
,
396 struct nfs4_exception dst_exception
= {
397 .inode
= file_inode(dst
),
398 .stateid
= &args
.dst_stateid
,
401 bool restart
= false;
403 src_lock
= nfs_get_lock_context(nfs_file_open_context(src
));
404 if (IS_ERR(src_lock
))
405 return PTR_ERR(src_lock
);
407 src_exception
.state
= src_lock
->open_context
->state
;
409 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst
));
410 if (IS_ERR(dst_lock
)) {
411 err
= PTR_ERR(dst_lock
);
412 goto out_put_src_lock
;
415 dst_exception
.state
= dst_lock
->open_context
->state
;
418 inode_lock(file_inode(dst
));
419 err
= _nfs42_proc_copy(src
, src_lock
,
422 nss
, cnr_stateid
, &restart
);
423 inode_unlock(file_inode(dst
));
427 if (err
== -ENOTSUPP
&&
428 nfs42_files_from_same_server(src
, dst
)) {
431 } else if (err
== -EAGAIN
) {
433 dst_exception
.retry
= 1;
437 } else if (err
== -NFS4ERR_OFFLOAD_NO_REQS
&& !args
.sync
) {
439 dst_exception
.retry
= 1;
441 } else if ((err
== -ESTALE
||
442 err
== -NFS4ERR_OFFLOAD_DENIED
||
444 !nfs42_files_from_same_server(src
, dst
)) {
445 nfs42_do_offload_cancel_async(src
, &args
.src_stateid
);
450 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
451 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
454 } while (src_exception
.retry
|| dst_exception
.retry
);
456 nfs_put_lock_context(dst_lock
);
458 nfs_put_lock_context(src_lock
);
462 struct nfs42_offloadcancel_data
{
463 struct nfs_server
*seq_server
;
464 struct nfs42_offload_status_args args
;
465 struct nfs42_offload_status_res res
;
468 static void nfs42_offload_cancel_prepare(struct rpc_task
*task
, void *calldata
)
470 struct nfs42_offloadcancel_data
*data
= calldata
;
472 nfs4_setup_sequence(data
->seq_server
->nfs_client
,
473 &data
->args
.osa_seq_args
,
474 &data
->res
.osr_seq_res
, task
);
477 static void nfs42_offload_cancel_done(struct rpc_task
*task
, void *calldata
)
479 struct nfs42_offloadcancel_data
*data
= calldata
;
481 nfs41_sequence_done(task
, &data
->res
.osr_seq_res
);
482 if (task
->tk_status
&&
483 nfs4_async_handle_error(task
, data
->seq_server
, NULL
,
485 rpc_restart_call_prepare(task
);
488 static void nfs42_free_offloadcancel_data(void *data
)
493 static const struct rpc_call_ops nfs42_offload_cancel_ops
= {
494 .rpc_call_prepare
= nfs42_offload_cancel_prepare
,
495 .rpc_call_done
= nfs42_offload_cancel_done
,
496 .rpc_release
= nfs42_free_offloadcancel_data
,
499 static int nfs42_do_offload_cancel_async(struct file
*dst
,
500 nfs4_stateid
*stateid
)
502 struct nfs_server
*dst_server
= NFS_SERVER(file_inode(dst
));
503 struct nfs42_offloadcancel_data
*data
= NULL
;
504 struct nfs_open_context
*ctx
= nfs_file_open_context(dst
);
505 struct rpc_task
*task
;
506 struct rpc_message msg
= {
507 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_OFFLOAD_CANCEL
],
508 .rpc_cred
= ctx
->cred
,
510 struct rpc_task_setup task_setup_data
= {
511 .rpc_client
= dst_server
->client
,
513 .callback_ops
= &nfs42_offload_cancel_ops
,
514 .workqueue
= nfsiod_workqueue
,
515 .flags
= RPC_TASK_ASYNC
,
519 if (!(dst_server
->caps
& NFS_CAP_OFFLOAD_CANCEL
))
522 data
= kzalloc(sizeof(struct nfs42_offloadcancel_data
), GFP_NOFS
);
526 data
->seq_server
= dst_server
;
527 data
->args
.osa_src_fh
= NFS_FH(file_inode(dst
));
528 memcpy(&data
->args
.osa_stateid
, stateid
,
529 sizeof(data
->args
.osa_stateid
));
530 msg
.rpc_argp
= &data
->args
;
531 msg
.rpc_resp
= &data
->res
;
532 task_setup_data
.callback_data
= data
;
533 nfs4_init_sequence(&data
->args
.osa_seq_args
, &data
->res
.osr_seq_res
,
535 task
= rpc_run_task(&task_setup_data
);
537 return PTR_ERR(task
);
538 status
= rpc_wait_for_completion_task(task
);
539 if (status
== -ENOTSUPP
)
540 dst_server
->caps
&= ~NFS_CAP_OFFLOAD_CANCEL
;
545 static int _nfs42_proc_copy_notify(struct file
*src
, struct file
*dst
,
546 struct nfs42_copy_notify_args
*args
,
547 struct nfs42_copy_notify_res
*res
)
549 struct nfs_server
*src_server
= NFS_SERVER(file_inode(src
));
550 struct rpc_message msg
= {
551 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_COPY_NOTIFY
],
556 struct nfs_open_context
*ctx
;
557 struct nfs_lock_context
*l_ctx
;
559 ctx
= get_nfs_open_context(nfs_file_open_context(src
));
560 l_ctx
= nfs_get_lock_context(ctx
);
562 return PTR_ERR(l_ctx
);
564 status
= nfs4_set_rw_stateid(&args
->cna_src_stateid
, ctx
, l_ctx
,
566 nfs_put_lock_context(l_ctx
);
568 if (status
== -EAGAIN
)
569 status
= -NFS4ERR_BAD_STATEID
;
573 status
= nfs4_call_sync(src_server
->client
, src_server
, &msg
,
574 &args
->cna_seq_args
, &res
->cnr_seq_res
, 0);
575 if (status
== -ENOTSUPP
)
576 src_server
->caps
&= ~NFS_CAP_COPY_NOTIFY
;
578 put_nfs_open_context(nfs_file_open_context(src
));
582 int nfs42_proc_copy_notify(struct file
*src
, struct file
*dst
,
583 struct nfs42_copy_notify_res
*res
)
585 struct nfs_server
*src_server
= NFS_SERVER(file_inode(src
));
586 struct nfs42_copy_notify_args
*args
;
587 struct nfs4_exception exception
= {
588 .inode
= file_inode(src
),
592 if (!(src_server
->caps
& NFS_CAP_COPY_NOTIFY
))
595 args
= kzalloc(sizeof(struct nfs42_copy_notify_args
), GFP_NOFS
);
599 args
->cna_src_fh
= NFS_FH(file_inode(src
)),
600 args
->cna_dst
.nl4_type
= NL4_NETADDR
;
601 nfs42_set_netaddr(dst
, &args
->cna_dst
.u
.nl4_addr
);
602 exception
.stateid
= &args
->cna_src_stateid
;
605 status
= _nfs42_proc_copy_notify(src
, dst
, args
, res
);
606 if (status
== -ENOTSUPP
) {
607 status
= -EOPNOTSUPP
;
610 status
= nfs4_handle_exception(src_server
, status
, &exception
);
611 } while (exception
.retry
);
618 static loff_t
_nfs42_proc_llseek(struct file
*filep
,
619 struct nfs_lock_context
*lock
, loff_t offset
, int whence
)
621 struct inode
*inode
= file_inode(filep
);
622 struct nfs42_seek_args args
= {
623 .sa_fh
= NFS_FH(inode
),
625 .sa_what
= (whence
== SEEK_HOLE
) ?
626 NFS4_CONTENT_HOLE
: NFS4_CONTENT_DATA
,
628 struct nfs42_seek_res res
;
629 struct rpc_message msg
= {
630 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_SEEK
],
634 struct nfs_server
*server
= NFS_SERVER(inode
);
637 if (!nfs_server_capable(inode
, NFS_CAP_SEEK
))
640 status
= nfs4_set_rw_stateid(&args
.sa_stateid
, lock
->open_context
,
643 if (status
== -EAGAIN
)
644 status
= -NFS4ERR_BAD_STATEID
;
648 status
= nfs_filemap_write_and_wait_range(inode
->i_mapping
,
653 status
= nfs4_call_sync(server
->client
, server
, &msg
,
654 &args
.seq_args
, &res
.seq_res
, 0);
655 if (status
== -ENOTSUPP
)
656 server
->caps
&= ~NFS_CAP_SEEK
;
660 return vfs_setpos(filep
, res
.sr_offset
, inode
->i_sb
->s_maxbytes
);
663 loff_t
nfs42_proc_llseek(struct file
*filep
, loff_t offset
, int whence
)
665 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
666 struct nfs4_exception exception
= { };
667 struct nfs_lock_context
*lock
;
670 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
672 return PTR_ERR(lock
);
674 exception
.inode
= file_inode(filep
);
675 exception
.state
= lock
->open_context
->state
;
678 err
= _nfs42_proc_llseek(filep
, lock
, offset
, whence
);
681 if (err
== -ENOTSUPP
) {
685 err
= nfs4_handle_exception(server
, err
, &exception
);
686 } while (exception
.retry
);
688 nfs_put_lock_context(lock
);
694 nfs42_layoutstat_prepare(struct rpc_task
*task
, void *calldata
)
696 struct nfs42_layoutstat_data
*data
= calldata
;
697 struct inode
*inode
= data
->inode
;
698 struct nfs_server
*server
= NFS_SERVER(inode
);
699 struct pnfs_layout_hdr
*lo
;
701 spin_lock(&inode
->i_lock
);
702 lo
= NFS_I(inode
)->layout
;
703 if (!pnfs_layout_is_valid(lo
)) {
704 spin_unlock(&inode
->i_lock
);
708 nfs4_stateid_copy(&data
->args
.stateid
, &lo
->plh_stateid
);
709 spin_unlock(&inode
->i_lock
);
710 nfs4_setup_sequence(server
->nfs_client
, &data
->args
.seq_args
,
711 &data
->res
.seq_res
, task
);
715 nfs42_layoutstat_done(struct rpc_task
*task
, void *calldata
)
717 struct nfs42_layoutstat_data
*data
= calldata
;
718 struct inode
*inode
= data
->inode
;
719 struct pnfs_layout_hdr
*lo
;
721 if (!nfs4_sequence_done(task
, &data
->res
.seq_res
))
724 switch (task
->tk_status
) {
727 case -NFS4ERR_BADHANDLE
:
729 pnfs_destroy_layout(NFS_I(inode
));
731 case -NFS4ERR_EXPIRED
:
732 case -NFS4ERR_ADMIN_REVOKED
:
733 case -NFS4ERR_DELEG_REVOKED
:
734 case -NFS4ERR_STALE_STATEID
:
735 case -NFS4ERR_BAD_STATEID
:
736 spin_lock(&inode
->i_lock
);
737 lo
= NFS_I(inode
)->layout
;
738 if (pnfs_layout_is_valid(lo
) &&
739 nfs4_stateid_match(&data
->args
.stateid
,
744 * Mark the bad layout state as invalid, then retry
745 * with the current stateid.
747 pnfs_mark_layout_stateid_invalid(lo
, &head
);
748 spin_unlock(&inode
->i_lock
);
749 pnfs_free_lseg_list(&head
);
750 nfs_commit_inode(inode
, 0);
752 spin_unlock(&inode
->i_lock
);
754 case -NFS4ERR_OLD_STATEID
:
755 spin_lock(&inode
->i_lock
);
756 lo
= NFS_I(inode
)->layout
;
757 if (pnfs_layout_is_valid(lo
) &&
758 nfs4_stateid_match_other(&data
->args
.stateid
,
760 /* Do we need to delay before resending? */
761 if (!nfs4_stateid_is_newer(&lo
->plh_stateid
,
762 &data
->args
.stateid
))
764 rpc_restart_call_prepare(task
);
766 spin_unlock(&inode
->i_lock
);
770 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_LAYOUTSTATS
;
773 trace_nfs4_layoutstats(inode
, &data
->args
.stateid
, task
->tk_status
);
777 nfs42_layoutstat_release(void *calldata
)
779 struct nfs42_layoutstat_data
*data
= calldata
;
780 struct nfs42_layoutstat_devinfo
*devinfo
= data
->args
.devinfo
;
783 for (i
= 0; i
< data
->args
.num_dev
; i
++) {
784 if (devinfo
[i
].ld_private
.ops
&& devinfo
[i
].ld_private
.ops
->free
)
785 devinfo
[i
].ld_private
.ops
->free(&devinfo
[i
].ld_private
);
788 pnfs_put_layout_hdr(NFS_I(data
->args
.inode
)->layout
);
789 smp_mb__before_atomic();
790 clear_bit(NFS_INO_LAYOUTSTATS
, &NFS_I(data
->args
.inode
)->flags
);
791 smp_mb__after_atomic();
792 nfs_iput_and_deactive(data
->inode
);
793 kfree(data
->args
.devinfo
);
797 static const struct rpc_call_ops nfs42_layoutstat_ops
= {
798 .rpc_call_prepare
= nfs42_layoutstat_prepare
,
799 .rpc_call_done
= nfs42_layoutstat_done
,
800 .rpc_release
= nfs42_layoutstat_release
,
803 int nfs42_proc_layoutstats_generic(struct nfs_server
*server
,
804 struct nfs42_layoutstat_data
*data
)
806 struct rpc_message msg
= {
807 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_LAYOUTSTATS
],
808 .rpc_argp
= &data
->args
,
809 .rpc_resp
= &data
->res
,
811 struct rpc_task_setup task_setup
= {
812 .rpc_client
= server
->client
,
814 .callback_ops
= &nfs42_layoutstat_ops
,
815 .callback_data
= data
,
816 .flags
= RPC_TASK_ASYNC
,
818 struct rpc_task
*task
;
820 data
->inode
= nfs_igrab_and_active(data
->args
.inode
);
822 nfs42_layoutstat_release(data
);
825 nfs4_init_sequence(&data
->args
.seq_args
, &data
->res
.seq_res
, 0, 0);
826 task
= rpc_run_task(&task_setup
);
828 return PTR_ERR(task
);
833 static struct nfs42_layouterror_data
*
834 nfs42_alloc_layouterror_data(struct pnfs_layout_segment
*lseg
, gfp_t gfp_flags
)
836 struct nfs42_layouterror_data
*data
;
837 struct inode
*inode
= lseg
->pls_layout
->plh_inode
;
839 data
= kzalloc(sizeof(*data
), gfp_flags
);
841 data
->args
.inode
= data
->inode
= nfs_igrab_and_active(inode
);
843 data
->lseg
= pnfs_get_lseg(lseg
);
846 nfs_iput_and_deactive(data
->inode
);
854 nfs42_free_layouterror_data(struct nfs42_layouterror_data
*data
)
856 pnfs_put_lseg(data
->lseg
);
857 nfs_iput_and_deactive(data
->inode
);
862 nfs42_layouterror_prepare(struct rpc_task
*task
, void *calldata
)
864 struct nfs42_layouterror_data
*data
= calldata
;
865 struct inode
*inode
= data
->inode
;
866 struct nfs_server
*server
= NFS_SERVER(inode
);
867 struct pnfs_layout_hdr
*lo
= data
->lseg
->pls_layout
;
870 spin_lock(&inode
->i_lock
);
871 if (!pnfs_layout_is_valid(lo
)) {
872 spin_unlock(&inode
->i_lock
);
876 for (i
= 0; i
< data
->args
.num_errors
; i
++)
877 nfs4_stateid_copy(&data
->args
.errors
[i
].stateid
,
879 spin_unlock(&inode
->i_lock
);
880 nfs4_setup_sequence(server
->nfs_client
, &data
->args
.seq_args
,
881 &data
->res
.seq_res
, task
);
885 nfs42_layouterror_done(struct rpc_task
*task
, void *calldata
)
887 struct nfs42_layouterror_data
*data
= calldata
;
888 struct inode
*inode
= data
->inode
;
889 struct pnfs_layout_hdr
*lo
= data
->lseg
->pls_layout
;
891 if (!nfs4_sequence_done(task
, &data
->res
.seq_res
))
894 switch (task
->tk_status
) {
897 case -NFS4ERR_BADHANDLE
:
899 pnfs_destroy_layout(NFS_I(inode
));
901 case -NFS4ERR_EXPIRED
:
902 case -NFS4ERR_ADMIN_REVOKED
:
903 case -NFS4ERR_DELEG_REVOKED
:
904 case -NFS4ERR_STALE_STATEID
:
905 case -NFS4ERR_BAD_STATEID
:
906 spin_lock(&inode
->i_lock
);
907 if (pnfs_layout_is_valid(lo
) &&
908 nfs4_stateid_match(&data
->args
.errors
[0].stateid
,
913 * Mark the bad layout state as invalid, then retry
914 * with the current stateid.
916 pnfs_mark_layout_stateid_invalid(lo
, &head
);
917 spin_unlock(&inode
->i_lock
);
918 pnfs_free_lseg_list(&head
);
919 nfs_commit_inode(inode
, 0);
921 spin_unlock(&inode
->i_lock
);
923 case -NFS4ERR_OLD_STATEID
:
924 spin_lock(&inode
->i_lock
);
925 if (pnfs_layout_is_valid(lo
) &&
926 nfs4_stateid_match_other(&data
->args
.errors
[0].stateid
,
928 /* Do we need to delay before resending? */
929 if (!nfs4_stateid_is_newer(&lo
->plh_stateid
,
930 &data
->args
.errors
[0].stateid
))
932 rpc_restart_call_prepare(task
);
934 spin_unlock(&inode
->i_lock
);
938 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_LAYOUTERROR
;
941 trace_nfs4_layouterror(inode
, &data
->args
.errors
[0].stateid
,
946 nfs42_layouterror_release(void *calldata
)
948 struct nfs42_layouterror_data
*data
= calldata
;
950 nfs42_free_layouterror_data(data
);
953 static const struct rpc_call_ops nfs42_layouterror_ops
= {
954 .rpc_call_prepare
= nfs42_layouterror_prepare
,
955 .rpc_call_done
= nfs42_layouterror_done
,
956 .rpc_release
= nfs42_layouterror_release
,
959 int nfs42_proc_layouterror(struct pnfs_layout_segment
*lseg
,
960 const struct nfs42_layout_error
*errors
, size_t n
)
962 struct inode
*inode
= lseg
->pls_layout
->plh_inode
;
963 struct nfs42_layouterror_data
*data
;
964 struct rpc_task
*task
;
965 struct rpc_message msg
= {
966 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_LAYOUTERROR
],
968 struct rpc_task_setup task_setup
= {
970 .callback_ops
= &nfs42_layouterror_ops
,
971 .flags
= RPC_TASK_ASYNC
,
975 if (!nfs_server_capable(inode
, NFS_CAP_LAYOUTERROR
))
977 if (n
> NFS42_LAYOUTERROR_MAX
)
979 data
= nfs42_alloc_layouterror_data(lseg
, GFP_NOFS
);
982 for (i
= 0; i
< n
; i
++) {
983 data
->args
.errors
[i
] = errors
[i
];
984 data
->args
.num_errors
++;
985 data
->res
.num_errors
++;
987 msg
.rpc_argp
= &data
->args
;
988 msg
.rpc_resp
= &data
->res
;
989 task_setup
.callback_data
= data
;
990 task_setup
.rpc_client
= NFS_SERVER(inode
)->client
;
991 nfs4_init_sequence(&data
->args
.seq_args
, &data
->res
.seq_res
, 0, 0);
992 task
= rpc_run_task(&task_setup
);
994 return PTR_ERR(task
);
998 EXPORT_SYMBOL_GPL(nfs42_proc_layouterror
);
1000 static int _nfs42_proc_clone(struct rpc_message
*msg
, struct file
*src_f
,
1001 struct file
*dst_f
, struct nfs_lock_context
*src_lock
,
1002 struct nfs_lock_context
*dst_lock
, loff_t src_offset
,
1003 loff_t dst_offset
, loff_t count
)
1005 struct inode
*src_inode
= file_inode(src_f
);
1006 struct inode
*dst_inode
= file_inode(dst_f
);
1007 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
1008 struct nfs42_clone_args args
= {
1009 .src_fh
= NFS_FH(src_inode
),
1010 .dst_fh
= NFS_FH(dst_inode
),
1011 .src_offset
= src_offset
,
1012 .dst_offset
= dst_offset
,
1014 .dst_bitmask
= server
->cache_consistency_bitmask
,
1016 struct nfs42_clone_res res
= {
1021 msg
->rpc_argp
= &args
;
1022 msg
->rpc_resp
= &res
;
1024 status
= nfs4_set_rw_stateid(&args
.src_stateid
, src_lock
->open_context
,
1025 src_lock
, FMODE_READ
);
1027 if (status
== -EAGAIN
)
1028 status
= -NFS4ERR_BAD_STATEID
;
1031 status
= nfs4_set_rw_stateid(&args
.dst_stateid
, dst_lock
->open_context
,
1032 dst_lock
, FMODE_WRITE
);
1034 if (status
== -EAGAIN
)
1035 status
= -NFS4ERR_BAD_STATEID
;
1039 res
.dst_fattr
= nfs_alloc_fattr();
1043 status
= nfs4_call_sync(server
->client
, server
, msg
,
1044 &args
.seq_args
, &res
.seq_res
, 0);
1046 status
= nfs_post_op_update_inode(dst_inode
, res
.dst_fattr
);
1048 kfree(res
.dst_fattr
);
1052 int nfs42_proc_clone(struct file
*src_f
, struct file
*dst_f
,
1053 loff_t src_offset
, loff_t dst_offset
, loff_t count
)
1055 struct rpc_message msg
= {
1056 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_CLONE
],
1058 struct inode
*inode
= file_inode(src_f
);
1059 struct nfs_server
*server
= NFS_SERVER(file_inode(src_f
));
1060 struct nfs_lock_context
*src_lock
;
1061 struct nfs_lock_context
*dst_lock
;
1062 struct nfs4_exception src_exception
= { };
1063 struct nfs4_exception dst_exception
= { };
1066 if (!nfs_server_capable(inode
, NFS_CAP_CLONE
))
1069 src_lock
= nfs_get_lock_context(nfs_file_open_context(src_f
));
1070 if (IS_ERR(src_lock
))
1071 return PTR_ERR(src_lock
);
1073 src_exception
.inode
= file_inode(src_f
);
1074 src_exception
.state
= src_lock
->open_context
->state
;
1076 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst_f
));
1077 if (IS_ERR(dst_lock
)) {
1078 err
= PTR_ERR(dst_lock
);
1079 goto out_put_src_lock
;
1082 dst_exception
.inode
= file_inode(dst_f
);
1083 dst_exception
.state
= dst_lock
->open_context
->state
;
1086 err
= _nfs42_proc_clone(&msg
, src_f
, dst_f
, src_lock
, dst_lock
,
1087 src_offset
, dst_offset
, count
);
1088 if (err
== -ENOTSUPP
|| err
== -EOPNOTSUPP
) {
1089 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_CLONE
;
1094 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
1095 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
1098 } while (src_exception
.retry
|| dst_exception
.retry
);
1100 nfs_put_lock_context(dst_lock
);
1102 nfs_put_lock_context(src_lock
);
1106 #define NFS4XATTR_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
1108 static int _nfs42_proc_removexattr(struct inode
*inode
, const char *name
)
1110 struct nfs_server
*server
= NFS_SERVER(inode
);
1111 struct nfs42_removexattrargs args
= {
1112 .fh
= NFS_FH(inode
),
1115 struct nfs42_removexattrres res
;
1116 struct rpc_message msg
= {
1117 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_REMOVEXATTR
],
1122 unsigned long timestamp
= jiffies
;
1124 ret
= nfs4_call_sync(server
->client
, server
, &msg
, &args
.seq_args
,
1127 nfs4_update_changeattr(inode
, &res
.cinfo
, timestamp
, 0);
1132 static int _nfs42_proc_setxattr(struct inode
*inode
, const char *name
,
1133 const void *buf
, size_t buflen
, int flags
)
1135 struct nfs_server
*server
= NFS_SERVER(inode
);
1136 struct page
*pages
[NFS4XATTR_MAXPAGES
];
1137 struct nfs42_setxattrargs arg
= {
1138 .fh
= NFS_FH(inode
),
1139 .xattr_pages
= pages
,
1140 .xattr_len
= buflen
,
1142 .xattr_flags
= flags
,
1144 struct nfs42_setxattrres res
;
1145 struct rpc_message msg
= {
1146 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_SETXATTR
],
1151 unsigned long timestamp
= jiffies
;
1153 if (buflen
> server
->sxasize
)
1157 np
= nfs4_buf_to_pages_noslab(buf
, buflen
, arg
.xattr_pages
);
1163 ret
= nfs4_call_sync(server
->client
, server
, &msg
, &arg
.seq_args
,
1166 for (; np
> 0; np
--)
1167 put_page(pages
[np
- 1]);
1170 nfs4_update_changeattr(inode
, &res
.cinfo
, timestamp
, 0);
1175 static ssize_t
_nfs42_proc_getxattr(struct inode
*inode
, const char *name
,
1176 void *buf
, size_t buflen
, struct page
**pages
,
1179 struct nfs_server
*server
= NFS_SERVER(inode
);
1180 struct nfs42_getxattrargs arg
= {
1181 .fh
= NFS_FH(inode
),
1184 struct nfs42_getxattrres res
;
1185 struct rpc_message msg
= {
1186 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_GETXATTR
],
1192 arg
.xattr_len
= plen
;
1193 arg
.xattr_pages
= pages
;
1195 ret
= nfs4_call_sync(server
->client
, server
, &msg
, &arg
.seq_args
,
1201 * Normally, the caching is done one layer up, but for successful
1202 * RPCS, always cache the result here, even if the caller was
1203 * just querying the length, or if the reply was too big for
1204 * the caller. This avoids a second RPC in the case of the
1205 * common query-alloc-retrieve cycle for xattrs.
1207 * Note that xattr_len is always capped to XATTR_SIZE_MAX.
1210 nfs4_xattr_cache_add(inode
, name
, NULL
, pages
, res
.xattr_len
);
1213 if (res
.xattr_len
> buflen
)
1215 _copy_from_pages(buf
, pages
, 0, res
.xattr_len
);
1218 return res
.xattr_len
;
1221 static ssize_t
_nfs42_proc_listxattrs(struct inode
*inode
, void *buf
,
1222 size_t buflen
, u64
*cookiep
, bool *eofp
)
1224 struct nfs_server
*server
= NFS_SERVER(inode
);
1225 struct page
**pages
;
1226 struct nfs42_listxattrsargs arg
= {
1227 .fh
= NFS_FH(inode
),
1230 struct nfs42_listxattrsres res
= {
1233 .xattr_len
= buflen
,
1235 struct rpc_message msg
= {
1236 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_LISTXATTRS
],
1245 res
.scratch
= alloc_page(GFP_KERNEL
);
1249 xdrlen
= nfs42_listxattr_xdrsize(buflen
);
1250 if (xdrlen
> server
->lxasize
)
1251 xdrlen
= server
->lxasize
;
1252 np
= xdrlen
/ PAGE_SIZE
+ 1;
1254 pages
= kcalloc(np
, sizeof(struct page
*), GFP_KERNEL
);
1256 goto out_free_scratch
;
1257 for (i
= 0; i
< np
; i
++) {
1258 pages
[i
] = alloc_page(GFP_KERNEL
);
1260 goto out_free_pages
;
1263 arg
.xattr_pages
= pages
;
1266 ret
= nfs4_call_sync(server
->client
, server
, &msg
, &arg
.seq_args
,
1271 *cookiep
= res
.cookie
;
1278 __free_page(pages
[np
]);
1282 __free_page(res
.scratch
);
1288 ssize_t
nfs42_proc_getxattr(struct inode
*inode
, const char *name
,
1289 void *buf
, size_t buflen
)
1291 struct nfs4_exception exception
= { };
1293 struct page
**pages
;
1295 np
= nfs_page_array_len(0, buflen
?: XATTR_SIZE_MAX
);
1296 pages
= kmalloc_array(np
, sizeof(*pages
), GFP_KERNEL
);
1300 for (i
= 0; i
< np
; i
++) {
1301 pages
[i
] = alloc_page(GFP_KERNEL
);
1310 * The GETXATTR op has no length field in the call, and the
1311 * xattr data is at the end of the reply.
1313 * There is no downside in using the page-aligned length. It will
1314 * allow receiving and caching xattrs that are too large for the
1315 * caller but still fit in the page-rounded value.
1318 err
= _nfs42_proc_getxattr(inode
, name
, buf
, buflen
,
1319 pages
, np
* PAGE_SIZE
);
1322 err
= nfs4_handle_exception(NFS_SERVER(inode
), err
,
1324 } while (exception
.retry
);
1328 __free_page(pages
[np
]);
1334 int nfs42_proc_setxattr(struct inode
*inode
, const char *name
,
1335 const void *buf
, size_t buflen
, int flags
)
1337 struct nfs4_exception exception
= { };
1341 err
= _nfs42_proc_setxattr(inode
, name
, buf
, buflen
, flags
);
1344 err
= nfs4_handle_exception(NFS_SERVER(inode
), err
,
1346 } while (exception
.retry
);
1351 ssize_t
nfs42_proc_listxattrs(struct inode
*inode
, void *buf
,
1352 size_t buflen
, u64
*cookiep
, bool *eofp
)
1354 struct nfs4_exception exception
= { };
1358 err
= _nfs42_proc_listxattrs(inode
, buf
, buflen
,
1362 err
= nfs4_handle_exception(NFS_SERVER(inode
), err
,
1364 } while (exception
.retry
);
1369 int nfs42_proc_removexattr(struct inode
*inode
, const char *name
)
1371 struct nfs4_exception exception
= { };
1375 err
= _nfs42_proc_removexattr(inode
, name
);
1378 err
= nfs4_handle_exception(NFS_SERVER(inode
), err
,
1380 } while (exception
.retry
);