ctx->dup_cookie = 0;
                ctx->cred = get_cred(cred);
                spin_lock(&dir->i_lock);
+               if (list_empty(&nfsi->open_files) &&
+                   (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
+                       nfsi->cache_validity |= NFS_INO_INVALID_DATA |
+                               NFS_INO_REVAL_FORCED;
                list_add(&ctx->list, &nfsi->open_files);
                spin_unlock(&dir->i_lock);
                return ctx;
 
        }
 
        if (inode->i_mapping->nrpages == 0)
-               flags &= ~NFS_INO_INVALID_DATA;
+               flags &= ~(NFS_INO_INVALID_DATA|NFS_INO_DATA_INVAL_DEFER);
        nfsi->cache_validity |= flags;
        if (flags & NFS_INO_INVALID_DATA)
                nfs_fscache_invalidate(inode);
        i_size_write(inode, offset);
        /* Optimisation */
        if (offset == 0)
-               NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_DATA;
+               NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_DATA |
+                               NFS_INO_DATA_INVAL_DEFER);
        NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE;
 
        spin_unlock(&inode->i_lock);
        struct nfs_inode *nfsi = NFS_I(inode);
 
        spin_lock(&inode->i_lock);
+       if (list_empty(&nfsi->open_files) &&
+           (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER))
+               nfsi->cache_validity |= NFS_INO_INVALID_DATA |
+                       NFS_INO_REVAL_FORCED;
        list_add_tail_rcu(&ctx->list, &nfsi->open_files);
        spin_unlock(&inode->i_lock);
 }
 
        set_bit(NFS_INO_INVALIDATING, bitlock);
        smp_wmb();
-       nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
+       nfsi->cache_validity &= ~(NFS_INO_INVALID_DATA|
+                       NFS_INO_DATA_INVAL_DEFER);
        spin_unlock(&inode->i_lock);
        trace_nfs_invalidate_mapping_enter(inode);
        ret = nfs_invalidate_mapping(inode, mapping);
                                dprintk("NFS: change_attr change on server for file %s/%ld\n",
                                                inode->i_sb->s_id,
                                                inode->i_ino);
-                       }
+                       } else if (!have_delegation)
+                               nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
                        inode_set_iversion_raw(inode, fattr->change_attr);
                        attr_changed = true;
                }
 
 #define NFS_INO_INVALID_MTIME  BIT(10)         /* cached mtime is invalid */
 #define NFS_INO_INVALID_SIZE   BIT(11)         /* cached size is invalid */
 #define NFS_INO_INVALID_OTHER  BIT(12)         /* other attrs are invalid */
+#define NFS_INO_DATA_INVAL_DEFER       \
+                               BIT(13)         /* Deferred cache invalidation */
 
 #define NFS_INO_INVALID_ATTR   (NFS_INO_INVALID_CHANGE \
                | NFS_INO_INVALID_CTIME \