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
21 static int _nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
22 struct nfs_lock_context
*lock
, loff_t offset
, loff_t len
)
24 struct inode
*inode
= file_inode(filep
);
25 struct nfs_server
*server
= NFS_SERVER(inode
);
26 struct nfs42_falloc_args args
= {
27 .falloc_fh
= NFS_FH(inode
),
28 .falloc_offset
= offset
,
30 .falloc_bitmask
= server
->cache_consistency_bitmask
,
32 struct nfs42_falloc_res res
= {
33 .falloc_server
= server
,
37 msg
->rpc_argp
= &args
;
40 status
= nfs4_set_rw_stateid(&args
.falloc_stateid
, lock
->open_context
,
45 res
.falloc_fattr
= nfs_alloc_fattr();
46 if (!res
.falloc_fattr
)
49 status
= nfs4_call_sync(server
->client
, server
, msg
,
50 &args
.seq_args
, &res
.seq_res
, 0);
52 status
= nfs_post_op_update_inode(inode
, res
.falloc_fattr
);
54 kfree(res
.falloc_fattr
);
58 static int nfs42_proc_fallocate(struct rpc_message
*msg
, struct file
*filep
,
59 loff_t offset
, loff_t len
)
61 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
62 struct nfs4_exception exception
= { };
63 struct nfs_lock_context
*lock
;
66 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
70 exception
.inode
= file_inode(filep
);
71 exception
.state
= lock
->open_context
->state
;
74 err
= _nfs42_proc_fallocate(msg
, filep
, lock
, offset
, len
);
75 if (err
== -ENOTSUPP
) {
79 err
= nfs4_handle_exception(server
, err
, &exception
);
80 } while (exception
.retry
);
82 nfs_put_lock_context(lock
);
86 int nfs42_proc_allocate(struct file
*filep
, loff_t offset
, loff_t len
)
88 struct rpc_message msg
= {
89 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_ALLOCATE
],
91 struct inode
*inode
= file_inode(filep
);
94 if (!nfs_server_capable(inode
, NFS_CAP_ALLOCATE
))
99 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
100 if (err
== -EOPNOTSUPP
)
101 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_ALLOCATE
;
107 int nfs42_proc_deallocate(struct file
*filep
, loff_t offset
, loff_t len
)
109 struct rpc_message msg
= {
110 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_DEALLOCATE
],
112 struct inode
*inode
= file_inode(filep
);
115 if (!nfs_server_capable(inode
, NFS_CAP_DEALLOCATE
))
119 err
= nfs_sync_inode(inode
);
123 err
= nfs42_proc_fallocate(&msg
, filep
, offset
, len
);
125 truncate_pagecache_range(inode
, offset
, (offset
+ len
) -1);
126 if (err
== -EOPNOTSUPP
)
127 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_DEALLOCATE
;
133 static ssize_t
_nfs42_proc_copy(struct file
*src
,
134 struct nfs_lock_context
*src_lock
,
136 struct nfs_lock_context
*dst_lock
,
137 struct nfs42_copy_args
*args
,
138 struct nfs42_copy_res
*res
)
140 struct rpc_message msg
= {
141 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_COPY
],
145 struct inode
*dst_inode
= file_inode(dst
);
146 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
147 loff_t pos_src
= args
->src_pos
;
148 loff_t pos_dst
= args
->dst_pos
;
149 size_t count
= args
->count
;
152 status
= nfs4_set_rw_stateid(&args
->src_stateid
, src_lock
->open_context
,
153 src_lock
, FMODE_READ
);
157 status
= nfs_filemap_write_and_wait_range(file_inode(src
)->i_mapping
,
158 pos_src
, pos_src
+ (loff_t
)count
- 1);
162 status
= nfs4_set_rw_stateid(&args
->dst_stateid
, dst_lock
->open_context
,
163 dst_lock
, FMODE_WRITE
);
167 status
= nfs_sync_inode(dst_inode
);
171 res
->commit_res
.verf
= kzalloc(sizeof(struct nfs_writeverf
), GFP_NOFS
);
172 if (!res
->commit_res
.verf
)
174 status
= nfs4_call_sync(server
->client
, server
, &msg
,
175 &args
->seq_args
, &res
->seq_res
, 0);
176 if (status
== -ENOTSUPP
)
177 server
->caps
&= ~NFS_CAP_COPY
;
181 if (nfs_write_verifier_cmp(&res
->write_res
.verifier
.verifier
,
182 &res
->commit_res
.verf
->verifier
)) {
187 truncate_pagecache_range(dst_inode
, pos_dst
,
188 pos_dst
+ res
->write_res
.count
);
190 status
= res
->write_res
.count
;
192 kfree(res
->commit_res
.verf
);
196 ssize_t
nfs42_proc_copy(struct file
*src
, loff_t pos_src
,
197 struct file
*dst
, loff_t pos_dst
,
200 struct nfs_server
*server
= NFS_SERVER(file_inode(dst
));
201 struct nfs_lock_context
*src_lock
;
202 struct nfs_lock_context
*dst_lock
;
203 struct nfs42_copy_args args
= {
204 .src_fh
= NFS_FH(file_inode(src
)),
206 .dst_fh
= NFS_FH(file_inode(dst
)),
210 struct nfs42_copy_res res
;
211 struct nfs4_exception src_exception
= {
212 .inode
= file_inode(src
),
213 .stateid
= &args
.src_stateid
,
215 struct nfs4_exception dst_exception
= {
216 .inode
= file_inode(dst
),
217 .stateid
= &args
.dst_stateid
,
221 if (!nfs_server_capable(file_inode(dst
), NFS_CAP_COPY
))
224 src_lock
= nfs_get_lock_context(nfs_file_open_context(src
));
225 if (IS_ERR(src_lock
))
226 return PTR_ERR(src_lock
);
228 src_exception
.state
= src_lock
->open_context
->state
;
230 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst
));
231 if (IS_ERR(dst_lock
)) {
232 err
= PTR_ERR(dst_lock
);
233 goto out_put_src_lock
;
236 dst_exception
.state
= dst_lock
->open_context
->state
;
239 inode_lock(file_inode(dst
));
240 err
= _nfs42_proc_copy(src
, src_lock
,
243 inode_unlock(file_inode(dst
));
247 if (err
== -ENOTSUPP
) {
250 } if (err
== -EAGAIN
) {
251 dst_exception
.retry
= 1;
255 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
256 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
259 } while (src_exception
.retry
|| dst_exception
.retry
);
261 nfs_put_lock_context(dst_lock
);
263 nfs_put_lock_context(src_lock
);
267 static loff_t
_nfs42_proc_llseek(struct file
*filep
,
268 struct nfs_lock_context
*lock
, loff_t offset
, int whence
)
270 struct inode
*inode
= file_inode(filep
);
271 struct nfs42_seek_args args
= {
272 .sa_fh
= NFS_FH(inode
),
274 .sa_what
= (whence
== SEEK_HOLE
) ?
275 NFS4_CONTENT_HOLE
: NFS4_CONTENT_DATA
,
277 struct nfs42_seek_res res
;
278 struct rpc_message msg
= {
279 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_SEEK
],
283 struct nfs_server
*server
= NFS_SERVER(inode
);
286 if (!nfs_server_capable(inode
, NFS_CAP_SEEK
))
289 status
= nfs4_set_rw_stateid(&args
.sa_stateid
, lock
->open_context
,
294 status
= nfs_filemap_write_and_wait_range(inode
->i_mapping
,
299 status
= nfs4_call_sync(server
->client
, server
, &msg
,
300 &args
.seq_args
, &res
.seq_res
, 0);
301 if (status
== -ENOTSUPP
)
302 server
->caps
&= ~NFS_CAP_SEEK
;
306 return vfs_setpos(filep
, res
.sr_offset
, inode
->i_sb
->s_maxbytes
);
309 loff_t
nfs42_proc_llseek(struct file
*filep
, loff_t offset
, int whence
)
311 struct nfs_server
*server
= NFS_SERVER(file_inode(filep
));
312 struct nfs4_exception exception
= { };
313 struct nfs_lock_context
*lock
;
316 lock
= nfs_get_lock_context(nfs_file_open_context(filep
));
318 return PTR_ERR(lock
);
320 exception
.inode
= file_inode(filep
);
321 exception
.state
= lock
->open_context
->state
;
324 err
= _nfs42_proc_llseek(filep
, lock
, offset
, whence
);
327 if (err
== -ENOTSUPP
) {
331 err
= nfs4_handle_exception(server
, err
, &exception
);
332 } while (exception
.retry
);
334 nfs_put_lock_context(lock
);
340 nfs42_layoutstat_prepare(struct rpc_task
*task
, void *calldata
)
342 struct nfs42_layoutstat_data
*data
= calldata
;
343 struct inode
*inode
= data
->inode
;
344 struct nfs_server
*server
= NFS_SERVER(inode
);
345 struct pnfs_layout_hdr
*lo
;
347 spin_lock(&inode
->i_lock
);
348 lo
= NFS_I(inode
)->layout
;
349 if (!pnfs_layout_is_valid(lo
)) {
350 spin_unlock(&inode
->i_lock
);
354 nfs4_stateid_copy(&data
->args
.stateid
, &lo
->plh_stateid
);
355 spin_unlock(&inode
->i_lock
);
356 nfs4_setup_sequence(server
->nfs_client
, &data
->args
.seq_args
,
357 &data
->res
.seq_res
, task
);
361 nfs42_layoutstat_done(struct rpc_task
*task
, void *calldata
)
363 struct nfs42_layoutstat_data
*data
= calldata
;
364 struct inode
*inode
= data
->inode
;
365 struct pnfs_layout_hdr
*lo
;
367 if (!nfs4_sequence_done(task
, &data
->res
.seq_res
))
370 switch (task
->tk_status
) {
373 case -NFS4ERR_EXPIRED
:
374 case -NFS4ERR_ADMIN_REVOKED
:
375 case -NFS4ERR_DELEG_REVOKED
:
376 case -NFS4ERR_STALE_STATEID
:
377 case -NFS4ERR_BAD_STATEID
:
378 spin_lock(&inode
->i_lock
);
379 lo
= NFS_I(inode
)->layout
;
380 if (pnfs_layout_is_valid(lo
) &&
381 nfs4_stateid_match(&data
->args
.stateid
,
386 * Mark the bad layout state as invalid, then retry
387 * with the current stateid.
389 pnfs_mark_layout_stateid_invalid(lo
, &head
);
390 spin_unlock(&inode
->i_lock
);
391 pnfs_free_lseg_list(&head
);
392 nfs_commit_inode(inode
, 0);
394 spin_unlock(&inode
->i_lock
);
396 case -NFS4ERR_OLD_STATEID
:
397 spin_lock(&inode
->i_lock
);
398 lo
= NFS_I(inode
)->layout
;
399 if (pnfs_layout_is_valid(lo
) &&
400 nfs4_stateid_match_other(&data
->args
.stateid
,
402 /* Do we need to delay before resending? */
403 if (!nfs4_stateid_is_newer(&lo
->plh_stateid
,
404 &data
->args
.stateid
))
406 rpc_restart_call_prepare(task
);
408 spin_unlock(&inode
->i_lock
);
412 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_LAYOUTSTATS
;
417 nfs42_layoutstat_release(void *calldata
)
419 struct nfs42_layoutstat_data
*data
= calldata
;
420 struct nfs42_layoutstat_devinfo
*devinfo
= data
->args
.devinfo
;
423 for (i
= 0; i
< data
->args
.num_dev
; i
++) {
424 if (devinfo
[i
].ld_private
.ops
&& devinfo
[i
].ld_private
.ops
->free
)
425 devinfo
[i
].ld_private
.ops
->free(&devinfo
[i
].ld_private
);
428 pnfs_put_layout_hdr(NFS_I(data
->args
.inode
)->layout
);
429 smp_mb__before_atomic();
430 clear_bit(NFS_INO_LAYOUTSTATS
, &NFS_I(data
->args
.inode
)->flags
);
431 smp_mb__after_atomic();
432 nfs_iput_and_deactive(data
->inode
);
433 kfree(data
->args
.devinfo
);
437 static const struct rpc_call_ops nfs42_layoutstat_ops
= {
438 .rpc_call_prepare
= nfs42_layoutstat_prepare
,
439 .rpc_call_done
= nfs42_layoutstat_done
,
440 .rpc_release
= nfs42_layoutstat_release
,
443 int nfs42_proc_layoutstats_generic(struct nfs_server
*server
,
444 struct nfs42_layoutstat_data
*data
)
446 struct rpc_message msg
= {
447 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_LAYOUTSTATS
],
448 .rpc_argp
= &data
->args
,
449 .rpc_resp
= &data
->res
,
451 struct rpc_task_setup task_setup
= {
452 .rpc_client
= server
->client
,
454 .callback_ops
= &nfs42_layoutstat_ops
,
455 .callback_data
= data
,
456 .flags
= RPC_TASK_ASYNC
,
458 struct rpc_task
*task
;
460 data
->inode
= nfs_igrab_and_active(data
->args
.inode
);
462 nfs42_layoutstat_release(data
);
465 nfs4_init_sequence(&data
->args
.seq_args
, &data
->res
.seq_res
, 0);
466 task
= rpc_run_task(&task_setup
);
468 return PTR_ERR(task
);
473 static int _nfs42_proc_clone(struct rpc_message
*msg
, struct file
*src_f
,
474 struct file
*dst_f
, struct nfs_lock_context
*src_lock
,
475 struct nfs_lock_context
*dst_lock
, loff_t src_offset
,
476 loff_t dst_offset
, loff_t count
)
478 struct inode
*src_inode
= file_inode(src_f
);
479 struct inode
*dst_inode
= file_inode(dst_f
);
480 struct nfs_server
*server
= NFS_SERVER(dst_inode
);
481 struct nfs42_clone_args args
= {
482 .src_fh
= NFS_FH(src_inode
),
483 .dst_fh
= NFS_FH(dst_inode
),
484 .src_offset
= src_offset
,
485 .dst_offset
= dst_offset
,
487 .dst_bitmask
= server
->cache_consistency_bitmask
,
489 struct nfs42_clone_res res
= {
494 msg
->rpc_argp
= &args
;
495 msg
->rpc_resp
= &res
;
497 status
= nfs4_set_rw_stateid(&args
.src_stateid
, src_lock
->open_context
,
498 src_lock
, FMODE_READ
);
502 status
= nfs4_set_rw_stateid(&args
.dst_stateid
, dst_lock
->open_context
,
503 dst_lock
, FMODE_WRITE
);
507 res
.dst_fattr
= nfs_alloc_fattr();
511 status
= nfs4_call_sync(server
->client
, server
, msg
,
512 &args
.seq_args
, &res
.seq_res
, 0);
514 status
= nfs_post_op_update_inode(dst_inode
, res
.dst_fattr
);
516 kfree(res
.dst_fattr
);
520 int nfs42_proc_clone(struct file
*src_f
, struct file
*dst_f
,
521 loff_t src_offset
, loff_t dst_offset
, loff_t count
)
523 struct rpc_message msg
= {
524 .rpc_proc
= &nfs4_procedures
[NFSPROC4_CLNT_CLONE
],
526 struct inode
*inode
= file_inode(src_f
);
527 struct nfs_server
*server
= NFS_SERVER(file_inode(src_f
));
528 struct nfs_lock_context
*src_lock
;
529 struct nfs_lock_context
*dst_lock
;
530 struct nfs4_exception src_exception
= { };
531 struct nfs4_exception dst_exception
= { };
534 if (!nfs_server_capable(inode
, NFS_CAP_CLONE
))
537 src_lock
= nfs_get_lock_context(nfs_file_open_context(src_f
));
538 if (IS_ERR(src_lock
))
539 return PTR_ERR(src_lock
);
541 src_exception
.inode
= file_inode(src_f
);
542 src_exception
.state
= src_lock
->open_context
->state
;
544 dst_lock
= nfs_get_lock_context(nfs_file_open_context(dst_f
));
545 if (IS_ERR(dst_lock
)) {
546 err
= PTR_ERR(dst_lock
);
547 goto out_put_src_lock
;
550 dst_exception
.inode
= file_inode(dst_f
);
551 dst_exception
.state
= dst_lock
->open_context
->state
;
554 err
= _nfs42_proc_clone(&msg
, src_f
, dst_f
, src_lock
, dst_lock
,
555 src_offset
, dst_offset
, count
);
556 if (err
== -ENOTSUPP
|| err
== -EOPNOTSUPP
) {
557 NFS_SERVER(inode
)->caps
&= ~NFS_CAP_CLONE
;
562 err2
= nfs4_handle_exception(server
, err
, &src_exception
);
563 err
= nfs4_handle_exception(server
, err
, &dst_exception
);
566 } while (src_exception
.retry
|| dst_exception
.retry
);
568 nfs_put_lock_context(dst_lock
);
570 nfs_put_lock_context(src_lock
);