nfsd: Add support for the birth time attribute
[ Upstream commit e377a3e698fb56cb63f6bddbebe7da76dc37e316 ] For filesystems that supports "btime" timestamp (i.e. most modern filesystems do) we share it via kernel nfsd. Btime support for NFS client has already been added by Trond recently. Suggested-by: Bruce Fields <bfields@fieldses.org> Signed-off-by: Ondrej Valousek <ondrej.valousek.xm@renesas.com> [ cel: addressed some whitespace/checkpatch nits ] Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
770a38d491
commit
ab902aa1e0
2 changed files with 11 additions and 1 deletions
|
@ -2854,6 +2854,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
|
||||||
err = vfs_getattr(&path, &stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
|
err = vfs_getattr(&path, &stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_nfserr;
|
goto out_nfserr;
|
||||||
|
if (!(stat.result_mask & STATX_BTIME))
|
||||||
|
/* underlying FS does not offer btime so we can't share it */
|
||||||
|
bmval1 &= ~FATTR4_WORD1_TIME_CREATE;
|
||||||
if ((bmval0 & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
|
if ((bmval0 & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
|
||||||
FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) ||
|
FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) ||
|
||||||
(bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
(bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
||||||
|
@ -3254,6 +3257,13 @@ out_acl:
|
||||||
p = xdr_encode_hyper(p, (s64)stat.mtime.tv_sec);
|
p = xdr_encode_hyper(p, (s64)stat.mtime.tv_sec);
|
||||||
*p++ = cpu_to_be32(stat.mtime.tv_nsec);
|
*p++ = cpu_to_be32(stat.mtime.tv_nsec);
|
||||||
}
|
}
|
||||||
|
if (bmval1 & FATTR4_WORD1_TIME_CREATE) {
|
||||||
|
p = xdr_reserve_space(xdr, 12);
|
||||||
|
if (!p)
|
||||||
|
goto out_resource;
|
||||||
|
p = xdr_encode_hyper(p, (s64)stat.btime.tv_sec);
|
||||||
|
*p++ = cpu_to_be32(stat.btime.tv_nsec);
|
||||||
|
}
|
||||||
if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
|
if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
|
||||||
struct kstat parent_stat;
|
struct kstat parent_stat;
|
||||||
u64 ino = stat.ino;
|
u64 ino = stat.ino;
|
||||||
|
|
|
@ -364,7 +364,7 @@ void nfsd_lockd_shutdown(void);
|
||||||
| FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \
|
| FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \
|
||||||
| FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \
|
| FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \
|
||||||
| FATTR4_WORD1_SPACE_USED | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_ACCESS_SET \
|
| FATTR4_WORD1_SPACE_USED | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_ACCESS_SET \
|
||||||
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA \
|
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_CREATE \
|
||||||
| FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
|
| FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
|
||||||
|
|
||||||
#define NFSD4_SUPPORTED_ATTRS_WORD2 0
|
#define NFSD4_SUPPORTED_ATTRS_WORD2 0
|
||||||
|
|
Loading…
Reference in a new issue