mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 5 changed files with 21 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue