Loading fs/nfs/file.c +1 −11 Original line number Diff line number Diff line Loading @@ -101,21 +101,11 @@ EXPORT_SYMBOL_GPL(nfs_file_release); static int nfs_revalidate_file_size(struct inode *inode, struct file *filp) { struct nfs_server *server = NFS_SERVER(inode); struct nfs_inode *nfsi = NFS_I(inode); const unsigned long force_reval = NFS_INO_REVAL_PAGECACHE|NFS_INO_REVAL_FORCED; unsigned long cache_validity = nfsi->cache_validity; if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ) && (cache_validity & force_reval) != force_reval) goto out_noreval; if (filp->f_flags & O_DIRECT) goto force_reval; if (nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) goto force_reval; if (nfs_attribute_timeout(inode)) if (nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE)) goto force_reval; out_noreval: return 0; force_reval: return __nfs_revalidate_inode(server, inode); Loading fs/nfs/inode.c +32 −11 Original line number Diff line number Diff line Loading @@ -160,6 +160,36 @@ int nfs_sync_mapping(struct address_space *mapping) return ret; } static bool nfs_check_cache_invalid_delegated(struct inode *inode, unsigned long flags) { unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity); /* Special case for the pagecache or access cache */ if (flags == NFS_INO_REVAL_PAGECACHE && !(cache_validity & NFS_INO_REVAL_FORCED)) return false; return (cache_validity & flags) != 0; } static bool nfs_check_cache_invalid_not_delegated(struct inode *inode, unsigned long flags) { unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity); if ((cache_validity & flags) != 0) return true; if (nfs_attribute_timeout(inode)) return true; return false; } bool nfs_check_cache_invalid(struct inode *inode, unsigned long flags) { if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) return nfs_check_cache_invalid_delegated(inode, flags); return nfs_check_cache_invalid_not_delegated(inode, flags); } static void nfs_set_cache_invalid(struct inode *inode, unsigned long flags) { struct nfs_inode *nfsi = NFS_I(inode); Loading Loading @@ -1116,17 +1146,8 @@ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *map bool nfs_mapping_need_revalidate_inode(struct inode *inode) { unsigned long cache_validity = NFS_I(inode)->cache_validity; if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) { const unsigned long force_reval = NFS_INO_REVAL_PAGECACHE|NFS_INO_REVAL_FORCED; return (cache_validity & force_reval) == force_reval; } return (cache_validity & NFS_INO_REVAL_PAGECACHE) || nfs_attribute_timeout(inode) || NFS_STALE(inode); return nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE) || NFS_STALE(inode); } int nfs_revalidate_mapping_rcu(struct inode *inode) Loading fs/nfs/internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -381,6 +381,7 @@ extern int nfs_drop_inode(struct inode *); extern void nfs_clear_inode(struct inode *); extern void nfs_evict_inode(struct inode *); void nfs_zap_acl_cache(struct inode *inode); extern bool nfs_check_cache_invalid(struct inode *, unsigned long); extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode); extern int nfs_wait_atomic_killable(atomic_t *p); Loading Loading
fs/nfs/file.c +1 −11 Original line number Diff line number Diff line Loading @@ -101,21 +101,11 @@ EXPORT_SYMBOL_GPL(nfs_file_release); static int nfs_revalidate_file_size(struct inode *inode, struct file *filp) { struct nfs_server *server = NFS_SERVER(inode); struct nfs_inode *nfsi = NFS_I(inode); const unsigned long force_reval = NFS_INO_REVAL_PAGECACHE|NFS_INO_REVAL_FORCED; unsigned long cache_validity = nfsi->cache_validity; if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ) && (cache_validity & force_reval) != force_reval) goto out_noreval; if (filp->f_flags & O_DIRECT) goto force_reval; if (nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE) goto force_reval; if (nfs_attribute_timeout(inode)) if (nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE)) goto force_reval; out_noreval: return 0; force_reval: return __nfs_revalidate_inode(server, inode); Loading
fs/nfs/inode.c +32 −11 Original line number Diff line number Diff line Loading @@ -160,6 +160,36 @@ int nfs_sync_mapping(struct address_space *mapping) return ret; } static bool nfs_check_cache_invalid_delegated(struct inode *inode, unsigned long flags) { unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity); /* Special case for the pagecache or access cache */ if (flags == NFS_INO_REVAL_PAGECACHE && !(cache_validity & NFS_INO_REVAL_FORCED)) return false; return (cache_validity & flags) != 0; } static bool nfs_check_cache_invalid_not_delegated(struct inode *inode, unsigned long flags) { unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity); if ((cache_validity & flags) != 0) return true; if (nfs_attribute_timeout(inode)) return true; return false; } bool nfs_check_cache_invalid(struct inode *inode, unsigned long flags) { if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) return nfs_check_cache_invalid_delegated(inode, flags); return nfs_check_cache_invalid_not_delegated(inode, flags); } static void nfs_set_cache_invalid(struct inode *inode, unsigned long flags) { struct nfs_inode *nfsi = NFS_I(inode); Loading Loading @@ -1116,17 +1146,8 @@ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *map bool nfs_mapping_need_revalidate_inode(struct inode *inode) { unsigned long cache_validity = NFS_I(inode)->cache_validity; if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) { const unsigned long force_reval = NFS_INO_REVAL_PAGECACHE|NFS_INO_REVAL_FORCED; return (cache_validity & force_reval) == force_reval; } return (cache_validity & NFS_INO_REVAL_PAGECACHE) || nfs_attribute_timeout(inode) || NFS_STALE(inode); return nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE) || NFS_STALE(inode); } int nfs_revalidate_mapping_rcu(struct inode *inode) Loading
fs/nfs/internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -381,6 +381,7 @@ extern int nfs_drop_inode(struct inode *); extern void nfs_clear_inode(struct inode *); extern void nfs_evict_inode(struct inode *); void nfs_zap_acl_cache(struct inode *inode); extern bool nfs_check_cache_invalid(struct inode *, unsigned long); extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode); extern int nfs_wait_atomic_killable(atomic_t *p); Loading