NFS: Clean up cache validity checking
Consolidate the open-coded checking of NFS_I(inode)->cache_validity into a couple of helper functions. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Родитель
58ff41842c
Коммит
61540bf6bb
|
@ -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)
|
||||
if (nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE))
|
||||
goto force_reval;
|
||||
if (nfs_attribute_timeout(inode))
|
||||
goto force_reval;
|
||||
out_noreval:
|
||||
return 0;
|
||||
force_reval:
|
||||
return __nfs_revalidate_inode(server, inode);
|
||||
|
|
|
@ -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);
|
||||
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче