|
@@ -1283,12 +1283,28 @@ static int nfs_inode_attrs_need_update(const struct inode *inode, const struct n
|
|
|
((long)nfsi->attr_gencount - (long)nfs_read_attr_generation_counter() > 0);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Don't trust the change_attribute, mtime, ctime or size if
|
|
|
+ * a pnfs LAYOUTCOMMIT is outstanding
|
|
|
+ */
|
|
|
+static void nfs_inode_attrs_handle_layoutcommit(struct inode *inode,
|
|
|
+ struct nfs_fattr *fattr)
|
|
|
+{
|
|
|
+ if (pnfs_layoutcommit_outstanding(inode))
|
|
|
+ fattr->valid &= ~(NFS_ATTR_FATTR_CHANGE |
|
|
|
+ NFS_ATTR_FATTR_MTIME |
|
|
|
+ NFS_ATTR_FATTR_CTIME |
|
|
|
+ NFS_ATTR_FATTR_SIZE);
|
|
|
+}
|
|
|
+
|
|
|
static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
trace_nfs_refresh_inode_enter(inode);
|
|
|
|
|
|
+ nfs_inode_attrs_handle_layoutcommit(inode, fattr);
|
|
|
+
|
|
|
if (nfs_inode_attrs_need_update(inode, fattr))
|
|
|
ret = nfs_update_inode(inode, fattr);
|
|
|
else
|
|
@@ -1518,8 +1534,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|
|
if (new_isize != cur_isize) {
|
|
|
/* Do we perhaps have any outstanding writes, or has
|
|
|
* the file grown beyond our last write? */
|
|
|
- if ((nfsi->npages == 0 && !test_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) ||
|
|
|
- new_isize > cur_isize) {
|
|
|
+ if ((nfsi->npages == 0) || new_isize > cur_isize) {
|
|
|
i_size_write(inode, new_isize);
|
|
|
invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
|
|
|
}
|