inode->i_mtime = nfs_time_to_secs(new_mtime);
NFS_MTIME_UPDATE(inode) = fattr->timestamp;
NFS_CACHE_ISIZE(inode) = new_size;
+ if (fattr->valid & NFS_ATTR_FATTR_V4)
+ NFS_CHANGE_ATTR(inode) = fattr->change_attr;
inode->i_size = new_isize;
inode->i_mode = fattr->mode;
inode->i_nlink = fattr->nlink;
invalid = 1;
}
+ if ((fattr->valid & NFS_ATTR_FATTR_V4)
+ && NFS_CHANGE_ATTR(inode) != fattr->change_attr) {
+#ifdef NFS_DEBUG_VERBOSE
+ printk(KERN_DEBUG "NFS: change_attr change on %s/%ld\n",
+ inode->i_sb->s_id, inode->i_ino);
+#endif
+ invalid = 1;
+ }
+
/* Check Weak Cache Consistency data.
* If size and mtime match the pre-operation values, we can
* assume that any attribute changes were caused by our NFS
* operation, so there's no need to invalidate the caches.
*/
- if ((fattr->valid & NFS_ATTR_WCC)
+ if ((fattr->valid & NFS_ATTR_PRE_CHANGE)
+ && NFS_CHANGE_ATTR(inode) == fattr->pre_change_attr) {
+ invalid = 0;
+ }
+ else if ((fattr->valid & NFS_ATTR_WCC)
&& NFS_CACHE_ISIZE(inode) == fattr->pre_size
&& NFS_CACHE_MTIME(inode) == fattr->pre_mtime) {
invalid = 0;
}
}
+ if (fattr->valid & NFS_ATTR_FATTR_V4)
+ NFS_CHANGE_ATTR(inode) = fattr->change_attr;
+
inode->i_mode = fattr->mode;
inode->i_nlink = fattr->nlink;
inode->i_uid = fattr->uid;
__u64 read_cache_isize;
unsigned long attrtimeo;
unsigned long attrtimeo_timestamp;
+ __u64 change_attr; /* v4 only */
/*
* Timestamp that dates the change made to read_cache_mtime.
#define NFS_CACHE_CTIME(inode) (NFS_I(inode)->read_cache_ctime)
#define NFS_CACHE_MTIME(inode) (NFS_I(inode)->read_cache_mtime)
#define NFS_CACHE_ISIZE(inode) (NFS_I(inode)->read_cache_isize)
+#define NFS_CHANGE_ATTR(inode) (NFS_I(inode)->change_attr)
#define NFS_NEXTSCAN(inode) (NFS_I(inode)->nextscan)
#define NFS_CACHEINV(inode) \
do { \
__u64 atime;
__u64 mtime;
__u64 ctime;
+ __u64 change_attr; /* NFSv4 change attribute */
+ __u64 pre_change_attr;/* pre-op NFSv4 change attribute */
unsigned long timestamp;
};
#define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */
#define NFS_ATTR_FATTR 0x0002 /* post-op attributes */
#define NFS_ATTR_FATTR_V3 0x0004 /* NFSv3 attributes */
+#define NFS_ATTR_FATTR_V4 0x0008
+#define NFS_ATTR_PRE_CHANGE 0x0010
/*
* Info on the file system