NFS: Remove requirement for inode->i_mutex from nfs_invalidate_mapping
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
@@ -560,7 +560,7 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
|
|||||||
desc->entry = &my_entry;
|
desc->entry = &my_entry;
|
||||||
|
|
||||||
nfs_block_sillyrename(dentry);
|
nfs_block_sillyrename(dentry);
|
||||||
res = nfs_revalidate_mapping_nolock(inode, filp->f_mapping);
|
res = nfs_revalidate_mapping(inode, filp->f_mapping);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@@ -754,7 +754,7 @@ int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
|
|||||||
return __nfs_revalidate_inode(server, inode);
|
return __nfs_revalidate_inode(server, inode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nfs_invalidate_mapping_nolock(struct inode *inode, struct address_space *mapping)
|
static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
|
||||||
{
|
{
|
||||||
struct nfs_inode *nfsi = NFS_I(inode);
|
struct nfs_inode *nfsi = NFS_I(inode);
|
||||||
|
|
||||||
@@ -775,49 +775,10 @@ static int nfs_invalidate_mapping_nolock(struct inode *inode, struct address_spa
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nfs_invalidate_mapping(struct inode *inode, struct address_space *mapping)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
mutex_lock(&inode->i_mutex);
|
|
||||||
if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_DATA) {
|
|
||||||
ret = nfs_sync_mapping(mapping);
|
|
||||||
if (ret == 0)
|
|
||||||
ret = nfs_invalidate_mapping_nolock(inode, mapping);
|
|
||||||
}
|
|
||||||
mutex_unlock(&inode->i_mutex);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* nfs_revalidate_mapping_nolock - Revalidate the pagecache
|
|
||||||
* @inode - pointer to host inode
|
|
||||||
* @mapping - pointer to mapping
|
|
||||||
*/
|
|
||||||
int nfs_revalidate_mapping_nolock(struct inode *inode, struct address_space *mapping)
|
|
||||||
{
|
|
||||||
struct nfs_inode *nfsi = NFS_I(inode);
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if ((nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE)
|
|
||||||
|| nfs_attribute_timeout(inode) || NFS_STALE(inode)) {
|
|
||||||
ret = __nfs_revalidate_inode(NFS_SERVER(inode), inode);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
|
|
||||||
ret = nfs_invalidate_mapping_nolock(inode, mapping);
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nfs_revalidate_mapping - Revalidate the pagecache
|
* nfs_revalidate_mapping - Revalidate the pagecache
|
||||||
* @inode - pointer to host inode
|
* @inode - pointer to host inode
|
||||||
* @mapping - pointer to mapping
|
* @mapping - pointer to mapping
|
||||||
*
|
|
||||||
* This version of the function will take the inode->i_mutex and attempt to
|
|
||||||
* flush out all dirty data if it needs to invalidate the page cache.
|
|
||||||
*/
|
*/
|
||||||
int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
|
int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
|
||||||
{
|
{
|
||||||
|
@@ -50,7 +50,7 @@ static void *nfs_follow_link(struct dentry *dentry, struct nameidata *nd)
|
|||||||
struct page *page;
|
struct page *page;
|
||||||
void *err;
|
void *err;
|
||||||
|
|
||||||
err = ERR_PTR(nfs_revalidate_mapping_nolock(inode, inode->i_mapping));
|
err = ERR_PTR(nfs_revalidate_mapping(inode, inode->i_mapping));
|
||||||
if (err)
|
if (err)
|
||||||
goto read_failed;
|
goto read_failed;
|
||||||
page = read_cache_page(&inode->i_data, 0,
|
page = read_cache_page(&inode->i_data, 0,
|
||||||
|
@@ -347,7 +347,6 @@ extern int nfs_attribute_timeout(struct inode *inode);
|
|||||||
extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode);
|
extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode);
|
||||||
extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
|
extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
|
||||||
extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
|
extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
|
||||||
extern int nfs_revalidate_mapping_nolock(struct inode *inode, struct address_space *mapping);
|
|
||||||
extern int nfs_setattr(struct dentry *, struct iattr *);
|
extern int nfs_setattr(struct dentry *, struct iattr *);
|
||||||
extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr);
|
extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr);
|
||||||
extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
|
extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
|
||||||
|
Reference in New Issue
Block a user