diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-02-26 16:09:04 -0500 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2015-04-09 14:13:22 +0200 |
commit | db9e4643a103945a7ce6880f14b751845e0eb988 (patch) | |
tree | 47552c67b8aca37b0d964f1d2c8ad59b8074a45f /include/linux | |
parent | ace3fc1e3f3a85ec705805146247231b11e1babe (diff) | |
download | lwn-db9e4643a103945a7ce6880f14b751845e0eb988.tar.gz lwn-db9e4643a103945a7ce6880f14b751845e0eb988.zip |
NFS: Add attribute update barriers to nfs_setattr_update_inode()
commit f044636d972246d451e06226cc1675d5da389762 upstream.
Ensure that other operations which raced with our setattr RPC call
cannot revert the file attribute changes that were made on the server.
To do so, we artificially bump the attribute generation counter on
the inode so that all calls to nfs_fattr_init() that precede ours
will be dropped.
The motivation for the patch came from Chuck Lever's reports of readaheads
racing with truncate operations and causing the file size to be reverted.
Reported-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Tested-by: Chuck Lever <chuck.lever@oracle.com>
Acked-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/nfs_fs.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index a632498d42fa..f4bf1b593327 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -354,7 +354,7 @@ extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode); extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *); extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping); extern int nfs_setattr(struct dentry *, struct iattr *); -extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr); +extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr, struct nfs_fattr *); extern void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, struct nfs4_label *label); extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); |