forked from Minki/linux
NFSv2/v3: Simulate the change attribute
Use the ctime to simulate a change attribute for NFSv2 and NFSv3. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
6a4506c0b5
commit
3a1556e866
@ -880,7 +880,7 @@ static int nfs_init_server(struct nfs_server *server,
|
||||
server->options = data->options;
|
||||
server->caps |= NFS_CAP_HARDLINKS|NFS_CAP_SYMLINKS|NFS_CAP_FILEID|
|
||||
NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|NFS_CAP_OWNER_GROUP|
|
||||
NFS_CAP_ATIME|NFS_CAP_CTIME|NFS_CAP_MTIME;
|
||||
NFS_CAP_ATIME|NFS_CAP_CTIME|NFS_CAP_MTIME|NFS_CAP_CHANGE_ATTR;
|
||||
|
||||
if (data->rsize)
|
||||
server->rsize = nfs_block_size(data->rsize, NULL);
|
||||
|
@ -493,3 +493,15 @@ unsigned int nfs_page_array_len(unsigned int base, size_t len)
|
||||
PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a struct timespec into a 64-bit change attribute
|
||||
*
|
||||
* This does approximately the same thing as timespec_to_ns(),
|
||||
* but for calculation efficiency, we multiply the seconds by
|
||||
* 1024*1024*1024.
|
||||
*/
|
||||
static inline
|
||||
u64 nfs_timespec_to_change_attr(const struct timespec *ts)
|
||||
{
|
||||
return ((u64)ts->tv_sec << 30) + ts->tv_nsec;
|
||||
}
|
||||
|
@ -313,6 +313,8 @@ static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
|
||||
p = xdr_decode_time(p, &fattr->atime);
|
||||
p = xdr_decode_time(p, &fattr->mtime);
|
||||
xdr_decode_time(p, &fattr->ctime);
|
||||
fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
|
||||
|
||||
return 0;
|
||||
out_overflow:
|
||||
print_overflow_msg(__func__, xdr);
|
||||
|
@ -675,6 +675,7 @@ static int decode_fattr3(struct xdr_stream *xdr, struct nfs_fattr *fattr)
|
||||
p = xdr_decode_nfstime3(p, &fattr->atime);
|
||||
p = xdr_decode_nfstime3(p, &fattr->mtime);
|
||||
xdr_decode_nfstime3(p, &fattr->ctime);
|
||||
fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
|
||||
|
||||
fattr->valid |= NFS_ATTR_FATTR_V3;
|
||||
return 0;
|
||||
@ -725,12 +726,14 @@ static int decode_wcc_attr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
|
||||
goto out_overflow;
|
||||
|
||||
fattr->valid |= NFS_ATTR_FATTR_PRESIZE
|
||||
| NFS_ATTR_FATTR_PRECHANGE
|
||||
| NFS_ATTR_FATTR_PREMTIME
|
||||
| NFS_ATTR_FATTR_PRECTIME;
|
||||
|
||||
p = xdr_decode_size3(p, &fattr->pre_size);
|
||||
p = xdr_decode_nfstime3(p, &fattr->pre_mtime);
|
||||
xdr_decode_nfstime3(p, &fattr->pre_ctime);
|
||||
fattr->pre_change_attr = nfs_timespec_to_change_attr(&fattr->pre_ctime);
|
||||
|
||||
return 0;
|
||||
out_overflow:
|
||||
|
@ -106,14 +106,14 @@ struct nfs_fattr {
|
||||
| NFS_ATTR_FATTR_FILEID \
|
||||
| NFS_ATTR_FATTR_ATIME \
|
||||
| NFS_ATTR_FATTR_MTIME \
|
||||
| NFS_ATTR_FATTR_CTIME)
|
||||
| NFS_ATTR_FATTR_CTIME \
|
||||
| NFS_ATTR_FATTR_CHANGE)
|
||||
#define NFS_ATTR_FATTR_V2 (NFS_ATTR_FATTR \
|
||||
| NFS_ATTR_FATTR_BLOCKS_USED)
|
||||
#define NFS_ATTR_FATTR_V3 (NFS_ATTR_FATTR \
|
||||
| NFS_ATTR_FATTR_SPACE_USED)
|
||||
#define NFS_ATTR_FATTR_V4 (NFS_ATTR_FATTR \
|
||||
| NFS_ATTR_FATTR_SPACE_USED \
|
||||
| NFS_ATTR_FATTR_CHANGE)
|
||||
| NFS_ATTR_FATTR_SPACE_USED)
|
||||
|
||||
/*
|
||||
* Info on the file system
|
||||
|
Loading…
Reference in New Issue
Block a user