nfs: set invalid blocks after NFSv4 writes
[linux-2.6-microblaze.git] / fs / nfs / inode.c
index b9d0921..0bf1f83 100644 (file)
@@ -833,6 +833,8 @@ int nfs_getattr(const struct path *path, struct kstat *stat,
                do_update |= cache_validity & NFS_INO_INVALID_ATIME;
        if (request_mask & (STATX_CTIME|STATX_MTIME))
                do_update |= cache_validity & NFS_INO_REVAL_PAGECACHE;
+       if (request_mask & STATX_BLOCKS)
+               do_update |= cache_validity & NFS_INO_INVALID_BLOCKS;
        if (do_update) {
                /* Update the attribute cache */
                if (!(server->flags & NFS_MOUNT_NOAC))
@@ -1764,7 +1766,8 @@ out_noforce:
        status = nfs_post_op_update_inode_locked(inode, fattr,
                        NFS_INO_INVALID_CHANGE
                        | NFS_INO_INVALID_CTIME
-                       | NFS_INO_INVALID_MTIME);
+                       | NFS_INO_INVALID_MTIME
+                       | NFS_INO_INVALID_BLOCKS);
        return status;
 }
 
@@ -1871,7 +1874,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
        nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR
                        | NFS_INO_INVALID_ATIME
                        | NFS_INO_REVAL_FORCED
-                       | NFS_INO_REVAL_PAGECACHE);
+                       | NFS_INO_REVAL_PAGECACHE
+                       | NFS_INO_INVALID_BLOCKS);
 
        /* Do atomic weak cache consistency updates */
        nfs_wcc_update_inode(inode, fattr);
@@ -2033,8 +2037,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                inode->i_blocks = nfs_calc_block_size(fattr->du.nfs3.used);
        } else if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED)
                inode->i_blocks = fattr->du.nfs2.blocks;
-       else
+       else {
+               nfsi->cache_validity |= save_cache_validity &
+                               (NFS_INO_INVALID_BLOCKS
+                               | NFS_INO_REVAL_FORCED);
                cache_revalidated = false;
+       }
 
        /* Update attrtimeo value if we're out of the unstable period */
        if (attr_changed) {