2 * Server-side procedures for NFSv4.
4 * Copyright (c) 2002 The Regents of the University of Michigan.
7 * Kendrick Smith <kmsmith@umich.edu>
8 * Andy Adamson <andros@umich.edu>
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #include <linux/fs_struct.h>
36 #include <linux/file.h>
37 #include <linux/falloc.h>
38 #include <linux/slab.h>
39 #include <linux/kthread.h>
40 #include <linux/sunrpc/addr.h>
46 #include "current_stateid.h"
52 #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
53 #include <linux/security.h>
56 nfsd4_security_inode_setsecctx(struct svc_fh
*resfh
, struct xdr_netobj
*label
, u32
*bmval
)
58 struct inode
*inode
= d_inode(resfh
->fh_dentry
);
62 status
= security_inode_setsecctx(resfh
->fh_dentry
,
63 label
->data
, label
->len
);
68 * XXX: We should really fail the whole open, but we may
69 * already have created a new file, so it may be too
70 * late. For now this seems the least of evils:
72 bmval
[2] &= ~FATTR4_WORD2_SECURITY_LABEL
;
78 nfsd4_security_inode_setsecctx(struct svc_fh
*resfh
, struct xdr_netobj
*label
, u32
*bmval
)
82 #define NFSDDBG_FACILITY NFSDDBG_PROC
84 static u32 nfsd_attrmask
[] = {
85 NFSD_WRITEABLE_ATTRS_WORD0
,
86 NFSD_WRITEABLE_ATTRS_WORD1
,
87 NFSD_WRITEABLE_ATTRS_WORD2
90 static u32 nfsd41_ex_attrmask
[] = {
91 NFSD_SUPPATTR_EXCLCREAT_WORD0
,
92 NFSD_SUPPATTR_EXCLCREAT_WORD1
,
93 NFSD_SUPPATTR_EXCLCREAT_WORD2
97 check_attr_support(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
98 u32
*bmval
, u32
*writable
)
100 struct dentry
*dentry
= cstate
->current_fh
.fh_dentry
;
101 struct svc_export
*exp
= cstate
->current_fh
.fh_export
;
103 if (!nfsd_attrs_supported(cstate
->minorversion
, bmval
))
104 return nfserr_attrnotsupp
;
105 if ((bmval
[0] & FATTR4_WORD0_ACL
) && !IS_POSIXACL(d_inode(dentry
)))
106 return nfserr_attrnotsupp
;
107 if ((bmval
[2] & FATTR4_WORD2_SECURITY_LABEL
) &&
108 !(exp
->ex_flags
& NFSEXP_SECURITY_LABEL
))
109 return nfserr_attrnotsupp
;
110 if (writable
&& !bmval_is_subset(bmval
, writable
))
112 if (writable
&& (bmval
[2] & FATTR4_WORD2_MODE_UMASK
) &&
113 (bmval
[1] & FATTR4_WORD1_MODE
))
119 nfsd4_check_open_attributes(struct svc_rqst
*rqstp
,
120 struct nfsd4_compound_state
*cstate
, struct nfsd4_open
*open
)
122 __be32 status
= nfs_ok
;
124 if (open
->op_create
== NFS4_OPEN_CREATE
) {
125 if (open
->op_createmode
== NFS4_CREATE_UNCHECKED
126 || open
->op_createmode
== NFS4_CREATE_GUARDED
)
127 status
= check_attr_support(rqstp
, cstate
,
128 open
->op_bmval
, nfsd_attrmask
);
129 else if (open
->op_createmode
== NFS4_CREATE_EXCLUSIVE4_1
)
130 status
= check_attr_support(rqstp
, cstate
,
131 open
->op_bmval
, nfsd41_ex_attrmask
);
138 is_create_with_attrs(struct nfsd4_open
*open
)
140 return open
->op_create
== NFS4_OPEN_CREATE
141 && (open
->op_createmode
== NFS4_CREATE_UNCHECKED
142 || open
->op_createmode
== NFS4_CREATE_GUARDED
143 || open
->op_createmode
== NFS4_CREATE_EXCLUSIVE4_1
);
147 * if error occurs when setting the acl, just clear the acl bit
148 * in the returned attr bitmap.
151 do_set_nfs4_acl(struct svc_rqst
*rqstp
, struct svc_fh
*fhp
,
152 struct nfs4_acl
*acl
, u32
*bmval
)
156 status
= nfsd4_set_nfs4_acl(rqstp
, fhp
, acl
);
159 * We should probably fail the whole open at this point,
160 * but we've already created the file, so it's too late;
161 * So this seems the least of evils:
163 bmval
[0] &= ~FATTR4_WORD0_ACL
;
167 fh_dup2(struct svc_fh
*dst
, struct svc_fh
*src
)
170 dget(src
->fh_dentry
);
172 exp_get(src
->fh_export
);
177 do_open_permission(struct svc_rqst
*rqstp
, struct svc_fh
*current_fh
, struct nfsd4_open
*open
, int accmode
)
181 if (open
->op_truncate
&&
182 !(open
->op_share_access
& NFS4_SHARE_ACCESS_WRITE
))
185 accmode
|= NFSD_MAY_READ_IF_EXEC
;
187 if (open
->op_share_access
& NFS4_SHARE_ACCESS_READ
)
188 accmode
|= NFSD_MAY_READ
;
189 if (open
->op_share_access
& NFS4_SHARE_ACCESS_WRITE
)
190 accmode
|= (NFSD_MAY_WRITE
| NFSD_MAY_TRUNC
);
191 if (open
->op_share_deny
& NFS4_SHARE_DENY_READ
)
192 accmode
|= NFSD_MAY_WRITE
;
194 status
= fh_verify(rqstp
, current_fh
, S_IFREG
, accmode
);
199 static __be32
nfsd_check_obj_isreg(struct svc_fh
*fh
)
201 umode_t mode
= d_inode(fh
->fh_dentry
)->i_mode
;
208 * Using err_symlink as our catch-all case may look odd; but
209 * there's no other obvious error for this case in 4.0, and we
210 * happen to know that it will cause the linux v4 client to do
211 * the right thing on attempts to open something other than a
214 return nfserr_symlink
;
217 static void nfsd4_set_open_owner_reply_cache(struct nfsd4_compound_state
*cstate
, struct nfsd4_open
*open
, struct svc_fh
*resfh
)
219 if (nfsd4_has_session(cstate
))
221 fh_copy_shallow(&open
->op_openowner
->oo_owner
.so_replay
.rp_openfh
,
226 do_open_lookup(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
, struct nfsd4_open
*open
, struct svc_fh
**resfh
)
228 struct svc_fh
*current_fh
= &cstate
->current_fh
;
232 *resfh
= kmalloc(sizeof(struct svc_fh
), GFP_KERNEL
);
234 return nfserr_jukebox
;
235 fh_init(*resfh
, NFS4_FHSIZE
);
236 open
->op_truncate
= false;
238 if (open
->op_create
) {
239 /* FIXME: check session persistence and pnfs flags.
240 * The nfsv4.1 spec requires the following semantics:
242 * Persistent | pNFS | Server REQUIRED | Client Allowed
243 * Reply Cache | server | |
244 * -------------+--------+-----------------+--------------------
245 * no | no | EXCLUSIVE4_1 | EXCLUSIVE4_1
247 * | | and EXCLUSIVE4 | or EXCLUSIVE4
249 * no | yes | EXCLUSIVE4_1 | EXCLUSIVE4_1
250 * yes | no | GUARDED4 | GUARDED4
251 * yes | yes | GUARDED4 | GUARDED4
255 * Note: create modes (UNCHECKED,GUARDED...) are the same
256 * in NFSv4 as in v3 except EXCLUSIVE4_1.
258 current
->fs
->umask
= open
->op_umask
;
259 status
= do_nfsd_create(rqstp
, current_fh
, open
->op_fname
.data
,
260 open
->op_fname
.len
, &open
->op_iattr
,
261 *resfh
, open
->op_createmode
,
262 (u32
*)open
->op_verf
.data
,
263 &open
->op_truncate
, &open
->op_created
);
264 current
->fs
->umask
= 0;
266 if (!status
&& open
->op_label
.len
)
267 nfsd4_security_inode_setsecctx(*resfh
, &open
->op_label
, open
->op_bmval
);
270 * Following rfc 3530 14.2.16, and rfc 5661 18.16.4
271 * use the returned bitmask to indicate which attributes
272 * we used to store the verifier:
274 if (nfsd_create_is_exclusive(open
->op_createmode
) && status
== 0)
275 open
->op_bmval
[1] |= (FATTR4_WORD1_TIME_ACCESS
|
276 FATTR4_WORD1_TIME_MODIFY
);
279 * Note this may exit with the parent still locked.
280 * We will hold the lock until nfsd4_open's final
281 * lookup, to prevent renames or unlinks until we've had
282 * a chance to an acquire a delegation if appropriate.
284 status
= nfsd_lookup(rqstp
, current_fh
,
285 open
->op_fname
.data
, open
->op_fname
.len
, *resfh
);
288 status
= nfsd_check_obj_isreg(*resfh
);
292 if (is_create_with_attrs(open
) && open
->op_acl
!= NULL
)
293 do_set_nfs4_acl(rqstp
, *resfh
, open
->op_acl
, open
->op_bmval
);
295 nfsd4_set_open_owner_reply_cache(cstate
, open
, *resfh
);
296 accmode
= NFSD_MAY_NOP
;
297 if (open
->op_created
||
298 open
->op_claim_type
== NFS4_OPEN_CLAIM_DELEGATE_CUR
)
299 accmode
|= NFSD_MAY_OWNER_OVERRIDE
;
300 status
= do_open_permission(rqstp
, *resfh
, open
, accmode
);
301 set_change_info(&open
->op_cinfo
, current_fh
);
307 do_open_fhandle(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
, struct nfsd4_open
*open
)
309 struct svc_fh
*current_fh
= &cstate
->current_fh
;
313 /* We don't know the target directory, and therefore can not
314 * set the change info
317 memset(&open
->op_cinfo
, 0, sizeof(struct nfsd4_change_info
));
319 nfsd4_set_open_owner_reply_cache(cstate
, open
, current_fh
);
321 open
->op_truncate
= (open
->op_iattr
.ia_valid
& ATTR_SIZE
) &&
322 (open
->op_iattr
.ia_size
== 0);
324 * In the delegation case, the client is telling us about an
325 * open that it *already* performed locally, some time ago. We
326 * should let it succeed now if possible.
328 * In the case of a CLAIM_FH open, on the other hand, the client
329 * may be counting on us to enforce permissions (the Linux 4.1
330 * client uses this for normal opens, for example).
332 if (open
->op_claim_type
== NFS4_OPEN_CLAIM_DELEG_CUR_FH
)
333 accmode
= NFSD_MAY_OWNER_OVERRIDE
;
335 status
= do_open_permission(rqstp
, current_fh
, open
, accmode
);
341 copy_clientid(clientid_t
*clid
, struct nfsd4_session
*session
)
343 struct nfsd4_sessionid
*sid
=
344 (struct nfsd4_sessionid
*)session
->se_sessionid
.data
;
346 clid
->cl_boot
= sid
->clientid
.cl_boot
;
347 clid
->cl_id
= sid
->clientid
.cl_id
;
351 nfsd4_open(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
354 struct nfsd4_open
*open
= &u
->open
;
356 struct svc_fh
*resfh
= NULL
;
357 struct net
*net
= SVC_NET(rqstp
);
358 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
359 bool reclaim
= false;
361 dprintk("NFSD: nfsd4_open filename %.*s op_openowner %p\n",
362 (int)open
->op_fname
.len
, open
->op_fname
.data
,
365 /* This check required by spec. */
366 if (open
->op_create
&& open
->op_claim_type
!= NFS4_OPEN_CLAIM_NULL
)
369 open
->op_created
= false;
372 * Before RECLAIM_COMPLETE done, server should deny new lock
374 if (nfsd4_has_session(cstate
) &&
375 !test_bit(NFSD4_CLIENT_RECLAIM_COMPLETE
,
376 &cstate
->session
->se_client
->cl_flags
) &&
377 open
->op_claim_type
!= NFS4_OPEN_CLAIM_PREVIOUS
)
380 if (nfsd4_has_session(cstate
))
381 copy_clientid(&open
->op_clientid
, cstate
->session
);
383 /* check seqid for replay. set nfs4_owner */
384 status
= nfsd4_process_open1(cstate
, open
, nn
);
385 if (status
== nfserr_replay_me
) {
386 struct nfs4_replay
*rp
= &open
->op_openowner
->oo_owner
.so_replay
;
387 fh_put(&cstate
->current_fh
);
388 fh_copy_shallow(&cstate
->current_fh
.fh_handle
,
390 status
= fh_verify(rqstp
, &cstate
->current_fh
, 0, NFSD_MAY_NOP
);
392 dprintk("nfsd4_open: replay failed"
393 " restoring previous filehandle\n");
395 status
= nfserr_replay_me
;
399 if (open
->op_xdr_error
) {
400 status
= open
->op_xdr_error
;
404 status
= nfsd4_check_open_attributes(rqstp
, cstate
, open
);
408 /* Openowner is now set, so sequence id will get bumped. Now we need
409 * these checks before we do any creates: */
410 status
= nfserr_grace
;
411 if (opens_in_grace(net
) && open
->op_claim_type
!= NFS4_OPEN_CLAIM_PREVIOUS
)
413 status
= nfserr_no_grace
;
414 if (!opens_in_grace(net
) && open
->op_claim_type
== NFS4_OPEN_CLAIM_PREVIOUS
)
417 switch (open
->op_claim_type
) {
418 case NFS4_OPEN_CLAIM_DELEGATE_CUR
:
419 case NFS4_OPEN_CLAIM_NULL
:
420 status
= do_open_lookup(rqstp
, cstate
, open
, &resfh
);
424 case NFS4_OPEN_CLAIM_PREVIOUS
:
425 status
= nfs4_check_open_reclaim(&open
->op_clientid
,
429 open
->op_openowner
->oo_flags
|= NFS4_OO_CONFIRMED
;
432 case NFS4_OPEN_CLAIM_FH
:
433 case NFS4_OPEN_CLAIM_DELEG_CUR_FH
:
434 status
= do_open_fhandle(rqstp
, cstate
, open
);
437 resfh
= &cstate
->current_fh
;
439 case NFS4_OPEN_CLAIM_DELEG_PREV_FH
:
440 case NFS4_OPEN_CLAIM_DELEGATE_PREV
:
441 dprintk("NFSD: unsupported OPEN claim type %d\n",
442 open
->op_claim_type
);
443 status
= nfserr_notsupp
;
446 dprintk("NFSD: Invalid OPEN claim type %d\n",
447 open
->op_claim_type
);
448 status
= nfserr_inval
;
452 * nfsd4_process_open2() does the actual opening of the file. If
453 * successful, it (1) truncates the file if open->op_truncate was
454 * set, (2) sets open->op_stateid, (3) sets open->op_delegation.
456 status
= nfsd4_process_open2(rqstp
, resfh
, open
);
457 WARN(status
&& open
->op_created
,
458 "nfsd4_process_open2 failed to open newly-created file! status=%u\n",
459 be32_to_cpu(status
));
460 if (reclaim
&& !status
)
461 nn
->somebody_reclaimed
= true;
463 if (resfh
&& resfh
!= &cstate
->current_fh
) {
464 fh_dup2(&cstate
->current_fh
, resfh
);
468 nfsd4_cleanup_open_state(cstate
, open
);
469 nfsd4_bump_seqid(cstate
, status
);
474 * OPEN is the only seqid-mutating operation whose decoding can fail
475 * with a seqid-mutating error (specifically, decoding of user names in
476 * the attributes). Therefore we have to do some processing to look up
477 * the stateowner so that we can bump the seqid.
479 static __be32
nfsd4_open_omfg(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
, struct nfsd4_op
*op
)
481 struct nfsd4_open
*open
= &op
->u
.open
;
483 if (!seqid_mutating_err(ntohl(op
->status
)))
485 if (nfsd4_has_session(cstate
))
487 open
->op_xdr_error
= op
->status
;
488 return nfsd4_open(rqstp
, cstate
, &op
->u
);
492 * filehandle-manipulating ops.
495 nfsd4_getfh(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
498 u
->getfh
= &cstate
->current_fh
;
503 nfsd4_putfh(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
506 struct nfsd4_putfh
*putfh
= &u
->putfh
;
509 fh_put(&cstate
->current_fh
);
510 cstate
->current_fh
.fh_handle
.fh_size
= putfh
->pf_fhlen
;
511 memcpy(&cstate
->current_fh
.fh_handle
.fh_base
, putfh
->pf_fhval
,
513 ret
= fh_verify(rqstp
, &cstate
->current_fh
, 0, NFSD_MAY_BYPASS_GSS
);
514 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
515 if (ret
== nfserr_stale
&& putfh
->no_verify
) {
516 SET_FH_FLAG(&cstate
->current_fh
, NFSD4_FH_FOREIGN
);
524 nfsd4_putrootfh(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
529 fh_put(&cstate
->current_fh
);
530 status
= exp_pseudoroot(rqstp
, &cstate
->current_fh
);
535 nfsd4_restorefh(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
538 if (!cstate
->save_fh
.fh_dentry
)
539 return nfserr_restorefh
;
541 fh_dup2(&cstate
->current_fh
, &cstate
->save_fh
);
542 if (HAS_CSTATE_FLAG(cstate
, SAVED_STATE_ID_FLAG
)) {
543 memcpy(&cstate
->current_stateid
, &cstate
->save_stateid
, sizeof(stateid_t
));
544 SET_CSTATE_FLAG(cstate
, CURRENT_STATE_ID_FLAG
);
550 nfsd4_savefh(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
553 fh_dup2(&cstate
->save_fh
, &cstate
->current_fh
);
554 if (HAS_CSTATE_FLAG(cstate
, CURRENT_STATE_ID_FLAG
)) {
555 memcpy(&cstate
->save_stateid
, &cstate
->current_stateid
, sizeof(stateid_t
));
556 SET_CSTATE_FLAG(cstate
, SAVED_STATE_ID_FLAG
);
565 nfsd4_access(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
568 struct nfsd4_access
*access
= &u
->access
;
570 if (access
->ac_req_access
& ~NFS3_ACCESS_FULL
)
573 access
->ac_resp_access
= access
->ac_req_access
;
574 return nfsd_access(rqstp
, &cstate
->current_fh
, &access
->ac_resp_access
,
575 &access
->ac_supported
);
578 static void gen_boot_verifier(nfs4_verifier
*verifier
, struct net
*net
)
580 __be32
*verf
= (__be32
*)verifier
->data
;
582 BUILD_BUG_ON(2*sizeof(*verf
) != sizeof(verifier
->data
));
584 nfsd_copy_boot_verifier(verf
, net_generic(net
, nfsd_net_id
));
588 nfsd4_commit(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
591 struct nfsd4_commit
*commit
= &u
->commit
;
593 return nfsd_commit(rqstp
, &cstate
->current_fh
, commit
->co_offset
,
595 (__be32
*)commit
->co_verf
.data
);
599 nfsd4_create(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
602 struct nfsd4_create
*create
= &u
->create
;
607 fh_init(&resfh
, NFS4_FHSIZE
);
609 status
= fh_verify(rqstp
, &cstate
->current_fh
, S_IFDIR
, NFSD_MAY_NOP
);
613 status
= check_attr_support(rqstp
, cstate
, create
->cr_bmval
,
618 current
->fs
->umask
= create
->cr_umask
;
619 switch (create
->cr_type
) {
621 status
= nfsd_symlink(rqstp
, &cstate
->current_fh
,
622 create
->cr_name
, create
->cr_namelen
,
623 create
->cr_data
, &resfh
);
627 status
= nfserr_inval
;
628 rdev
= MKDEV(create
->cr_specdata1
, create
->cr_specdata2
);
629 if (MAJOR(rdev
) != create
->cr_specdata1
||
630 MINOR(rdev
) != create
->cr_specdata2
)
632 status
= nfsd_create(rqstp
, &cstate
->current_fh
,
633 create
->cr_name
, create
->cr_namelen
,
634 &create
->cr_iattr
, S_IFBLK
, rdev
, &resfh
);
638 status
= nfserr_inval
;
639 rdev
= MKDEV(create
->cr_specdata1
, create
->cr_specdata2
);
640 if (MAJOR(rdev
) != create
->cr_specdata1
||
641 MINOR(rdev
) != create
->cr_specdata2
)
643 status
= nfsd_create(rqstp
, &cstate
->current_fh
,
644 create
->cr_name
, create
->cr_namelen
,
645 &create
->cr_iattr
,S_IFCHR
, rdev
, &resfh
);
649 status
= nfsd_create(rqstp
, &cstate
->current_fh
,
650 create
->cr_name
, create
->cr_namelen
,
651 &create
->cr_iattr
, S_IFSOCK
, 0, &resfh
);
655 status
= nfsd_create(rqstp
, &cstate
->current_fh
,
656 create
->cr_name
, create
->cr_namelen
,
657 &create
->cr_iattr
, S_IFIFO
, 0, &resfh
);
661 create
->cr_iattr
.ia_valid
&= ~ATTR_SIZE
;
662 status
= nfsd_create(rqstp
, &cstate
->current_fh
,
663 create
->cr_name
, create
->cr_namelen
,
664 &create
->cr_iattr
, S_IFDIR
, 0, &resfh
);
668 status
= nfserr_badtype
;
674 if (create
->cr_label
.len
)
675 nfsd4_security_inode_setsecctx(&resfh
, &create
->cr_label
, create
->cr_bmval
);
677 if (create
->cr_acl
!= NULL
)
678 do_set_nfs4_acl(rqstp
, &resfh
, create
->cr_acl
,
681 fh_unlock(&cstate
->current_fh
);
682 set_change_info(&create
->cr_cinfo
, &cstate
->current_fh
);
683 fh_dup2(&cstate
->current_fh
, &resfh
);
687 current
->fs
->umask
= 0;
692 nfsd4_getattr(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
695 struct nfsd4_getattr
*getattr
= &u
->getattr
;
698 status
= fh_verify(rqstp
, &cstate
->current_fh
, 0, NFSD_MAY_NOP
);
702 if (getattr
->ga_bmval
[1] & NFSD_WRITEONLY_ATTRS_WORD1
)
705 getattr
->ga_bmval
[0] &= nfsd_suppattrs
[cstate
->minorversion
][0];
706 getattr
->ga_bmval
[1] &= nfsd_suppattrs
[cstate
->minorversion
][1];
707 getattr
->ga_bmval
[2] &= nfsd_suppattrs
[cstate
->minorversion
][2];
709 getattr
->ga_fhp
= &cstate
->current_fh
;
714 nfsd4_link(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
717 struct nfsd4_link
*link
= &u
->link
;
720 status
= nfsd_link(rqstp
, &cstate
->current_fh
,
721 link
->li_name
, link
->li_namelen
, &cstate
->save_fh
);
723 set_change_info(&link
->li_cinfo
, &cstate
->current_fh
);
727 static __be32
nfsd4_do_lookupp(struct svc_rqst
*rqstp
, struct svc_fh
*fh
)
729 struct svc_fh tmp_fh
;
732 fh_init(&tmp_fh
, NFS4_FHSIZE
);
733 ret
= exp_pseudoroot(rqstp
, &tmp_fh
);
736 if (tmp_fh
.fh_dentry
== fh
->fh_dentry
) {
741 return nfsd_lookup(rqstp
, fh
, "..", 2, fh
);
745 nfsd4_lookupp(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
748 return nfsd4_do_lookupp(rqstp
, &cstate
->current_fh
);
752 nfsd4_lookup(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
755 return nfsd_lookup(rqstp
, &cstate
->current_fh
,
756 u
->lookup
.lo_name
, u
->lookup
.lo_len
,
757 &cstate
->current_fh
);
761 nfsd4_read(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
764 struct nfsd4_read
*read
= &u
->read
;
768 if (read
->rd_offset
>= OFFSET_MAX
)
771 trace_nfsd_read_start(rqstp
, &cstate
->current_fh
,
772 read
->rd_offset
, read
->rd_length
);
775 * If we do a zero copy read, then a client will see read data
776 * that reflects the state of the file *after* performing the
777 * following compound.
779 * To ensure proper ordering, we therefore turn off zero copy if
780 * the client wants us to do more in this compound:
782 if (!nfsd4_last_compound_op(rqstp
))
783 clear_bit(RQ_SPLICE_OK
, &rqstp
->rq_flags
);
786 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
787 &read
->rd_stateid
, RD_STATE
,
790 dprintk("NFSD: nfsd4_read: couldn't process stateid!\n");
795 read
->rd_rqstp
= rqstp
;
796 read
->rd_fhp
= &cstate
->current_fh
;
802 nfsd4_read_release(union nfsd4_op_u
*u
)
805 nfsd_file_put(u
->read
.rd_nf
);
806 trace_nfsd_read_done(u
->read
.rd_rqstp
, u
->read
.rd_fhp
,
807 u
->read
.rd_offset
, u
->read
.rd_length
);
811 nfsd4_readdir(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
814 struct nfsd4_readdir
*readdir
= &u
->readdir
;
815 u64 cookie
= readdir
->rd_cookie
;
816 static const nfs4_verifier zeroverf
;
818 /* no need to check permission - this will be done in nfsd_readdir() */
820 if (readdir
->rd_bmval
[1] & NFSD_WRITEONLY_ATTRS_WORD1
)
823 readdir
->rd_bmval
[0] &= nfsd_suppattrs
[cstate
->minorversion
][0];
824 readdir
->rd_bmval
[1] &= nfsd_suppattrs
[cstate
->minorversion
][1];
825 readdir
->rd_bmval
[2] &= nfsd_suppattrs
[cstate
->minorversion
][2];
827 if ((cookie
== 1) || (cookie
== 2) ||
828 (cookie
== 0 && memcmp(readdir
->rd_verf
.data
, zeroverf
.data
, NFS4_VERIFIER_SIZE
)))
829 return nfserr_bad_cookie
;
831 readdir
->rd_rqstp
= rqstp
;
832 readdir
->rd_fhp
= &cstate
->current_fh
;
837 nfsd4_readlink(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
840 u
->readlink
.rl_rqstp
= rqstp
;
841 u
->readlink
.rl_fhp
= &cstate
->current_fh
;
846 nfsd4_remove(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
849 struct nfsd4_remove
*remove
= &u
->remove
;
852 if (opens_in_grace(SVC_NET(rqstp
)))
854 status
= nfsd_unlink(rqstp
, &cstate
->current_fh
, 0,
855 remove
->rm_name
, remove
->rm_namelen
);
857 fh_unlock(&cstate
->current_fh
);
858 set_change_info(&remove
->rm_cinfo
, &cstate
->current_fh
);
864 nfsd4_rename(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
867 struct nfsd4_rename
*rename
= &u
->rename
;
870 if (opens_in_grace(SVC_NET(rqstp
)))
872 status
= nfsd_rename(rqstp
, &cstate
->save_fh
, rename
->rn_sname
,
873 rename
->rn_snamelen
, &cstate
->current_fh
,
874 rename
->rn_tname
, rename
->rn_tnamelen
);
877 set_change_info(&rename
->rn_sinfo
, &cstate
->current_fh
);
878 set_change_info(&rename
->rn_tinfo
, &cstate
->save_fh
);
883 nfsd4_secinfo(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
886 struct nfsd4_secinfo
*secinfo
= &u
->secinfo
;
887 struct svc_export
*exp
;
888 struct dentry
*dentry
;
891 err
= fh_verify(rqstp
, &cstate
->current_fh
, S_IFDIR
, NFSD_MAY_EXEC
);
894 err
= nfsd_lookup_dentry(rqstp
, &cstate
->current_fh
,
895 secinfo
->si_name
, secinfo
->si_namelen
,
899 fh_unlock(&cstate
->current_fh
);
900 if (d_really_is_negative(dentry
)) {
904 secinfo
->si_exp
= exp
;
906 if (cstate
->minorversion
)
907 /* See rfc 5661 section 2.6.3.1.1.8 */
908 fh_put(&cstate
->current_fh
);
913 nfsd4_secinfo_no_name(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
918 switch (u
->secinfo_no_name
.sin_style
) {
919 case NFS4_SECINFO_STYLE4_CURRENT_FH
:
921 case NFS4_SECINFO_STYLE4_PARENT
:
922 err
= nfsd4_do_lookupp(rqstp
, &cstate
->current_fh
);
930 u
->secinfo_no_name
.sin_exp
= exp_get(cstate
->current_fh
.fh_export
);
931 fh_put(&cstate
->current_fh
);
936 nfsd4_secinfo_release(union nfsd4_op_u
*u
)
938 if (u
->secinfo
.si_exp
)
939 exp_put(u
->secinfo
.si_exp
);
943 nfsd4_secinfo_no_name_release(union nfsd4_op_u
*u
)
945 if (u
->secinfo_no_name
.sin_exp
)
946 exp_put(u
->secinfo_no_name
.sin_exp
);
950 nfsd4_setattr(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
953 struct nfsd4_setattr
*setattr
= &u
->setattr
;
954 __be32 status
= nfs_ok
;
957 if (setattr
->sa_iattr
.ia_valid
& ATTR_SIZE
) {
958 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
,
959 &cstate
->current_fh
, &setattr
->sa_stateid
,
960 WR_STATE
, NULL
, NULL
);
962 dprintk("NFSD: nfsd4_setattr: couldn't process stateid!\n");
966 err
= fh_want_write(&cstate
->current_fh
);
968 return nfserrno(err
);
971 status
= check_attr_support(rqstp
, cstate
, setattr
->sa_bmval
,
976 if (setattr
->sa_acl
!= NULL
)
977 status
= nfsd4_set_nfs4_acl(rqstp
, &cstate
->current_fh
,
981 if (setattr
->sa_label
.len
)
982 status
= nfsd4_set_nfs4_label(rqstp
, &cstate
->current_fh
,
986 status
= nfsd_setattr(rqstp
, &cstate
->current_fh
, &setattr
->sa_iattr
,
989 fh_drop_write(&cstate
->current_fh
);
994 nfsd4_write(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
997 struct nfsd4_write
*write
= &u
->write
;
998 stateid_t
*stateid
= &write
->wr_stateid
;
999 struct nfsd_file
*nf
= NULL
;
1000 __be32 status
= nfs_ok
;
1004 if (write
->wr_offset
>= OFFSET_MAX
)
1005 return nfserr_inval
;
1007 cnt
= write
->wr_buflen
;
1008 trace_nfsd_write_start(rqstp
, &cstate
->current_fh
,
1009 write
->wr_offset
, cnt
);
1010 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
1011 stateid
, WR_STATE
, &nf
, NULL
);
1013 dprintk("NFSD: nfsd4_write: couldn't process stateid!\n");
1017 write
->wr_how_written
= write
->wr_stable_how
;
1019 nvecs
= svc_fill_write_vector(rqstp
, write
->wr_pagelist
,
1020 &write
->wr_head
, write
->wr_buflen
);
1021 WARN_ON_ONCE(nvecs
> ARRAY_SIZE(rqstp
->rq_vec
));
1023 status
= nfsd_vfs_write(rqstp
, &cstate
->current_fh
, nf
,
1024 write
->wr_offset
, rqstp
->rq_vec
, nvecs
, &cnt
,
1025 write
->wr_how_written
,
1026 (__be32
*)write
->wr_verifier
.data
);
1029 write
->wr_bytes_written
= cnt
;
1030 trace_nfsd_write_done(rqstp
, &cstate
->current_fh
,
1031 write
->wr_offset
, cnt
);
1036 nfsd4_verify_copy(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1037 stateid_t
*src_stateid
, struct nfsd_file
**src
,
1038 stateid_t
*dst_stateid
, struct nfsd_file
**dst
)
1042 if (!cstate
->save_fh
.fh_dentry
)
1043 return nfserr_nofilehandle
;
1045 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->save_fh
,
1046 src_stateid
, RD_STATE
, src
, NULL
);
1048 dprintk("NFSD: %s: couldn't process src stateid!\n", __func__
);
1052 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
1053 dst_stateid
, WR_STATE
, dst
, NULL
);
1055 dprintk("NFSD: %s: couldn't process dst stateid!\n", __func__
);
1059 /* fix up for NFS-specific error code */
1060 if (!S_ISREG(file_inode((*src
)->nf_file
)->i_mode
) ||
1061 !S_ISREG(file_inode((*dst
)->nf_file
)->i_mode
)) {
1062 status
= nfserr_wrong_type
;
1069 nfsd_file_put(*dst
);
1071 nfsd_file_put(*src
);
1076 nfsd4_clone(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1077 union nfsd4_op_u
*u
)
1079 struct nfsd4_clone
*clone
= &u
->clone
;
1080 struct nfsd_file
*src
, *dst
;
1083 status
= nfsd4_verify_copy(rqstp
, cstate
, &clone
->cl_src_stateid
, &src
,
1084 &clone
->cl_dst_stateid
, &dst
);
1088 status
= nfsd4_clone_file_range(src
, clone
->cl_src_pos
,
1089 dst
, clone
->cl_dst_pos
, clone
->cl_count
,
1090 EX_ISSYNC(cstate
->current_fh
.fh_export
));
1098 void nfs4_put_copy(struct nfsd4_copy
*copy
)
1100 if (!refcount_dec_and_test(©
->refcount
))
1106 check_and_set_stop_copy(struct nfsd4_copy
*copy
)
1110 spin_lock(©
->cp_clp
->async_lock
);
1111 value
= copy
->stopped
;
1113 copy
->stopped
= true;
1114 spin_unlock(©
->cp_clp
->async_lock
);
1118 static void nfsd4_stop_copy(struct nfsd4_copy
*copy
)
1120 /* only 1 thread should stop the copy */
1121 if (!check_and_set_stop_copy(copy
))
1122 kthread_stop(copy
->copy_task
);
1123 nfs4_put_copy(copy
);
1126 static struct nfsd4_copy
*nfsd4_get_copy(struct nfs4_client
*clp
)
1128 struct nfsd4_copy
*copy
= NULL
;
1130 spin_lock(&clp
->async_lock
);
1131 if (!list_empty(&clp
->async_copies
)) {
1132 copy
= list_first_entry(&clp
->async_copies
, struct nfsd4_copy
,
1134 refcount_inc(©
->refcount
);
1136 spin_unlock(&clp
->async_lock
);
1140 void nfsd4_shutdown_copy(struct nfs4_client
*clp
)
1142 struct nfsd4_copy
*copy
;
1144 while ((copy
= nfsd4_get_copy(clp
)) != NULL
)
1145 nfsd4_stop_copy(copy
);
1147 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
1149 extern struct file
*nfs42_ssc_open(struct vfsmount
*ss_mnt
,
1150 struct nfs_fh
*src_fh
,
1151 nfs4_stateid
*stateid
);
1152 extern void nfs42_ssc_close(struct file
*filep
);
1154 extern void nfs_sb_deactive(struct super_block
*sb
);
1156 #define NFSD42_INTERSSC_MOUNTOPS "vers=4.2,addr=%s,sec=sys"
1159 * Support one copy source server for now.
1162 nfsd4_interssc_connect(struct nl4_server
*nss
, struct svc_rqst
*rqstp
,
1163 struct vfsmount
**mount
)
1165 struct file_system_type
*type
;
1166 struct vfsmount
*ss_mnt
;
1167 struct nfs42_netaddr
*naddr
;
1168 struct sockaddr_storage tmp_addr
;
1169 size_t tmp_addrlen
, match_netid_len
= 3;
1170 char *startsep
= "", *endsep
= "", *match_netid
= "tcp";
1171 char *ipaddr
, *dev_name
, *raw_data
;
1173 __be32 status
= nfserr_inval
;
1175 naddr
= &nss
->u
.nl4_addr
;
1176 tmp_addrlen
= rpc_uaddr2sockaddr(SVC_NET(rqstp
), naddr
->addr
,
1178 (struct sockaddr
*)&tmp_addr
,
1180 if (tmp_addrlen
== 0)
1183 if (tmp_addr
.ss_family
== AF_INET6
) {
1186 match_netid
= "tcp6";
1187 match_netid_len
= 4;
1190 if (naddr
->netid_len
!= match_netid_len
||
1191 strncmp(naddr
->netid
, match_netid
, naddr
->netid_len
))
1194 /* Construct the raw data for the vfs_kern_mount call */
1195 len
= RPC_MAX_ADDRBUFLEN
+ 1;
1196 ipaddr
= kzalloc(len
, GFP_KERNEL
);
1200 rpc_ntop((struct sockaddr
*)&tmp_addr
, ipaddr
, len
);
1202 /* 2 for ipv6 endsep and startsep. 3 for ":/" and trailing '/0'*/
1204 raw_len
= strlen(NFSD42_INTERSSC_MOUNTOPS
) + strlen(ipaddr
);
1205 raw_data
= kzalloc(raw_len
, GFP_KERNEL
);
1207 goto out_free_ipaddr
;
1209 snprintf(raw_data
, raw_len
, NFSD42_INTERSSC_MOUNTOPS
, ipaddr
);
1211 status
= nfserr_nodev
;
1212 type
= get_fs_type("nfs");
1214 goto out_free_rawdata
;
1216 /* Set the server:<export> for the vfs_kern_mount call */
1217 dev_name
= kzalloc(len
+ 5, GFP_KERNEL
);
1219 goto out_free_rawdata
;
1220 snprintf(dev_name
, len
+ 5, "%s%s%s:/", startsep
, ipaddr
, endsep
);
1222 /* Use an 'internal' mount: SB_KERNMOUNT -> MNT_INTERNAL */
1223 ss_mnt
= vfs_kern_mount(type
, SB_KERNMOUNT
, dev_name
, raw_data
);
1224 module_put(type
->owner
);
1226 goto out_free_devname
;
1242 nfsd4_interssc_disconnect(struct vfsmount
*ss_mnt
)
1244 nfs_sb_deactive(ss_mnt
->mnt_sb
);
1249 * Verify COPY destination stateid.
1251 * Connect to the source server with NFSv4.1.
1252 * Create the source struct file for nfsd_copy_range.
1253 * Called with COPY cstate:
1254 * SAVED_FH: source filehandle
1255 * CURRENT_FH: destination filehandle
1258 nfsd4_setup_inter_ssc(struct svc_rqst
*rqstp
,
1259 struct nfsd4_compound_state
*cstate
,
1260 struct nfsd4_copy
*copy
, struct vfsmount
**mount
)
1262 struct svc_fh
*s_fh
= NULL
;
1263 stateid_t
*s_stid
= ©
->cp_src_stateid
;
1264 __be32 status
= nfserr_inval
;
1266 /* Verify the destination stateid and set dst struct file*/
1267 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
1268 ©
->cp_dst_stateid
,
1269 WR_STATE
, ©
->nf_dst
, NULL
);
1273 status
= nfsd4_interssc_connect(©
->cp_src
, rqstp
, mount
);
1277 s_fh
= &cstate
->save_fh
;
1279 copy
->c_fh
.size
= s_fh
->fh_handle
.fh_size
;
1280 memcpy(copy
->c_fh
.data
, &s_fh
->fh_handle
.fh_base
, copy
->c_fh
.size
);
1281 copy
->stateid
.seqid
= cpu_to_be32(s_stid
->si_generation
);
1282 memcpy(copy
->stateid
.other
, (void *)&s_stid
->si_opaque
,
1283 sizeof(stateid_opaque_t
));
1291 nfsd4_cleanup_inter_ssc(struct vfsmount
*ss_mnt
, struct nfsd_file
*src
,
1292 struct nfsd_file
*dst
)
1294 nfs42_ssc_close(src
->nf_file
);
1300 #else /* CONFIG_NFSD_V4_2_INTER_SSC */
1303 nfsd4_setup_inter_ssc(struct svc_rqst
*rqstp
,
1304 struct nfsd4_compound_state
*cstate
,
1305 struct nfsd4_copy
*copy
,
1306 struct vfsmount
**mount
)
1309 return nfserr_inval
;
1313 nfsd4_cleanup_inter_ssc(struct vfsmount
*ss_mnt
, struct nfsd_file
*src
,
1314 struct nfsd_file
*dst
)
1319 nfsd4_interssc_disconnect(struct vfsmount
*ss_mnt
)
1323 static struct file
*nfs42_ssc_open(struct vfsmount
*ss_mnt
,
1324 struct nfs_fh
*src_fh
,
1325 nfs4_stateid
*stateid
)
1329 #endif /* CONFIG_NFSD_V4_2_INTER_SSC */
1332 nfsd4_setup_intra_ssc(struct svc_rqst
*rqstp
,
1333 struct nfsd4_compound_state
*cstate
,
1334 struct nfsd4_copy
*copy
)
1336 return nfsd4_verify_copy(rqstp
, cstate
, ©
->cp_src_stateid
,
1337 ©
->nf_src
, ©
->cp_dst_stateid
,
1342 nfsd4_cleanup_intra_ssc(struct nfsd_file
*src
, struct nfsd_file
*dst
)
1348 static void nfsd4_cb_offload_release(struct nfsd4_callback
*cb
)
1350 struct nfsd4_copy
*copy
= container_of(cb
, struct nfsd4_copy
, cp_cb
);
1352 nfs4_put_copy(copy
);
1355 static int nfsd4_cb_offload_done(struct nfsd4_callback
*cb
,
1356 struct rpc_task
*task
)
1361 static const struct nfsd4_callback_ops nfsd4_cb_offload_ops
= {
1362 .release
= nfsd4_cb_offload_release
,
1363 .done
= nfsd4_cb_offload_done
1366 static void nfsd4_init_copy_res(struct nfsd4_copy
*copy
, bool sync
)
1368 copy
->cp_res
.wr_stable_how
= NFS_UNSTABLE
;
1369 copy
->cp_synchronous
= sync
;
1370 gen_boot_verifier(©
->cp_res
.wr_verifier
, copy
->cp_clp
->net
);
1373 static ssize_t
_nfsd_copy_file_range(struct nfsd4_copy
*copy
)
1375 ssize_t bytes_copied
= 0;
1376 size_t bytes_total
= copy
->cp_count
;
1377 u64 src_pos
= copy
->cp_src_pos
;
1378 u64 dst_pos
= copy
->cp_dst_pos
;
1381 if (kthread_should_stop())
1383 bytes_copied
= nfsd_copy_file_range(copy
->nf_src
->nf_file
,
1384 src_pos
, copy
->nf_dst
->nf_file
, dst_pos
,
1386 if (bytes_copied
<= 0)
1388 bytes_total
-= bytes_copied
;
1389 copy
->cp_res
.wr_bytes_written
+= bytes_copied
;
1390 src_pos
+= bytes_copied
;
1391 dst_pos
+= bytes_copied
;
1392 } while (bytes_total
> 0 && !copy
->cp_synchronous
);
1393 return bytes_copied
;
1396 static __be32
nfsd4_do_copy(struct nfsd4_copy
*copy
, bool sync
)
1401 bytes
= _nfsd_copy_file_range(copy
);
1402 /* for async copy, we ignore the error, client can always retry
1405 if (bytes
< 0 && !copy
->cp_res
.wr_bytes_written
)
1406 status
= nfserrno(bytes
);
1408 nfsd4_init_copy_res(copy
, sync
);
1412 if (!copy
->cp_intra
) /* Inter server SSC */
1413 nfsd4_cleanup_inter_ssc(copy
->ss_mnt
, copy
->nf_src
,
1416 nfsd4_cleanup_intra_ssc(copy
->nf_src
, copy
->nf_dst
);
1421 static int dup_copy_fields(struct nfsd4_copy
*src
, struct nfsd4_copy
*dst
)
1423 dst
->cp_src_pos
= src
->cp_src_pos
;
1424 dst
->cp_dst_pos
= src
->cp_dst_pos
;
1425 dst
->cp_count
= src
->cp_count
;
1426 dst
->cp_synchronous
= src
->cp_synchronous
;
1427 memcpy(&dst
->cp_res
, &src
->cp_res
, sizeof(src
->cp_res
));
1428 memcpy(&dst
->fh
, &src
->fh
, sizeof(src
->fh
));
1429 dst
->cp_clp
= src
->cp_clp
;
1430 dst
->nf_dst
= nfsd_file_get(src
->nf_dst
);
1431 dst
->cp_intra
= src
->cp_intra
;
1432 if (src
->cp_intra
) /* for inter, file_src doesn't exist yet */
1433 dst
->nf_src
= nfsd_file_get(src
->nf_src
);
1435 memcpy(&dst
->cp_stateid
, &src
->cp_stateid
, sizeof(src
->cp_stateid
));
1436 memcpy(&dst
->cp_src
, &src
->cp_src
, sizeof(struct nl4_server
));
1437 memcpy(&dst
->stateid
, &src
->stateid
, sizeof(src
->stateid
));
1438 memcpy(&dst
->c_fh
, &src
->c_fh
, sizeof(src
->c_fh
));
1439 dst
->ss_mnt
= src
->ss_mnt
;
1444 static void cleanup_async_copy(struct nfsd4_copy
*copy
)
1446 nfs4_free_copy_state(copy
);
1447 nfsd_file_put(copy
->nf_dst
);
1449 nfsd_file_put(copy
->nf_src
);
1450 spin_lock(©
->cp_clp
->async_lock
);
1451 list_del(©
->copies
);
1452 spin_unlock(©
->cp_clp
->async_lock
);
1453 nfs4_put_copy(copy
);
1456 static int nfsd4_do_async_copy(void *data
)
1458 struct nfsd4_copy
*copy
= (struct nfsd4_copy
*)data
;
1459 struct nfsd4_copy
*cb_copy
;
1461 if (!copy
->cp_intra
) { /* Inter server SSC */
1462 copy
->nf_src
= kzalloc(sizeof(struct nfsd_file
), GFP_KERNEL
);
1463 if (!copy
->nf_src
) {
1464 copy
->nfserr
= nfserr_serverfault
;
1465 nfsd4_interssc_disconnect(copy
->ss_mnt
);
1468 copy
->nf_src
->nf_file
= nfs42_ssc_open(copy
->ss_mnt
, ©
->c_fh
,
1470 if (IS_ERR(copy
->nf_src
->nf_file
)) {
1471 copy
->nfserr
= nfserr_offload_denied
;
1472 nfsd4_interssc_disconnect(copy
->ss_mnt
);
1477 copy
->nfserr
= nfsd4_do_copy(copy
, 0);
1479 cb_copy
= kzalloc(sizeof(struct nfsd4_copy
), GFP_KERNEL
);
1482 memcpy(&cb_copy
->cp_res
, ©
->cp_res
, sizeof(copy
->cp_res
));
1483 cb_copy
->cp_clp
= copy
->cp_clp
;
1484 cb_copy
->nfserr
= copy
->nfserr
;
1485 memcpy(&cb_copy
->fh
, ©
->fh
, sizeof(copy
->fh
));
1486 nfsd4_init_cb(&cb_copy
->cp_cb
, cb_copy
->cp_clp
,
1487 &nfsd4_cb_offload_ops
, NFSPROC4_CLNT_CB_OFFLOAD
);
1488 nfsd4_run_cb(&cb_copy
->cp_cb
);
1490 if (!copy
->cp_intra
)
1491 kfree(copy
->nf_src
);
1492 cleanup_async_copy(copy
);
1497 nfsd4_copy(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1498 union nfsd4_op_u
*u
)
1500 struct nfsd4_copy
*copy
= &u
->copy
;
1502 struct nfsd4_copy
*async_copy
= NULL
;
1504 if (!copy
->cp_intra
) { /* Inter server SSC */
1505 if (!inter_copy_offload_enable
|| copy
->cp_synchronous
) {
1506 status
= nfserr_notsupp
;
1509 status
= nfsd4_setup_inter_ssc(rqstp
, cstate
, copy
,
1512 return nfserr_offload_denied
;
1514 status
= nfsd4_setup_intra_ssc(rqstp
, cstate
, copy
);
1519 copy
->cp_clp
= cstate
->clp
;
1520 memcpy(©
->fh
, &cstate
->current_fh
.fh_handle
,
1521 sizeof(struct knfsd_fh
));
1522 if (!copy
->cp_synchronous
) {
1523 struct nfsd_net
*nn
= net_generic(SVC_NET(rqstp
), nfsd_net_id
);
1525 status
= nfserrno(-ENOMEM
);
1526 async_copy
= kzalloc(sizeof(struct nfsd4_copy
), GFP_KERNEL
);
1529 if (!nfs4_init_copy_state(nn
, copy
))
1531 refcount_set(&async_copy
->refcount
, 1);
1532 memcpy(©
->cp_res
.cb_stateid
, ©
->cp_stateid
,
1533 sizeof(copy
->cp_stateid
));
1534 status
= dup_copy_fields(copy
, async_copy
);
1537 async_copy
->copy_task
= kthread_create(nfsd4_do_async_copy
,
1538 async_copy
, "%s", "copy thread");
1539 if (IS_ERR(async_copy
->copy_task
))
1541 spin_lock(&async_copy
->cp_clp
->async_lock
);
1542 list_add(&async_copy
->copies
,
1543 &async_copy
->cp_clp
->async_copies
);
1544 spin_unlock(&async_copy
->cp_clp
->async_lock
);
1545 wake_up_process(async_copy
->copy_task
);
1548 status
= nfsd4_do_copy(copy
, 1);
1554 cleanup_async_copy(async_copy
);
1555 status
= nfserrno(-ENOMEM
);
1556 if (!copy
->cp_intra
)
1557 nfsd4_interssc_disconnect(copy
->ss_mnt
);
1562 find_async_copy(struct nfs4_client
*clp
, stateid_t
*stateid
)
1564 struct nfsd4_copy
*copy
;
1566 spin_lock(&clp
->async_lock
);
1567 list_for_each_entry(copy
, &clp
->async_copies
, copies
) {
1568 if (memcmp(©
->cp_stateid
.stid
, stateid
, NFS4_STATEID_SIZE
))
1570 refcount_inc(©
->refcount
);
1571 spin_unlock(&clp
->async_lock
);
1574 spin_unlock(&clp
->async_lock
);
1579 nfsd4_offload_cancel(struct svc_rqst
*rqstp
,
1580 struct nfsd4_compound_state
*cstate
,
1581 union nfsd4_op_u
*u
)
1583 struct nfsd4_offload_status
*os
= &u
->offload_status
;
1584 struct nfsd4_copy
*copy
;
1585 struct nfs4_client
*clp
= cstate
->clp
;
1587 copy
= find_async_copy(clp
, &os
->stateid
);
1589 struct nfsd_net
*nn
= net_generic(SVC_NET(rqstp
), nfsd_net_id
);
1591 return manage_cpntf_state(nn
, &os
->stateid
, clp
, NULL
);
1593 nfsd4_stop_copy(copy
);
1599 nfsd4_copy_notify(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1600 union nfsd4_op_u
*u
)
1602 struct nfsd4_copy_notify
*cn
= &u
->copy_notify
;
1604 struct nfsd_net
*nn
= net_generic(SVC_NET(rqstp
), nfsd_net_id
);
1605 struct nfs4_stid
*stid
;
1606 struct nfs4_cpntf_state
*cps
;
1607 struct nfs4_client
*clp
= cstate
->clp
;
1609 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
1610 &cn
->cpn_src_stateid
, RD_STATE
, NULL
,
1615 cn
->cpn_sec
= nn
->nfsd4_lease
;
1618 status
= nfserrno(-ENOMEM
);
1619 cps
= nfs4_alloc_init_cpntf_state(nn
, stid
);
1622 memcpy(&cn
->cpn_cnr_stateid
, &cps
->cp_stateid
.stid
, sizeof(stateid_t
));
1623 memcpy(&cps
->cp_p_stateid
, &stid
->sc_stateid
, sizeof(stateid_t
));
1624 memcpy(&cps
->cp_p_clid
, &clp
->cl_clientid
, sizeof(clientid_t
));
1626 /* For now, only return one server address in cpn_src, the
1627 * address used by the client to connect to this server.
1629 cn
->cpn_src
.nl4_type
= NL4_NETADDR
;
1630 status
= nfsd4_set_netaddr((struct sockaddr
*)&rqstp
->rq_daddr
,
1631 &cn
->cpn_src
.u
.nl4_addr
);
1632 WARN_ON_ONCE(status
);
1634 nfs4_put_cpntf_state(nn
, cps
);
1638 nfs4_put_stid(stid
);
1643 nfsd4_fallocate(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1644 struct nfsd4_fallocate
*fallocate
, int flags
)
1647 struct nfsd_file
*nf
;
1649 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
1650 &fallocate
->falloc_stateid
,
1651 WR_STATE
, &nf
, NULL
);
1652 if (status
!= nfs_ok
) {
1653 dprintk("NFSD: nfsd4_fallocate: couldn't process stateid!\n");
1657 status
= nfsd4_vfs_fallocate(rqstp
, &cstate
->current_fh
, nf
->nf_file
,
1658 fallocate
->falloc_offset
,
1659 fallocate
->falloc_length
,
1665 nfsd4_offload_status(struct svc_rqst
*rqstp
,
1666 struct nfsd4_compound_state
*cstate
,
1667 union nfsd4_op_u
*u
)
1669 struct nfsd4_offload_status
*os
= &u
->offload_status
;
1671 struct nfsd4_copy
*copy
;
1672 struct nfs4_client
*clp
= cstate
->clp
;
1674 copy
= find_async_copy(clp
, &os
->stateid
);
1676 os
->count
= copy
->cp_res
.wr_bytes_written
;
1677 nfs4_put_copy(copy
);
1679 status
= nfserr_bad_stateid
;
1685 nfsd4_allocate(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1686 union nfsd4_op_u
*u
)
1688 return nfsd4_fallocate(rqstp
, cstate
, &u
->allocate
, 0);
1692 nfsd4_deallocate(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1693 union nfsd4_op_u
*u
)
1695 return nfsd4_fallocate(rqstp
, cstate
, &u
->deallocate
,
1696 FALLOC_FL_PUNCH_HOLE
| FALLOC_FL_KEEP_SIZE
);
1700 nfsd4_seek(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1701 union nfsd4_op_u
*u
)
1703 struct nfsd4_seek
*seek
= &u
->seek
;
1706 struct nfsd_file
*nf
;
1708 status
= nfs4_preprocess_stateid_op(rqstp
, cstate
, &cstate
->current_fh
,
1709 &seek
->seek_stateid
,
1710 RD_STATE
, &nf
, NULL
);
1712 dprintk("NFSD: nfsd4_seek: couldn't process stateid!\n");
1716 switch (seek
->seek_whence
) {
1717 case NFS4_CONTENT_DATA
:
1720 case NFS4_CONTENT_HOLE
:
1724 status
= nfserr_union_notsupp
;
1729 * Note: This call does change file->f_pos, but nothing in NFSD
1730 * should ever file->f_pos.
1732 seek
->seek_pos
= vfs_llseek(nf
->nf_file
, seek
->seek_offset
, whence
);
1733 if (seek
->seek_pos
< 0)
1734 status
= nfserrno(seek
->seek_pos
);
1735 else if (seek
->seek_pos
>= i_size_read(file_inode(nf
->nf_file
)))
1736 seek
->seek_eof
= true;
1743 /* This routine never returns NFS_OK! If there are no other errors, it
1744 * will return NFSERR_SAME or NFSERR_NOT_SAME depending on whether the
1745 * attributes matched. VERIFY is implemented by mapping NFSERR_SAME
1746 * to NFS_OK after the call; NVERIFY by mapping NFSERR_NOT_SAME to NFS_OK.
1749 _nfsd4_verify(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1750 struct nfsd4_verify
*verify
)
1756 status
= fh_verify(rqstp
, &cstate
->current_fh
, 0, NFSD_MAY_NOP
);
1760 status
= check_attr_support(rqstp
, cstate
, verify
->ve_bmval
, NULL
);
1764 if ((verify
->ve_bmval
[0] & FATTR4_WORD0_RDATTR_ERROR
)
1765 || (verify
->ve_bmval
[1] & NFSD_WRITEONLY_ATTRS_WORD1
))
1766 return nfserr_inval
;
1767 if (verify
->ve_attrlen
& 3)
1768 return nfserr_inval
;
1771 * bitmap_len(1) + bitmap(2) + attr_len(1) = 4
1773 count
= 4 + (verify
->ve_attrlen
>> 2);
1774 buf
= kmalloc(count
<< 2, GFP_KERNEL
);
1776 return nfserr_jukebox
;
1779 status
= nfsd4_encode_fattr_to_buf(&p
, count
, &cstate
->current_fh
,
1780 cstate
->current_fh
.fh_export
,
1781 cstate
->current_fh
.fh_dentry
,
1785 * If nfsd4_encode_fattr() ran out of space, assume that's because
1786 * the attributes are longer (hence different) than those given:
1788 if (status
== nfserr_resource
)
1789 status
= nfserr_not_same
;
1794 p
= buf
+ 1 + ntohl(buf
[0]);
1795 status
= nfserr_not_same
;
1796 if (ntohl(*p
++) != verify
->ve_attrlen
)
1798 if (!memcmp(p
, verify
->ve_attrval
, verify
->ve_attrlen
))
1799 status
= nfserr_same
;
1807 nfsd4_nverify(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1808 union nfsd4_op_u
*u
)
1812 status
= _nfsd4_verify(rqstp
, cstate
, &u
->verify
);
1813 return status
== nfserr_not_same
? nfs_ok
: status
;
1817 nfsd4_verify(struct svc_rqst
*rqstp
, struct nfsd4_compound_state
*cstate
,
1818 union nfsd4_op_u
*u
)
1822 status
= _nfsd4_verify(rqstp
, cstate
, &u
->nverify
);
1823 return status
== nfserr_same
? nfs_ok
: status
;
1826 #ifdef CONFIG_NFSD_PNFS
1827 static const struct nfsd4_layout_ops
*
1828 nfsd4_layout_verify(struct svc_export
*exp
, unsigned int layout_type
)
1830 if (!exp
->ex_layout_types
) {
1831 dprintk("%s: export does not support pNFS\n", __func__
);
1835 if (layout_type
>= LAYOUT_TYPE_MAX
||
1836 !(exp
->ex_layout_types
& (1 << layout_type
))) {
1837 dprintk("%s: layout type %d not supported\n",
1838 __func__
, layout_type
);
1842 return nfsd4_layout_ops
[layout_type
];
1846 nfsd4_getdeviceinfo(struct svc_rqst
*rqstp
,
1847 struct nfsd4_compound_state
*cstate
, union nfsd4_op_u
*u
)
1849 struct nfsd4_getdeviceinfo
*gdp
= &u
->getdeviceinfo
;
1850 const struct nfsd4_layout_ops
*ops
;
1851 struct nfsd4_deviceid_map
*map
;
1852 struct svc_export
*exp
;
1855 dprintk("%s: layout_type %u dev_id [0x%llx:0x%x] maxcnt %u\n",
1857 gdp
->gd_layout_type
,
1858 gdp
->gd_devid
.fsid_idx
, gdp
->gd_devid
.generation
,
1861 map
= nfsd4_find_devid_map(gdp
->gd_devid
.fsid_idx
);
1863 dprintk("%s: couldn't find device ID to export mapping!\n",
1865 return nfserr_noent
;
1868 exp
= rqst_exp_find(rqstp
, map
->fsid_type
, map
->fsid
);
1870 dprintk("%s: could not find device id\n", __func__
);
1871 return nfserr_noent
;
1874 nfserr
= nfserr_layoutunavailable
;
1875 ops
= nfsd4_layout_verify(exp
, gdp
->gd_layout_type
);
1880 if (gdp
->gd_maxcount
!= 0) {
1881 nfserr
= ops
->proc_getdeviceinfo(exp
->ex_path
.mnt
->mnt_sb
,
1882 rqstp
, cstate
->session
->se_client
, gdp
);
1885 gdp
->gd_notify_types
&= ops
->notify_types
;
1892 nfsd4_getdeviceinfo_release(union nfsd4_op_u
*u
)
1894 kfree(u
->getdeviceinfo
.gd_device
);
1898 nfsd4_layoutget(struct svc_rqst
*rqstp
,
1899 struct nfsd4_compound_state
*cstate
, union nfsd4_op_u
*u
)
1901 struct nfsd4_layoutget
*lgp
= &u
->layoutget
;
1902 struct svc_fh
*current_fh
= &cstate
->current_fh
;
1903 const struct nfsd4_layout_ops
*ops
;
1904 struct nfs4_layout_stateid
*ls
;
1906 int accmode
= NFSD_MAY_READ_IF_EXEC
;
1908 switch (lgp
->lg_seg
.iomode
) {
1910 accmode
|= NFSD_MAY_READ
;
1913 accmode
|= NFSD_MAY_READ
| NFSD_MAY_WRITE
;
1916 dprintk("%s: invalid iomode %d\n",
1917 __func__
, lgp
->lg_seg
.iomode
);
1918 nfserr
= nfserr_badiomode
;
1922 nfserr
= fh_verify(rqstp
, current_fh
, 0, accmode
);
1926 nfserr
= nfserr_layoutunavailable
;
1927 ops
= nfsd4_layout_verify(current_fh
->fh_export
, lgp
->lg_layout_type
);
1932 * Verify minlength and range as per RFC5661:
1933 * o If loga_length is less than loga_minlength,
1934 * the metadata server MUST return NFS4ERR_INVAL.
1935 * o If the sum of loga_offset and loga_minlength exceeds
1936 * NFS4_UINT64_MAX, and loga_minlength is not
1937 * NFS4_UINT64_MAX, the error NFS4ERR_INVAL MUST result.
1938 * o If the sum of loga_offset and loga_length exceeds
1939 * NFS4_UINT64_MAX, and loga_length is not NFS4_UINT64_MAX,
1940 * the error NFS4ERR_INVAL MUST result.
1942 nfserr
= nfserr_inval
;
1943 if (lgp
->lg_seg
.length
< lgp
->lg_minlength
||
1944 (lgp
->lg_minlength
!= NFS4_MAX_UINT64
&&
1945 lgp
->lg_minlength
> NFS4_MAX_UINT64
- lgp
->lg_seg
.offset
) ||
1946 (lgp
->lg_seg
.length
!= NFS4_MAX_UINT64
&&
1947 lgp
->lg_seg
.length
> NFS4_MAX_UINT64
- lgp
->lg_seg
.offset
))
1949 if (lgp
->lg_seg
.length
== 0)
1952 nfserr
= nfsd4_preprocess_layout_stateid(rqstp
, cstate
, &lgp
->lg_sid
,
1953 true, lgp
->lg_layout_type
, &ls
);
1955 trace_nfsd_layout_get_lookup_fail(&lgp
->lg_sid
);
1959 nfserr
= nfserr_recallconflict
;
1960 if (atomic_read(&ls
->ls_stid
.sc_file
->fi_lo_recalls
))
1963 nfserr
= ops
->proc_layoutget(d_inode(current_fh
->fh_dentry
),
1968 nfserr
= nfsd4_insert_layout(lgp
, ls
);
1971 mutex_unlock(&ls
->ls_mutex
);
1972 nfs4_put_stid(&ls
->ls_stid
);
1978 nfsd4_layoutget_release(union nfsd4_op_u
*u
)
1980 kfree(u
->layoutget
.lg_content
);
1984 nfsd4_layoutcommit(struct svc_rqst
*rqstp
,
1985 struct nfsd4_compound_state
*cstate
, union nfsd4_op_u
*u
)
1987 struct nfsd4_layoutcommit
*lcp
= &u
->layoutcommit
;
1988 const struct nfsd4_layout_seg
*seg
= &lcp
->lc_seg
;
1989 struct svc_fh
*current_fh
= &cstate
->current_fh
;
1990 const struct nfsd4_layout_ops
*ops
;
1991 loff_t new_size
= lcp
->lc_last_wr
+ 1;
1992 struct inode
*inode
;
1993 struct nfs4_layout_stateid
*ls
;
1996 nfserr
= fh_verify(rqstp
, current_fh
, 0, NFSD_MAY_WRITE
);
2000 nfserr
= nfserr_layoutunavailable
;
2001 ops
= nfsd4_layout_verify(current_fh
->fh_export
, lcp
->lc_layout_type
);
2004 inode
= d_inode(current_fh
->fh_dentry
);
2006 nfserr
= nfserr_inval
;
2007 if (new_size
<= seg
->offset
) {
2008 dprintk("pnfsd: last write before layout segment\n");
2011 if (new_size
> seg
->offset
+ seg
->length
) {
2012 dprintk("pnfsd: last write beyond layout segment\n");
2015 if (!lcp
->lc_newoffset
&& new_size
> i_size_read(inode
)) {
2016 dprintk("pnfsd: layoutcommit beyond EOF\n");
2020 nfserr
= nfsd4_preprocess_layout_stateid(rqstp
, cstate
, &lcp
->lc_sid
,
2021 false, lcp
->lc_layout_type
,
2024 trace_nfsd_layout_commit_lookup_fail(&lcp
->lc_sid
);
2025 /* fixup error code as per RFC5661 */
2026 if (nfserr
== nfserr_bad_stateid
)
2027 nfserr
= nfserr_badlayout
;
2031 /* LAYOUTCOMMIT does not require any serialization */
2032 mutex_unlock(&ls
->ls_mutex
);
2034 if (new_size
> i_size_read(inode
)) {
2035 lcp
->lc_size_chg
= 1;
2036 lcp
->lc_newsize
= new_size
;
2038 lcp
->lc_size_chg
= 0;
2041 nfserr
= ops
->proc_layoutcommit(inode
, lcp
);
2042 nfs4_put_stid(&ls
->ls_stid
);
2048 nfsd4_layoutreturn(struct svc_rqst
*rqstp
,
2049 struct nfsd4_compound_state
*cstate
, union nfsd4_op_u
*u
)
2051 struct nfsd4_layoutreturn
*lrp
= &u
->layoutreturn
;
2052 struct svc_fh
*current_fh
= &cstate
->current_fh
;
2055 nfserr
= fh_verify(rqstp
, current_fh
, 0, NFSD_MAY_NOP
);
2059 nfserr
= nfserr_layoutunavailable
;
2060 if (!nfsd4_layout_verify(current_fh
->fh_export
, lrp
->lr_layout_type
))
2063 switch (lrp
->lr_seg
.iomode
) {
2069 dprintk("%s: invalid iomode %d\n", __func__
,
2070 lrp
->lr_seg
.iomode
);
2071 nfserr
= nfserr_inval
;
2075 switch (lrp
->lr_return_type
) {
2077 nfserr
= nfsd4_return_file_layouts(rqstp
, cstate
, lrp
);
2081 nfserr
= nfsd4_return_client_layouts(rqstp
, cstate
, lrp
);
2084 dprintk("%s: invalid return_type %d\n", __func__
,
2085 lrp
->lr_return_type
);
2086 nfserr
= nfserr_inval
;
2092 #endif /* CONFIG_NFSD_PNFS */
2098 nfsd4_proc_null(struct svc_rqst
*rqstp
)
2103 static inline void nfsd4_increment_op_stats(u32 opnum
)
2105 if (opnum
>= FIRST_NFS4_OP
&& opnum
<= LAST_NFS4_OP
)
2106 nfsdstats
.nfs4_opcount
[opnum
]++;
2109 static const struct nfsd4_operation nfsd4_ops
[];
2111 static const char *nfsd4_op_name(unsigned opnum
);
2114 * Enforce NFSv4.1 COMPOUND ordering rules:
2116 * Also note, enforced elsewhere:
2117 * - SEQUENCE other than as first op results in
2118 * NFS4ERR_SEQUENCE_POS. (Enforced in nfsd4_sequence().)
2119 * - BIND_CONN_TO_SESSION must be the only op in its compound.
2120 * (Enforced in nfsd4_bind_conn_to_session().)
2121 * - DESTROY_SESSION must be the final operation in a compound, if
2122 * sessionid's in SEQUENCE and DESTROY_SESSION are the same.
2123 * (Enforced in nfsd4_destroy_session().)
2125 static __be32
nfs41_check_op_ordering(struct nfsd4_compoundargs
*args
)
2127 struct nfsd4_op
*first_op
= &args
->ops
[0];
2129 /* These ordering requirements don't apply to NFSv4.0: */
2130 if (args
->minorversion
== 0)
2132 /* This is weird, but OK, not our problem: */
2133 if (args
->opcnt
== 0)
2135 if (first_op
->status
== nfserr_op_illegal
)
2137 if (!(nfsd4_ops
[first_op
->opnum
].op_flags
& ALLOWED_AS_FIRST_OP
))
2138 return nfserr_op_not_in_session
;
2139 if (first_op
->opnum
== OP_SEQUENCE
)
2142 * So first_op is something allowed outside a session, like
2143 * EXCHANGE_ID; but then it has to be the only op in the
2146 if (args
->opcnt
!= 1)
2147 return nfserr_not_only_op
;
2151 const struct nfsd4_operation
*OPDESC(struct nfsd4_op
*op
)
2153 return &nfsd4_ops
[op
->opnum
];
2156 bool nfsd4_cache_this_op(struct nfsd4_op
*op
)
2158 if (op
->opnum
== OP_ILLEGAL
)
2160 return OPDESC(op
)->op_flags
& OP_CACHEME
;
2163 static bool need_wrongsec_check(struct svc_rqst
*rqstp
)
2165 struct nfsd4_compoundres
*resp
= rqstp
->rq_resp
;
2166 struct nfsd4_compoundargs
*argp
= rqstp
->rq_argp
;
2167 struct nfsd4_op
*this = &argp
->ops
[resp
->opcnt
- 1];
2168 struct nfsd4_op
*next
= &argp
->ops
[resp
->opcnt
];
2169 const struct nfsd4_operation
*thisd
= OPDESC(this);
2170 const struct nfsd4_operation
*nextd
;
2173 * Most ops check wronsec on our own; only the putfh-like ops
2174 * have special rules.
2176 if (!(thisd
->op_flags
& OP_IS_PUTFH_LIKE
))
2179 * rfc 5661 2.6.3.1.1.6: don't bother erroring out a
2180 * put-filehandle operation if we're not going to use the
2183 if (argp
->opcnt
== resp
->opcnt
)
2185 if (next
->opnum
== OP_ILLEGAL
)
2187 nextd
= OPDESC(next
);
2189 * Rest of 2.6.3.1.1: certain operations will return WRONGSEC
2190 * errors themselves as necessary; others should check for them
2193 return !(nextd
->op_flags
& OP_HANDLES_WRONGSEC
);
2196 static void svcxdr_init_encode(struct svc_rqst
*rqstp
,
2197 struct nfsd4_compoundres
*resp
)
2199 struct xdr_stream
*xdr
= &resp
->xdr
;
2200 struct xdr_buf
*buf
= &rqstp
->rq_res
;
2201 struct kvec
*head
= buf
->head
;
2205 xdr
->p
= head
->iov_base
+ head
->iov_len
;
2206 xdr
->end
= head
->iov_base
+ PAGE_SIZE
- rqstp
->rq_auth_slack
;
2207 /* Tail and page_len should be zero at this point: */
2208 buf
->len
= buf
->head
[0].iov_len
;
2209 xdr
->scratch
.iov_len
= 0;
2210 xdr
->page_ptr
= buf
->pages
- 1;
2211 buf
->buflen
= PAGE_SIZE
* (1 + rqstp
->rq_page_end
- buf
->pages
)
2212 - rqstp
->rq_auth_slack
;
2215 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
2217 check_if_stalefh_allowed(struct nfsd4_compoundargs
*args
)
2219 struct nfsd4_op
*op
, *current_op
= NULL
, *saved_op
= NULL
;
2220 struct nfsd4_copy
*copy
;
2221 struct nfsd4_putfh
*putfh
;
2224 /* traverse all operation and if it's a COPY compound, mark the
2225 * source filehandle to skip verification
2227 for (i
= 0; i
< args
->opcnt
; i
++) {
2229 if (op
->opnum
== OP_PUTFH
)
2231 else if (op
->opnum
== OP_SAVEFH
)
2232 saved_op
= current_op
;
2233 else if (op
->opnum
== OP_RESTOREFH
)
2234 current_op
= saved_op
;
2235 else if (op
->opnum
== OP_COPY
) {
2236 copy
= (struct nfsd4_copy
*)&op
->u
;
2238 op
->status
= nfserr_nofilehandle
;
2241 putfh
= (struct nfsd4_putfh
*)&saved_op
->u
;
2242 if (!copy
->cp_intra
)
2243 putfh
->no_verify
= true;
2249 check_if_stalefh_allowed(struct nfsd4_compoundargs
*args
)
2258 nfsd4_proc_compound(struct svc_rqst
*rqstp
)
2260 struct nfsd4_compoundargs
*args
= rqstp
->rq_argp
;
2261 struct nfsd4_compoundres
*resp
= rqstp
->rq_resp
;
2262 struct nfsd4_op
*op
;
2263 struct nfsd4_compound_state
*cstate
= &resp
->cstate
;
2264 struct svc_fh
*current_fh
= &cstate
->current_fh
;
2265 struct svc_fh
*save_fh
= &cstate
->save_fh
;
2266 struct nfsd_net
*nn
= net_generic(SVC_NET(rqstp
), nfsd_net_id
);
2269 svcxdr_init_encode(rqstp
, resp
);
2270 resp
->tagp
= resp
->xdr
.p
;
2271 /* reserve space for: taglen, tag, and opcnt */
2272 xdr_reserve_space(&resp
->xdr
, 8 + args
->taglen
);
2273 resp
->taglen
= args
->taglen
;
2274 resp
->tag
= args
->tag
;
2275 resp
->rqstp
= rqstp
;
2276 cstate
->minorversion
= args
->minorversion
;
2277 fh_init(current_fh
, NFS4_FHSIZE
);
2278 fh_init(save_fh
, NFS4_FHSIZE
);
2280 * Don't use the deferral mechanism for NFSv4; compounds make it
2281 * too hard to avoid non-idempotency problems.
2283 clear_bit(RQ_USEDEFERRAL
, &rqstp
->rq_flags
);
2286 * According to RFC3010, this takes precedence over all other errors.
2288 status
= nfserr_minor_vers_mismatch
;
2289 if (nfsd_minorversion(nn
, args
->minorversion
, NFSD_TEST
) <= 0)
2291 status
= nfserr_resource
;
2292 if (args
->opcnt
> NFSD_MAX_OPS_PER_COMPOUND
)
2295 status
= nfs41_check_op_ordering(args
);
2298 op
->status
= status
;
2302 check_if_stalefh_allowed(args
);
2304 rqstp
->rq_lease_breaker
= (void **)&cstate
->clp
;
2306 trace_nfsd_compound(rqstp
, args
->opcnt
);
2307 while (!status
&& resp
->opcnt
< args
->opcnt
) {
2308 op
= &args
->ops
[resp
->opcnt
++];
2311 * The XDR decode routines may have pre-set op->status;
2312 * for example, if there is a miscellaneous XDR error
2313 * it will be set to nfserr_bad_xdr.
2316 if (op
->opnum
== OP_OPEN
)
2317 op
->status
= nfsd4_open_omfg(rqstp
, cstate
, op
);
2320 if (!current_fh
->fh_dentry
&&
2321 !HAS_FH_FLAG(current_fh
, NFSD4_FH_FOREIGN
)) {
2322 if (!(op
->opdesc
->op_flags
& ALLOWED_WITHOUT_FH
)) {
2323 op
->status
= nfserr_nofilehandle
;
2326 } else if (current_fh
->fh_export
&&
2327 current_fh
->fh_export
->ex_fslocs
.migrated
&&
2328 !(op
->opdesc
->op_flags
& ALLOWED_ON_ABSENT_FS
)) {
2329 op
->status
= nfserr_moved
;
2333 fh_clear_wcc(current_fh
);
2335 /* If op is non-idempotent */
2336 if (op
->opdesc
->op_flags
& OP_MODIFIES_SOMETHING
) {
2338 * Don't execute this op if we couldn't encode a
2341 u32 plen
= op
->opdesc
->op_rsize_bop(rqstp
, op
);
2343 * Plus if there's another operation, make sure
2344 * we'll have space to at least encode an error:
2346 if (resp
->opcnt
< args
->opcnt
)
2347 plen
+= COMPOUND_ERR_SLACK_SPACE
;
2348 op
->status
= nfsd4_check_resp_size(resp
, plen
);
2354 if (op
->opdesc
->op_get_currentstateid
)
2355 op
->opdesc
->op_get_currentstateid(cstate
, &op
->u
);
2356 op
->status
= op
->opdesc
->op_func(rqstp
, cstate
, &op
->u
);
2358 /* Only from SEQUENCE */
2359 if (cstate
->status
== nfserr_replay_cache
) {
2360 dprintk("%s NFS4.1 replay from cache\n", __func__
);
2361 status
= op
->status
;
2365 if (op
->opdesc
->op_set_currentstateid
)
2366 op
->opdesc
->op_set_currentstateid(cstate
, &op
->u
);
2368 if (op
->opdesc
->op_flags
& OP_CLEAR_STATEID
)
2369 clear_current_stateid(cstate
);
2371 if (current_fh
->fh_export
&&
2372 need_wrongsec_check(rqstp
))
2373 op
->status
= check_nfsd_access(current_fh
->fh_export
, rqstp
);
2376 if (op
->status
== nfserr_replay_me
) {
2377 op
->replay
= &cstate
->replay_owner
->so_replay
;
2378 nfsd4_encode_replay(&resp
->xdr
, op
);
2379 status
= op
->status
= op
->replay
->rp_status
;
2381 nfsd4_encode_operation(resp
, op
);
2382 status
= op
->status
;
2385 trace_nfsd_compound_status(args
->opcnt
, resp
->opcnt
, status
,
2386 nfsd4_op_name(op
->opnum
));
2388 nfsd4_cstate_clear_replay(cstate
);
2389 nfsd4_increment_op_stats(op
->opnum
);
2392 cstate
->status
= status
;
2395 BUG_ON(cstate
->replay_owner
);
2397 /* Reset deferral mechanism for RPC deferrals */
2398 set_bit(RQ_USEDEFERRAL
, &rqstp
->rq_flags
);
2399 dprintk("nfsv4 compound returned %d\n", ntohl(status
));
2403 #define op_encode_hdr_size (2)
2404 #define op_encode_stateid_maxsz (XDR_QUADLEN(NFS4_STATEID_SIZE))
2405 #define op_encode_verifier_maxsz (XDR_QUADLEN(NFS4_VERIFIER_SIZE))
2406 #define op_encode_change_info_maxsz (5)
2407 #define nfs4_fattr_bitmap_maxsz (4)
2409 /* We'll fall back on returning no lockowner if run out of space: */
2410 #define op_encode_lockowner_maxsz (0)
2411 #define op_encode_lock_denied_maxsz (8 + op_encode_lockowner_maxsz)
2413 #define nfs4_owner_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ))
2415 #define op_encode_ace_maxsz (3 + nfs4_owner_maxsz)
2416 #define op_encode_delegation_maxsz (1 + op_encode_stateid_maxsz + 1 + \
2417 op_encode_ace_maxsz)
2419 #define op_encode_channel_attrs_maxsz (6 + 1 + 1)
2421 static inline u32
nfsd4_only_status_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2423 return (op_encode_hdr_size
) * sizeof(__be32
);
2426 static inline u32
nfsd4_status_stateid_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2428 return (op_encode_hdr_size
+ op_encode_stateid_maxsz
)* sizeof(__be32
);
2431 static inline u32
nfsd4_access_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2433 /* ac_supported, ac_resp_access */
2434 return (op_encode_hdr_size
+ 2)* sizeof(__be32
);
2437 static inline u32
nfsd4_commit_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2439 return (op_encode_hdr_size
+ op_encode_verifier_maxsz
) * sizeof(__be32
);
2442 static inline u32
nfsd4_create_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2444 return (op_encode_hdr_size
+ op_encode_change_info_maxsz
2445 + nfs4_fattr_bitmap_maxsz
) * sizeof(__be32
);
2449 * Note since this is an idempotent operation we won't insist on failing
2450 * the op prematurely if the estimate is too large. We may turn off splice
2451 * reads unnecessarily.
2453 static inline u32
nfsd4_getattr_rsize(struct svc_rqst
*rqstp
,
2454 struct nfsd4_op
*op
)
2456 u32
*bmap
= op
->u
.getattr
.ga_bmval
;
2457 u32 bmap0
= bmap
[0], bmap1
= bmap
[1], bmap2
= bmap
[2];
2460 if (bmap0
& FATTR4_WORD0_ACL
)
2461 return svc_max_payload(rqstp
);
2462 if (bmap0
& FATTR4_WORD0_FS_LOCATIONS
)
2463 return svc_max_payload(rqstp
);
2465 if (bmap1
& FATTR4_WORD1_OWNER
) {
2466 ret
+= IDMAP_NAMESZ
+ 4;
2467 bmap1
&= ~FATTR4_WORD1_OWNER
;
2469 if (bmap1
& FATTR4_WORD1_OWNER_GROUP
) {
2470 ret
+= IDMAP_NAMESZ
+ 4;
2471 bmap1
&= ~FATTR4_WORD1_OWNER_GROUP
;
2473 if (bmap0
& FATTR4_WORD0_FILEHANDLE
) {
2474 ret
+= NFS4_FHSIZE
+ 4;
2475 bmap0
&= ~FATTR4_WORD0_FILEHANDLE
;
2477 if (bmap2
& FATTR4_WORD2_SECURITY_LABEL
) {
2478 ret
+= NFS4_MAXLABELLEN
+ 12;
2479 bmap2
&= ~FATTR4_WORD2_SECURITY_LABEL
;
2482 * Largest of remaining attributes are 16 bytes (e.g.,
2483 * supported_attributes)
2485 ret
+= 16 * (hweight32(bmap0
) + hweight32(bmap1
) + hweight32(bmap2
));
2486 /* bitmask, length */
2491 static inline u32
nfsd4_getfh_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2493 return (op_encode_hdr_size
+ 1) * sizeof(__be32
) + NFS4_FHSIZE
;
2496 static inline u32
nfsd4_link_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2498 return (op_encode_hdr_size
+ op_encode_change_info_maxsz
)
2502 static inline u32
nfsd4_lock_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2504 return (op_encode_hdr_size
+ op_encode_lock_denied_maxsz
)
2508 static inline u32
nfsd4_open_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2510 return (op_encode_hdr_size
+ op_encode_stateid_maxsz
2511 + op_encode_change_info_maxsz
+ 1
2512 + nfs4_fattr_bitmap_maxsz
2513 + op_encode_delegation_maxsz
) * sizeof(__be32
);
2516 static inline u32
nfsd4_read_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2518 u32 maxcount
= 0, rlen
= 0;
2520 maxcount
= svc_max_payload(rqstp
);
2521 rlen
= min(op
->u
.read
.rd_length
, maxcount
);
2523 return (op_encode_hdr_size
+ 2 + XDR_QUADLEN(rlen
)) * sizeof(__be32
);
2526 static inline u32
nfsd4_readdir_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2528 u32 maxcount
= 0, rlen
= 0;
2530 maxcount
= svc_max_payload(rqstp
);
2531 rlen
= min(op
->u
.readdir
.rd_maxcount
, maxcount
);
2533 return (op_encode_hdr_size
+ op_encode_verifier_maxsz
+
2534 XDR_QUADLEN(rlen
)) * sizeof(__be32
);
2537 static inline u32
nfsd4_readlink_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2539 return (op_encode_hdr_size
+ 1) * sizeof(__be32
) + PAGE_SIZE
;
2542 static inline u32
nfsd4_remove_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2544 return (op_encode_hdr_size
+ op_encode_change_info_maxsz
)
2548 static inline u32
nfsd4_rename_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2550 return (op_encode_hdr_size
+ op_encode_change_info_maxsz
2551 + op_encode_change_info_maxsz
) * sizeof(__be32
);
2554 static inline u32
nfsd4_sequence_rsize(struct svc_rqst
*rqstp
,
2555 struct nfsd4_op
*op
)
2557 return (op_encode_hdr_size
2558 + XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN
) + 5) * sizeof(__be32
);
2561 static inline u32
nfsd4_test_stateid_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2563 return (op_encode_hdr_size
+ 1 + op
->u
.test_stateid
.ts_num_ids
)
2567 static inline u32
nfsd4_setattr_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2569 return (op_encode_hdr_size
+ nfs4_fattr_bitmap_maxsz
) * sizeof(__be32
);
2572 static inline u32
nfsd4_secinfo_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2574 return (op_encode_hdr_size
+ RPC_AUTH_MAXFLAVOR
*
2575 (4 + XDR_QUADLEN(GSS_OID_MAX_LEN
))) * sizeof(__be32
);
2578 static inline u32
nfsd4_setclientid_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2580 return (op_encode_hdr_size
+ 2 + XDR_QUADLEN(NFS4_VERIFIER_SIZE
)) *
2584 static inline u32
nfsd4_write_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2586 return (op_encode_hdr_size
+ 2 + op_encode_verifier_maxsz
) * sizeof(__be32
);
2589 static inline u32
nfsd4_exchange_id_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2591 return (op_encode_hdr_size
+ 2 + 1 + /* eir_clientid, eir_sequenceid */\
2592 1 + 1 + /* eir_flags, spr_how */\
2593 4 + /* spo_must_enforce & _allow with bitmap */\
2594 2 + /*eir_server_owner.so_minor_id */\
2595 /* eir_server_owner.so_major_id<> */\
2596 XDR_QUADLEN(NFS4_OPAQUE_LIMIT
) + 1 +\
2597 /* eir_server_scope<> */\
2598 XDR_QUADLEN(NFS4_OPAQUE_LIMIT
) + 1 +\
2599 1 + /* eir_server_impl_id array length */\
2600 0 /* ignored eir_server_impl_id contents */) * sizeof(__be32
);
2603 static inline u32
nfsd4_bind_conn_to_session_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2605 return (op_encode_hdr_size
+ \
2606 XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN
) + /* bctsr_sessid */\
2607 2 /* bctsr_dir, use_conn_in_rdma_mode */) * sizeof(__be32
);
2610 static inline u32
nfsd4_create_session_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2612 return (op_encode_hdr_size
+ \
2613 XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN
) + /* sessionid */\
2614 2 + /* csr_sequence, csr_flags */\
2615 op_encode_channel_attrs_maxsz
+ \
2616 op_encode_channel_attrs_maxsz
) * sizeof(__be32
);
2619 static inline u32
nfsd4_copy_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2621 return (op_encode_hdr_size
+
2622 1 /* wr_callback */ +
2623 op_encode_stateid_maxsz
/* wr_callback */ +
2625 1 /* wr_committed */ +
2626 op_encode_verifier_maxsz
+
2627 1 /* cr_consecutive */ +
2628 1 /* cr_synchronous */) * sizeof(__be32
);
2631 static inline u32
nfsd4_offload_status_rsize(struct svc_rqst
*rqstp
,
2632 struct nfsd4_op
*op
)
2634 return (op_encode_hdr_size
+
2636 1 /* osr_complete<1> optional 0 for now */) * sizeof(__be32
);
2639 static inline u32
nfsd4_copy_notify_rsize(struct svc_rqst
*rqstp
,
2640 struct nfsd4_op
*op
)
2642 return (op_encode_hdr_size
+
2643 3 /* cnr_lease_time */ +
2644 1 /* We support one cnr_source_server */ +
2645 1 /* cnr_stateid seq */ +
2646 op_encode_stateid_maxsz
/* cnr_stateid */ +
2647 1 /* num cnr_source_server*/ +
2650 XDR_QUADLEN(NFS4_OPAQUE_LIMIT
) /*nl4_loc + nl4_loc_sz */)
2654 #ifdef CONFIG_NFSD_PNFS
2655 static inline u32
nfsd4_getdeviceinfo_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2657 u32 maxcount
= 0, rlen
= 0;
2659 maxcount
= svc_max_payload(rqstp
);
2660 rlen
= min(op
->u
.getdeviceinfo
.gd_maxcount
, maxcount
);
2662 return (op_encode_hdr_size
+
2663 1 /* gd_layout_type*/ +
2665 2 /* gd_notify_types */) * sizeof(__be32
);
2669 * At this stage we don't really know what layout driver will handle the request,
2670 * so we need to define an arbitrary upper bound here.
2672 #define MAX_LAYOUT_SIZE 128
2673 static inline u32
nfsd4_layoutget_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2675 return (op_encode_hdr_size
+
2676 1 /* logr_return_on_close */ +
2677 op_encode_stateid_maxsz
+
2678 1 /* nr of layouts */ +
2679 MAX_LAYOUT_SIZE
) * sizeof(__be32
);
2682 static inline u32
nfsd4_layoutcommit_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2684 return (op_encode_hdr_size
+
2685 1 /* locr_newsize */ +
2686 2 /* ns_size */) * sizeof(__be32
);
2689 static inline u32
nfsd4_layoutreturn_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2691 return (op_encode_hdr_size
+
2692 1 /* lrs_stateid */ +
2693 op_encode_stateid_maxsz
) * sizeof(__be32
);
2695 #endif /* CONFIG_NFSD_PNFS */
2698 static inline u32
nfsd4_seek_rsize(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
2700 return (op_encode_hdr_size
+ 3) * sizeof(__be32
);
2703 static const struct nfsd4_operation nfsd4_ops
[] = {
2705 .op_func
= nfsd4_access
,
2706 .op_name
= "OP_ACCESS",
2707 .op_rsize_bop
= nfsd4_access_rsize
,
2710 .op_func
= nfsd4_close
,
2711 .op_flags
= OP_MODIFIES_SOMETHING
,
2712 .op_name
= "OP_CLOSE",
2713 .op_rsize_bop
= nfsd4_status_stateid_rsize
,
2714 .op_get_currentstateid
= nfsd4_get_closestateid
,
2715 .op_set_currentstateid
= nfsd4_set_closestateid
,
2718 .op_func
= nfsd4_commit
,
2719 .op_flags
= OP_MODIFIES_SOMETHING
,
2720 .op_name
= "OP_COMMIT",
2721 .op_rsize_bop
= nfsd4_commit_rsize
,
2724 .op_func
= nfsd4_create
,
2725 .op_flags
= OP_MODIFIES_SOMETHING
| OP_CACHEME
| OP_CLEAR_STATEID
,
2726 .op_name
= "OP_CREATE",
2727 .op_rsize_bop
= nfsd4_create_rsize
,
2729 [OP_DELEGRETURN
] = {
2730 .op_func
= nfsd4_delegreturn
,
2731 .op_flags
= OP_MODIFIES_SOMETHING
,
2732 .op_name
= "OP_DELEGRETURN",
2733 .op_rsize_bop
= nfsd4_only_status_rsize
,
2734 .op_get_currentstateid
= nfsd4_get_delegreturnstateid
,
2737 .op_func
= nfsd4_getattr
,
2738 .op_flags
= ALLOWED_ON_ABSENT_FS
,
2739 .op_rsize_bop
= nfsd4_getattr_rsize
,
2740 .op_name
= "OP_GETATTR",
2743 .op_func
= nfsd4_getfh
,
2744 .op_name
= "OP_GETFH",
2745 .op_rsize_bop
= nfsd4_getfh_rsize
,
2748 .op_func
= nfsd4_link
,
2749 .op_flags
= ALLOWED_ON_ABSENT_FS
| OP_MODIFIES_SOMETHING
2751 .op_name
= "OP_LINK",
2752 .op_rsize_bop
= nfsd4_link_rsize
,
2755 .op_func
= nfsd4_lock
,
2756 .op_flags
= OP_MODIFIES_SOMETHING
|
2757 OP_NONTRIVIAL_ERROR_ENCODE
,
2758 .op_name
= "OP_LOCK",
2759 .op_rsize_bop
= nfsd4_lock_rsize
,
2760 .op_set_currentstateid
= nfsd4_set_lockstateid
,
2763 .op_func
= nfsd4_lockt
,
2764 .op_flags
= OP_NONTRIVIAL_ERROR_ENCODE
,
2765 .op_name
= "OP_LOCKT",
2766 .op_rsize_bop
= nfsd4_lock_rsize
,
2769 .op_func
= nfsd4_locku
,
2770 .op_flags
= OP_MODIFIES_SOMETHING
,
2771 .op_name
= "OP_LOCKU",
2772 .op_rsize_bop
= nfsd4_status_stateid_rsize
,
2773 .op_get_currentstateid
= nfsd4_get_lockustateid
,
2776 .op_func
= nfsd4_lookup
,
2777 .op_flags
= OP_HANDLES_WRONGSEC
| OP_CLEAR_STATEID
,
2778 .op_name
= "OP_LOOKUP",
2779 .op_rsize_bop
= nfsd4_only_status_rsize
,
2782 .op_func
= nfsd4_lookupp
,
2783 .op_flags
= OP_HANDLES_WRONGSEC
| OP_CLEAR_STATEID
,
2784 .op_name
= "OP_LOOKUPP",
2785 .op_rsize_bop
= nfsd4_only_status_rsize
,
2788 .op_func
= nfsd4_nverify
,
2789 .op_name
= "OP_NVERIFY",
2790 .op_rsize_bop
= nfsd4_only_status_rsize
,
2793 .op_func
= nfsd4_open
,
2794 .op_flags
= OP_HANDLES_WRONGSEC
| OP_MODIFIES_SOMETHING
,
2795 .op_name
= "OP_OPEN",
2796 .op_rsize_bop
= nfsd4_open_rsize
,
2797 .op_set_currentstateid
= nfsd4_set_openstateid
,
2799 [OP_OPEN_CONFIRM
] = {
2800 .op_func
= nfsd4_open_confirm
,
2801 .op_flags
= OP_MODIFIES_SOMETHING
,
2802 .op_name
= "OP_OPEN_CONFIRM",
2803 .op_rsize_bop
= nfsd4_status_stateid_rsize
,
2805 [OP_OPEN_DOWNGRADE
] = {
2806 .op_func
= nfsd4_open_downgrade
,
2807 .op_flags
= OP_MODIFIES_SOMETHING
,
2808 .op_name
= "OP_OPEN_DOWNGRADE",
2809 .op_rsize_bop
= nfsd4_status_stateid_rsize
,
2810 .op_get_currentstateid
= nfsd4_get_opendowngradestateid
,
2811 .op_set_currentstateid
= nfsd4_set_opendowngradestateid
,
2814 .op_func
= nfsd4_putfh
,
2815 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2816 | OP_IS_PUTFH_LIKE
| OP_CLEAR_STATEID
,
2817 .op_name
= "OP_PUTFH",
2818 .op_rsize_bop
= nfsd4_only_status_rsize
,
2821 .op_func
= nfsd4_putrootfh
,
2822 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2823 | OP_IS_PUTFH_LIKE
| OP_CLEAR_STATEID
,
2824 .op_name
= "OP_PUTPUBFH",
2825 .op_rsize_bop
= nfsd4_only_status_rsize
,
2828 .op_func
= nfsd4_putrootfh
,
2829 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2830 | OP_IS_PUTFH_LIKE
| OP_CLEAR_STATEID
,
2831 .op_name
= "OP_PUTROOTFH",
2832 .op_rsize_bop
= nfsd4_only_status_rsize
,
2835 .op_func
= nfsd4_read
,
2836 .op_release
= nfsd4_read_release
,
2837 .op_name
= "OP_READ",
2838 .op_rsize_bop
= nfsd4_read_rsize
,
2839 .op_get_currentstateid
= nfsd4_get_readstateid
,
2842 .op_func
= nfsd4_readdir
,
2843 .op_name
= "OP_READDIR",
2844 .op_rsize_bop
= nfsd4_readdir_rsize
,
2847 .op_func
= nfsd4_readlink
,
2848 .op_name
= "OP_READLINK",
2849 .op_rsize_bop
= nfsd4_readlink_rsize
,
2852 .op_func
= nfsd4_remove
,
2853 .op_flags
= OP_MODIFIES_SOMETHING
| OP_CACHEME
,
2854 .op_name
= "OP_REMOVE",
2855 .op_rsize_bop
= nfsd4_remove_rsize
,
2858 .op_func
= nfsd4_rename
,
2859 .op_flags
= OP_MODIFIES_SOMETHING
| OP_CACHEME
,
2860 .op_name
= "OP_RENAME",
2861 .op_rsize_bop
= nfsd4_rename_rsize
,
2864 .op_func
= nfsd4_renew
,
2865 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2866 | OP_MODIFIES_SOMETHING
,
2867 .op_name
= "OP_RENEW",
2868 .op_rsize_bop
= nfsd4_only_status_rsize
,
2872 .op_func
= nfsd4_restorefh
,
2873 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2874 | OP_IS_PUTFH_LIKE
| OP_MODIFIES_SOMETHING
,
2875 .op_name
= "OP_RESTOREFH",
2876 .op_rsize_bop
= nfsd4_only_status_rsize
,
2879 .op_func
= nfsd4_savefh
,
2880 .op_flags
= OP_HANDLES_WRONGSEC
| OP_MODIFIES_SOMETHING
,
2881 .op_name
= "OP_SAVEFH",
2882 .op_rsize_bop
= nfsd4_only_status_rsize
,
2885 .op_func
= nfsd4_secinfo
,
2886 .op_release
= nfsd4_secinfo_release
,
2887 .op_flags
= OP_HANDLES_WRONGSEC
,
2888 .op_name
= "OP_SECINFO",
2889 .op_rsize_bop
= nfsd4_secinfo_rsize
,
2892 .op_func
= nfsd4_setattr
,
2893 .op_name
= "OP_SETATTR",
2894 .op_flags
= OP_MODIFIES_SOMETHING
| OP_CACHEME
2895 | OP_NONTRIVIAL_ERROR_ENCODE
,
2896 .op_rsize_bop
= nfsd4_setattr_rsize
,
2897 .op_get_currentstateid
= nfsd4_get_setattrstateid
,
2899 [OP_SETCLIENTID
] = {
2900 .op_func
= nfsd4_setclientid
,
2901 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2902 | OP_MODIFIES_SOMETHING
| OP_CACHEME
2903 | OP_NONTRIVIAL_ERROR_ENCODE
,
2904 .op_name
= "OP_SETCLIENTID",
2905 .op_rsize_bop
= nfsd4_setclientid_rsize
,
2907 [OP_SETCLIENTID_CONFIRM
] = {
2908 .op_func
= nfsd4_setclientid_confirm
,
2909 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2910 | OP_MODIFIES_SOMETHING
| OP_CACHEME
,
2911 .op_name
= "OP_SETCLIENTID_CONFIRM",
2912 .op_rsize_bop
= nfsd4_only_status_rsize
,
2915 .op_func
= nfsd4_verify
,
2916 .op_name
= "OP_VERIFY",
2917 .op_rsize_bop
= nfsd4_only_status_rsize
,
2920 .op_func
= nfsd4_write
,
2921 .op_flags
= OP_MODIFIES_SOMETHING
| OP_CACHEME
,
2922 .op_name
= "OP_WRITE",
2923 .op_rsize_bop
= nfsd4_write_rsize
,
2924 .op_get_currentstateid
= nfsd4_get_writestateid
,
2926 [OP_RELEASE_LOCKOWNER
] = {
2927 .op_func
= nfsd4_release_lockowner
,
2928 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_ON_ABSENT_FS
2929 | OP_MODIFIES_SOMETHING
,
2930 .op_name
= "OP_RELEASE_LOCKOWNER",
2931 .op_rsize_bop
= nfsd4_only_status_rsize
,
2934 /* NFSv4.1 operations */
2935 [OP_EXCHANGE_ID
] = {
2936 .op_func
= nfsd4_exchange_id
,
2937 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_AS_FIRST_OP
2938 | OP_MODIFIES_SOMETHING
,
2939 .op_name
= "OP_EXCHANGE_ID",
2940 .op_rsize_bop
= nfsd4_exchange_id_rsize
,
2942 [OP_BACKCHANNEL_CTL
] = {
2943 .op_func
= nfsd4_backchannel_ctl
,
2944 .op_flags
= ALLOWED_WITHOUT_FH
| OP_MODIFIES_SOMETHING
,
2945 .op_name
= "OP_BACKCHANNEL_CTL",
2946 .op_rsize_bop
= nfsd4_only_status_rsize
,
2948 [OP_BIND_CONN_TO_SESSION
] = {
2949 .op_func
= nfsd4_bind_conn_to_session
,
2950 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_AS_FIRST_OP
2951 | OP_MODIFIES_SOMETHING
,
2952 .op_name
= "OP_BIND_CONN_TO_SESSION",
2953 .op_rsize_bop
= nfsd4_bind_conn_to_session_rsize
,
2955 [OP_CREATE_SESSION
] = {
2956 .op_func
= nfsd4_create_session
,
2957 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_AS_FIRST_OP
2958 | OP_MODIFIES_SOMETHING
,
2959 .op_name
= "OP_CREATE_SESSION",
2960 .op_rsize_bop
= nfsd4_create_session_rsize
,
2962 [OP_DESTROY_SESSION
] = {
2963 .op_func
= nfsd4_destroy_session
,
2964 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_AS_FIRST_OP
2965 | OP_MODIFIES_SOMETHING
,
2966 .op_name
= "OP_DESTROY_SESSION",
2967 .op_rsize_bop
= nfsd4_only_status_rsize
,
2970 .op_func
= nfsd4_sequence
,
2971 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_AS_FIRST_OP
,
2972 .op_name
= "OP_SEQUENCE",
2973 .op_rsize_bop
= nfsd4_sequence_rsize
,
2975 [OP_DESTROY_CLIENTID
] = {
2976 .op_func
= nfsd4_destroy_clientid
,
2977 .op_flags
= ALLOWED_WITHOUT_FH
| ALLOWED_AS_FIRST_OP
2978 | OP_MODIFIES_SOMETHING
,
2979 .op_name
= "OP_DESTROY_CLIENTID",
2980 .op_rsize_bop
= nfsd4_only_status_rsize
,
2982 [OP_RECLAIM_COMPLETE
] = {
2983 .op_func
= nfsd4_reclaim_complete
,
2984 .op_flags
= ALLOWED_WITHOUT_FH
| OP_MODIFIES_SOMETHING
,
2985 .op_name
= "OP_RECLAIM_COMPLETE",
2986 .op_rsize_bop
= nfsd4_only_status_rsize
,
2988 [OP_SECINFO_NO_NAME
] = {
2989 .op_func
= nfsd4_secinfo_no_name
,
2990 .op_release
= nfsd4_secinfo_no_name_release
,
2991 .op_flags
= OP_HANDLES_WRONGSEC
,
2992 .op_name
= "OP_SECINFO_NO_NAME",
2993 .op_rsize_bop
= nfsd4_secinfo_rsize
,
2995 [OP_TEST_STATEID
] = {
2996 .op_func
= nfsd4_test_stateid
,
2997 .op_flags
= ALLOWED_WITHOUT_FH
,
2998 .op_name
= "OP_TEST_STATEID",
2999 .op_rsize_bop
= nfsd4_test_stateid_rsize
,
3001 [OP_FREE_STATEID
] = {
3002 .op_func
= nfsd4_free_stateid
,
3003 .op_flags
= ALLOWED_WITHOUT_FH
| OP_MODIFIES_SOMETHING
,
3004 .op_name
= "OP_FREE_STATEID",
3005 .op_get_currentstateid
= nfsd4_get_freestateid
,
3006 .op_rsize_bop
= nfsd4_only_status_rsize
,
3008 #ifdef CONFIG_NFSD_PNFS
3009 [OP_GETDEVICEINFO
] = {
3010 .op_func
= nfsd4_getdeviceinfo
,
3011 .op_release
= nfsd4_getdeviceinfo_release
,
3012 .op_flags
= ALLOWED_WITHOUT_FH
,
3013 .op_name
= "OP_GETDEVICEINFO",
3014 .op_rsize_bop
= nfsd4_getdeviceinfo_rsize
,
3017 .op_func
= nfsd4_layoutget
,
3018 .op_release
= nfsd4_layoutget_release
,
3019 .op_flags
= OP_MODIFIES_SOMETHING
,
3020 .op_name
= "OP_LAYOUTGET",
3021 .op_rsize_bop
= nfsd4_layoutget_rsize
,
3023 [OP_LAYOUTCOMMIT
] = {
3024 .op_func
= nfsd4_layoutcommit
,
3025 .op_flags
= OP_MODIFIES_SOMETHING
,
3026 .op_name
= "OP_LAYOUTCOMMIT",
3027 .op_rsize_bop
= nfsd4_layoutcommit_rsize
,
3029 [OP_LAYOUTRETURN
] = {
3030 .op_func
= nfsd4_layoutreturn
,
3031 .op_flags
= OP_MODIFIES_SOMETHING
,
3032 .op_name
= "OP_LAYOUTRETURN",
3033 .op_rsize_bop
= nfsd4_layoutreturn_rsize
,
3035 #endif /* CONFIG_NFSD_PNFS */
3037 /* NFSv4.2 operations */
3039 .op_func
= nfsd4_allocate
,
3040 .op_flags
= OP_MODIFIES_SOMETHING
,
3041 .op_name
= "OP_ALLOCATE",
3042 .op_rsize_bop
= nfsd4_only_status_rsize
,
3045 .op_func
= nfsd4_deallocate
,
3046 .op_flags
= OP_MODIFIES_SOMETHING
,
3047 .op_name
= "OP_DEALLOCATE",
3048 .op_rsize_bop
= nfsd4_only_status_rsize
,
3051 .op_func
= nfsd4_clone
,
3052 .op_flags
= OP_MODIFIES_SOMETHING
,
3053 .op_name
= "OP_CLONE",
3054 .op_rsize_bop
= nfsd4_only_status_rsize
,
3057 .op_func
= nfsd4_copy
,
3058 .op_flags
= OP_MODIFIES_SOMETHING
,
3059 .op_name
= "OP_COPY",
3060 .op_rsize_bop
= nfsd4_copy_rsize
,
3063 .op_func
= nfsd4_seek
,
3064 .op_name
= "OP_SEEK",
3065 .op_rsize_bop
= nfsd4_seek_rsize
,
3067 [OP_OFFLOAD_STATUS
] = {
3068 .op_func
= nfsd4_offload_status
,
3069 .op_name
= "OP_OFFLOAD_STATUS",
3070 .op_rsize_bop
= nfsd4_offload_status_rsize
,
3072 [OP_OFFLOAD_CANCEL
] = {
3073 .op_func
= nfsd4_offload_cancel
,
3074 .op_flags
= OP_MODIFIES_SOMETHING
,
3075 .op_name
= "OP_OFFLOAD_CANCEL",
3076 .op_rsize_bop
= nfsd4_only_status_rsize
,
3078 [OP_COPY_NOTIFY
] = {
3079 .op_func
= nfsd4_copy_notify
,
3080 .op_flags
= OP_MODIFIES_SOMETHING
,
3081 .op_name
= "OP_COPY_NOTIFY",
3082 .op_rsize_bop
= nfsd4_copy_notify_rsize
,
3087 * nfsd4_spo_must_allow - Determine if the compound op contains an
3088 * operation that is allowed to be sent with machine credentials
3090 * @rqstp: a pointer to the struct svc_rqst
3092 * Checks to see if the compound contains a spo_must_allow op
3093 * and confirms that it was sent with the proper machine creds.
3096 bool nfsd4_spo_must_allow(struct svc_rqst
*rqstp
)
3098 struct nfsd4_compoundres
*resp
= rqstp
->rq_resp
;
3099 struct nfsd4_compoundargs
*argp
= rqstp
->rq_argp
;
3100 struct nfsd4_op
*this = &argp
->ops
[resp
->opcnt
- 1];
3101 struct nfsd4_compound_state
*cstate
= &resp
->cstate
;
3102 struct nfs4_op_map
*allow
= &cstate
->clp
->cl_spo_must_allow
;
3105 if (!cstate
->minorversion
)
3108 if (cstate
->spo_must_allowed
== true)
3111 opiter
= resp
->opcnt
;
3112 while (opiter
< argp
->opcnt
) {
3113 this = &argp
->ops
[opiter
++];
3114 if (test_bit(this->opnum
, allow
->u
.longs
) &&
3115 cstate
->clp
->cl_mach_cred
&&
3116 nfsd4_mach_creds_match(cstate
->clp
, rqstp
)) {
3117 cstate
->spo_must_allowed
= true;
3121 cstate
->spo_must_allowed
= false;
3125 int nfsd4_max_reply(struct svc_rqst
*rqstp
, struct nfsd4_op
*op
)
3127 if (op
->opnum
== OP_ILLEGAL
|| op
->status
== nfserr_notsupp
)
3128 return op_encode_hdr_size
* sizeof(__be32
);
3130 BUG_ON(OPDESC(op
)->op_rsize_bop
== NULL
);
3131 return OPDESC(op
)->op_rsize_bop(rqstp
, op
);
3134 void warn_on_nonidempotent_op(struct nfsd4_op
*op
)
3136 if (OPDESC(op
)->op_flags
& OP_MODIFIES_SOMETHING
) {
3137 pr_err("unable to encode reply to nonidempotent op %d (%s)\n",
3138 op
->opnum
, nfsd4_op_name(op
->opnum
));
3143 static const char *nfsd4_op_name(unsigned opnum
)
3145 if (opnum
< ARRAY_SIZE(nfsd4_ops
))
3146 return nfsd4_ops
[opnum
].op_name
;
3147 return "unknown_operation";
3150 #define nfsd4_voidres nfsd4_voidargs
3151 struct nfsd4_voidargs
{ int dummy
; };
3153 static const struct svc_procedure nfsd_procedures4
[2] = {
3155 .pc_func
= nfsd4_proc_null
,
3156 .pc_encode
= nfs4svc_encode_voidres
,
3157 .pc_argsize
= sizeof(struct nfsd4_voidargs
),
3158 .pc_ressize
= sizeof(struct nfsd4_voidres
),
3159 .pc_cachetype
= RC_NOCACHE
,
3162 [NFSPROC4_COMPOUND
] = {
3163 .pc_func
= nfsd4_proc_compound
,
3164 .pc_decode
= nfs4svc_decode_compoundargs
,
3165 .pc_encode
= nfs4svc_encode_compoundres
,
3166 .pc_argsize
= sizeof(struct nfsd4_compoundargs
),
3167 .pc_ressize
= sizeof(struct nfsd4_compoundres
),
3168 .pc_release
= nfsd4_release_compoundargs
,
3169 .pc_cachetype
= RC_NOCACHE
,
3170 .pc_xdrressize
= NFSD_BUFSIZE
/4,
3174 static unsigned int nfsd_count3
[ARRAY_SIZE(nfsd_procedures4
)];
3175 const struct svc_version nfsd_version4
= {
3178 .vs_proc
= nfsd_procedures4
,
3179 .vs_count
= nfsd_count3
,
3180 .vs_dispatch
= nfsd_dispatch
,
3181 .vs_xdrsize
= NFS4_SVC_XDRSIZE
,
3182 .vs_rpcb_optnl
= true,
3183 .vs_need_cong_ctrl
= true,