mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
NFS: Clean up nfs_refresh_inode() and nfs_post_op_update_inode()
Try to avoid taking and dropping the inode->i_lock more than once. Do so by moving the code in nfs_refresh_inode() that needs to be done under the spinlock into a function nfs_refresh_inode_locked(), and then having both nfs_refresh_inode() and nfs_post_op_update_inode() call it directly. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
7973c1f15a
commit
870a5be8b9
1 changed files with 14 additions and 7 deletions
|
@ -948,6 +948,15 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nfs_refresh_inode_locked(struct inode *inode, struct nfs_fattr *fattr)
|
||||||
|
{
|
||||||
|
struct nfs_inode *nfsi = NFS_I(inode);
|
||||||
|
|
||||||
|
if (time_after(fattr->time_start, nfsi->last_updated))
|
||||||
|
return nfs_update_inode(inode, fattr);
|
||||||
|
return nfs_check_inode_attributes(inode, fattr);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nfs_refresh_inode - try to update the inode attribute cache
|
* nfs_refresh_inode - try to update the inode attribute cache
|
||||||
* @inode - pointer to inode
|
* @inode - pointer to inode
|
||||||
|
@ -960,17 +969,12 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
|
||||||
*/
|
*/
|
||||||
int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
|
int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||||
{
|
{
|
||||||
struct nfs_inode *nfsi = NFS_I(inode);
|
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if ((fattr->valid & NFS_ATTR_FATTR) == 0)
|
if ((fattr->valid & NFS_ATTR_FATTR) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
if (time_after(fattr->time_start, nfsi->last_updated))
|
status = nfs_refresh_inode_locked(inode, fattr);
|
||||||
status = nfs_update_inode(inode, fattr);
|
|
||||||
else
|
|
||||||
status = nfs_check_inode_attributes(inode, fattr);
|
|
||||||
|
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -992,13 +996,16 @@ int nfs_refresh_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||||
int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||||
{
|
{
|
||||||
struct nfs_inode *nfsi = NFS_I(inode);
|
struct nfs_inode *nfsi = NFS_I(inode);
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
|
nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
|
||||||
if (S_ISDIR(inode->i_mode))
|
if (S_ISDIR(inode->i_mode))
|
||||||
nfsi->cache_validity |= NFS_INO_INVALID_DATA;
|
nfsi->cache_validity |= NFS_INO_INVALID_DATA;
|
||||||
|
if ((fattr->valid & NFS_ATTR_FATTR) != 0)
|
||||||
|
status = nfs_refresh_inode_locked(inode, fattr);
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
return nfs_refresh_inode(inode, fattr);
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue