nfscl: Add support for va_birthtime to NFSv4
There is a NFSv4 file attribute called TimeCreate that can be used for va_birthtime. r362175 added some support for use of TimeCreate. This patch completes support of va_birthtime by adding support for setting this attribute to the server. It also eanbles the client to acquire and set the attribute for a NFSv4 server that supports the attribute. Reviewed by: markj MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D30156
This commit is contained in:
parent
5a4333a537
commit
dd02d9d605
@ -1248,6 +1248,8 @@ nfsv4_loadattr(struct nfsrv_descript *nd, vnode_t vp,
|
|||||||
nap->na_rdev = (NFSDEV_T)0;
|
nap->na_rdev = (NFSDEV_T)0;
|
||||||
nap->na_mtime.tv_sec = 0;
|
nap->na_mtime.tv_sec = 0;
|
||||||
nap->na_mtime.tv_nsec = 0;
|
nap->na_mtime.tv_nsec = 0;
|
||||||
|
nap->na_btime.tv_sec = -1;
|
||||||
|
nap->na_btime.tv_nsec = 0;
|
||||||
nap->na_gen = 0;
|
nap->na_gen = 0;
|
||||||
nap->na_flags = 0;
|
nap->na_flags = 0;
|
||||||
nap->na_blocksize = NFS_FABLKSIZE;
|
nap->na_blocksize = NFS_FABLKSIZE;
|
||||||
|
@ -1227,6 +1227,7 @@ struct nfsv3_sattr {
|
|||||||
NFSATTRBM_RAWDEV | \
|
NFSATTRBM_RAWDEV | \
|
||||||
NFSATTRBM_SPACEUSED | \
|
NFSATTRBM_SPACEUSED | \
|
||||||
NFSATTRBM_TIMEACCESS | \
|
NFSATTRBM_TIMEACCESS | \
|
||||||
|
NFSATTRBM_TIMECREATE | \
|
||||||
NFSATTRBM_TIMEMETADATA | \
|
NFSATTRBM_TIMEMETADATA | \
|
||||||
NFSATTRBM_TIMEMODIFY)
|
NFSATTRBM_TIMEMODIFY)
|
||||||
|
|
||||||
@ -1258,6 +1259,7 @@ struct nfsv3_sattr {
|
|||||||
NFSATTRBM_RAWDEV | \
|
NFSATTRBM_RAWDEV | \
|
||||||
NFSATTRBM_SPACEUSED | \
|
NFSATTRBM_SPACEUSED | \
|
||||||
NFSATTRBM_TIMEACCESS | \
|
NFSATTRBM_TIMEACCESS | \
|
||||||
|
NFSATTRBM_TIMECREATE | \
|
||||||
NFSATTRBM_TIMEMETADATA | \
|
NFSATTRBM_TIMEMETADATA | \
|
||||||
NFSATTRBM_TIMEMODIFY)
|
NFSATTRBM_TIMEMODIFY)
|
||||||
|
|
||||||
|
@ -284,6 +284,8 @@ nfsm_loadattr(struct nfsrv_descript *nd, struct nfsvattr *nap)
|
|||||||
fxdr_nfsv3time(&fp->fa3_atime, &nap->na_atime);
|
fxdr_nfsv3time(&fp->fa3_atime, &nap->na_atime);
|
||||||
fxdr_nfsv3time(&fp->fa3_ctime, &nap->na_ctime);
|
fxdr_nfsv3time(&fp->fa3_ctime, &nap->na_ctime);
|
||||||
fxdr_nfsv3time(&fp->fa3_mtime, &nap->na_mtime);
|
fxdr_nfsv3time(&fp->fa3_mtime, &nap->na_mtime);
|
||||||
|
nap->na_btime.tv_sec = -1;
|
||||||
|
nap->na_btime.tv_nsec = 0;
|
||||||
nap->na_flags = 0;
|
nap->na_flags = 0;
|
||||||
nap->na_gen = 0;
|
nap->na_gen = 0;
|
||||||
nap->na_filerev = 0;
|
nap->na_filerev = 0;
|
||||||
@ -315,6 +317,8 @@ nfsm_loadattr(struct nfsrv_descript *nd, struct nfsvattr *nap)
|
|||||||
nap->na_ctime.tv_sec = fxdr_unsigned(u_int32_t,
|
nap->na_ctime.tv_sec = fxdr_unsigned(u_int32_t,
|
||||||
fp->fa2_ctime.nfsv2_sec);
|
fp->fa2_ctime.nfsv2_sec);
|
||||||
nap->na_ctime.tv_nsec = 0;
|
nap->na_ctime.tv_nsec = 0;
|
||||||
|
nap->na_btime.tv_sec = -1;
|
||||||
|
nap->na_btime.tv_nsec = 0;
|
||||||
nap->na_gen = fxdr_unsigned(u_int32_t,fp->fa2_ctime.nfsv2_usec);
|
nap->na_gen = fxdr_unsigned(u_int32_t,fp->fa2_ctime.nfsv2_usec);
|
||||||
nap->na_filerev = 0;
|
nap->na_filerev = 0;
|
||||||
}
|
}
|
||||||
|
@ -415,6 +415,7 @@ ncl_copy_vattr(struct vattr *dst, struct vattr *src)
|
|||||||
dst->va_atime = src->va_atime;
|
dst->va_atime = src->va_atime;
|
||||||
dst->va_mtime = src->va_mtime;
|
dst->va_mtime = src->va_mtime;
|
||||||
dst->va_ctime = src->va_ctime;
|
dst->va_ctime = src->va_ctime;
|
||||||
|
dst->va_birthtime = src->va_birthtime;
|
||||||
dst->va_gen = src->va_gen;
|
dst->va_gen = src->va_gen;
|
||||||
dst->va_flags = src->va_flags;
|
dst->va_flags = src->va_flags;
|
||||||
dst->va_rdev = src->va_rdev;
|
dst->va_rdev = src->va_rdev;
|
||||||
@ -466,6 +467,7 @@ nfscl_loadattrcache(struct vnode **vpp, struct nfsvattr *nap, void *nvaper,
|
|||||||
np->n_vattr.na_size = nap->na_size;
|
np->n_vattr.na_size = nap->na_size;
|
||||||
np->n_vattr.na_mtime = nap->na_mtime;
|
np->n_vattr.na_mtime = nap->na_mtime;
|
||||||
np->n_vattr.na_ctime = nap->na_ctime;
|
np->n_vattr.na_ctime = nap->na_ctime;
|
||||||
|
np->n_vattr.na_btime = nap->na_btime;
|
||||||
np->n_vattr.na_fsid = nap->na_fsid;
|
np->n_vattr.na_fsid = nap->na_fsid;
|
||||||
np->n_vattr.na_mode = nap->na_mode;
|
np->n_vattr.na_mode = nap->na_mode;
|
||||||
} else {
|
} else {
|
||||||
|
@ -3548,6 +3548,9 @@ nfsrpc_readdirplus(vnode_t vp, struct uio *uiop, nfsuint64 *cookiep,
|
|||||||
if (gotmnton)
|
if (gotmnton)
|
||||||
NFSSETBIT_ATTRBIT(&attrbits,
|
NFSSETBIT_ATTRBIT(&attrbits,
|
||||||
NFSATTRBIT_MOUNTEDONFILEID);
|
NFSATTRBIT_MOUNTEDONFILEID);
|
||||||
|
if (!NFSISSET_ATTRBIT(&dnp->n_vattr.na_suppattr,
|
||||||
|
NFSATTRBIT_TIMECREATE))
|
||||||
|
NFSCLRBIT_ATTRBIT(&attrbits, NFSATTRBIT_TIMECREATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1024,7 +1024,9 @@ nfs_setattr(struct vop_setattr_args *ap)
|
|||||||
*/
|
*/
|
||||||
if ((vap->va_flags != VNOVAL || vap->va_uid != (uid_t)VNOVAL ||
|
if ((vap->va_flags != VNOVAL || vap->va_uid != (uid_t)VNOVAL ||
|
||||||
vap->va_gid != (gid_t)VNOVAL || vap->va_atime.tv_sec != VNOVAL ||
|
vap->va_gid != (gid_t)VNOVAL || vap->va_atime.tv_sec != VNOVAL ||
|
||||||
vap->va_mtime.tv_sec != VNOVAL || vap->va_mode != (mode_t)VNOVAL) &&
|
vap->va_mtime.tv_sec != VNOVAL ||
|
||||||
|
vap->va_birthtime.tv_sec != VNOVAL ||
|
||||||
|
vap->va_mode != (mode_t)VNOVAL) &&
|
||||||
(vp->v_mount->mnt_flag & MNT_RDONLY))
|
(vp->v_mount->mnt_flag & MNT_RDONLY))
|
||||||
return (EROFS);
|
return (EROFS);
|
||||||
if (vap->va_size != VNOVAL) {
|
if (vap->va_size != VNOVAL) {
|
||||||
@ -1037,6 +1039,7 @@ nfs_setattr(struct vop_setattr_args *ap)
|
|||||||
case VFIFO:
|
case VFIFO:
|
||||||
if (vap->va_mtime.tv_sec == VNOVAL &&
|
if (vap->va_mtime.tv_sec == VNOVAL &&
|
||||||
vap->va_atime.tv_sec == VNOVAL &&
|
vap->va_atime.tv_sec == VNOVAL &&
|
||||||
|
vap->va_birthtime.tv_sec == VNOVAL &&
|
||||||
vap->va_mode == (mode_t)VNOVAL &&
|
vap->va_mode == (mode_t)VNOVAL &&
|
||||||
vap->va_uid == (uid_t)VNOVAL &&
|
vap->va_uid == (uid_t)VNOVAL &&
|
||||||
vap->va_gid == (gid_t)VNOVAL)
|
vap->va_gid == (gid_t)VNOVAL)
|
||||||
|
@ -491,6 +491,15 @@ nfsrvd_setattr(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_TIMEMODIFYSET);
|
NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_TIMEMODIFYSET);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!nd->nd_repstat &&
|
||||||
|
NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_TIMECREATE)) {
|
||||||
|
NFSVNO_ATTRINIT(&nva2);
|
||||||
|
NFSVNO_SETATTRVAL(&nva2, btime, nva.na_btime);
|
||||||
|
nd->nd_repstat = nfsvno_setattr(vp, &nva2, nd->nd_cred, p,
|
||||||
|
exp);
|
||||||
|
if (!nd->nd_repstat)
|
||||||
|
NFSSETBIT_ATTRBIT(&retbits, NFSATTRBIT_TIMECREATE);
|
||||||
|
}
|
||||||
if (!nd->nd_repstat &&
|
if (!nd->nd_repstat &&
|
||||||
(NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_MODE) ||
|
(NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_MODE) ||
|
||||||
NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_MODESETMASKED))) {
|
NFSISSET_ATTRBIT(&attrbits, NFSATTRBIT_MODESETMASKED))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user