diff options
Diffstat (limited to 'sys/fs/nfs/nfs_commonsubs.c')
| -rw-r--r-- | sys/fs/nfs/nfs_commonsubs.c | 47 | 
1 files changed, 37 insertions, 10 deletions
| diff --git a/sys/fs/nfs/nfs_commonsubs.c b/sys/fs/nfs/nfs_commonsubs.c index 7f5b29ca2085..8d506a5643a9 100644 --- a/sys/fs/nfs/nfs_commonsubs.c +++ b/sys/fs/nfs/nfs_commonsubs.c @@ -216,10 +216,17 @@ NFSD_VNET_DEFINE_STATIC(u_char *, nfsrv_dnsname) = NULL;   * marked 0 in this array, the code will still work, just not quite as   * efficiently.)   */ -static int nfs_bigreply[NFSV42_NPROCS] = { 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, -    0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, -    1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }; +static bool nfs_bigreply[NFSV42_NPROCS] = { +	[NFSPROC_GETACL] = true, +	[NFSPROC_GETEXTATTR] = true, +	[NFSPROC_LISTEXTATTR] = true, +	[NFSPROC_LOOKUP] = true, +	[NFSPROC_READ] = true, +	[NFSPROC_READDIR] = true, +	[NFSPROC_READDIRPLUS] = true, +	[NFSPROC_READDS] = true, +	[NFSPROC_READLINK] = true, +};  /* local functions */  static int nfsrv_skipace(struct nfsrv_descript *nd, int *acesizep); @@ -232,6 +239,8 @@ static int nfsrv_getrefstr(struct nfsrv_descript *, u_char **, u_char **,  static void nfsrv_refstrbigenough(int, u_char **, u_char **, int *);  static uint32_t vtonfsv4_type(struct vattr *);  static __enum_uint8(vtype) nfsv4tov_type(uint32_t, uint16_t *); +static void nfsv4_setsequence(struct nfsmount *, struct nfsrv_descript *, +    struct nfsclsession *, bool, struct ucred *);  static struct {  	int	op; @@ -632,6 +641,7 @@ nfscl_fillsattr(struct nfsrv_descript *nd, struct vattr *vap,  		if ((flags & NFSSATTR_FULL) && vap->va_size != VNOVAL)  			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SIZE);  		if ((flags & NFSSATTR_FULL) && vap->va_flags != VNOVAL) { +			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_ARCHIVE);  			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN);  			NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_SYSTEM);  		} @@ -1663,9 +1673,17 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,  			attrsum += NFSX_UNSIGNED;  			break;  		case NFSATTRBIT_ARCHIVE: -			NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED); -			if (compare && !(*retcmpp)) -				*retcmpp = NFSERR_ATTRNOTSUPP; +			NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED); +			if (compare) { +				if (!(*retcmpp) && ((*tl == newnfs_true && +				    (nap->na_flags & UF_ARCHIVE) == 0) || +				    (*tl == newnfs_false && +				     (nap->na_flags & UF_ARCHIVE) != 0))) +					*retcmpp = NFSERR_NOTSAME; +			} else if (nap != NULL) { +				if (*tl == newnfs_true) +					nap->na_flags |= UF_ARCHIVE; +			}  			attrsum += NFSX_UNSIGNED;  			break;  		case NFSATTRBIT_CANSETTIME: @@ -2795,6 +2813,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,  			if (!has_hiddensystem) {  			    NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_HIDDEN);  			    NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_SYSTEM); +			    NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_ARCHIVE);  			}  			if (clone_blksize == 0)  			    NFSCLRBIT_ATTRBIT(&attrbits, @@ -2879,6 +2898,14 @@ nfsv4_fillattr(struct nfsrv_descript *nd, struct mount *mp, vnode_t vp,  			*tl = txdr_unsigned(NFSV4ACE_SUPTYPES);  			retnum += NFSX_UNSIGNED;  			break; +		case NFSATTRBIT_ARCHIVE: +			NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED); +			if ((vap->va_flags & UF_ARCHIVE) != 0) +				*tl = newnfs_true; +			else +				*tl = newnfs_false; +			retnum += NFSX_UNSIGNED; +			break;  		case NFSATTRBIT_CANSETTIME:  			NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);  			if (fsinf.fs_properties & NFSV3FSINFO_CANSETTIME) @@ -5021,9 +5048,9 @@ nfsv4_seqsess_cacherep(uint32_t slotid, struct nfsslot *slots, int repstat,  /*   * Generate the xdr for an NFSv4.1 Sequence Operation.   */ -void +static void  nfsv4_setsequence(struct nfsmount *nmp, struct nfsrv_descript *nd, -    struct nfsclsession *sep, int dont_replycache, struct ucred *cred) +    struct nfsclsession *sep, bool dont_replycache, struct ucred *cred)  {  	uint32_t *tl, slotseq = 0;  	int error, maxslot, slotpos; @@ -5054,7 +5081,7 @@ nfsv4_setsequence(struct nfsmount *nmp, struct nfsrv_descript *nd,  		*tl++ = txdr_unsigned(slotseq);  		*tl++ = txdr_unsigned(slotpos);  		*tl++ = txdr_unsigned(maxslot); -		if (dont_replycache == 0) +		if (!dont_replycache)  			*tl = newnfs_true;  		else  			*tl = newnfs_false; | 
