diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-06-05 19:23:43 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2007-07-10 23:40:25 -0400 |
commit | a50f7951a31d3b976e829250853f89c9d2da32c0 (patch) | |
tree | de9e8a3f93ee724471a49d9edb1155adef8d41f5 /fs/nfs/dir.c | |
parent | e2f032e9ef66e33089d09452892696ea97d1dca1 (diff) |
NFS: Fix an Oops in the nfs_access_cache_shrinker()
The nfs_access_cache_shrinker may race with nfs_access_zap_cache().
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/dir.c')
-rw-r--r-- | fs/nfs/dir.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 0f41678fd7ee..322141f4ab48 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -1743,8 +1743,8 @@ int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) | |||
1743 | struct nfs_inode *nfsi; | 1743 | struct nfs_inode *nfsi; |
1744 | struct nfs_access_entry *cache; | 1744 | struct nfs_access_entry *cache; |
1745 | 1745 | ||
1746 | spin_lock(&nfs_access_lru_lock); | ||
1747 | restart: | 1746 | restart: |
1747 | spin_lock(&nfs_access_lru_lock); | ||
1748 | list_for_each_entry(nfsi, &nfs_access_lru_list, access_cache_inode_lru) { | 1748 | list_for_each_entry(nfsi, &nfs_access_lru_list, access_cache_inode_lru) { |
1749 | struct inode *inode; | 1749 | struct inode *inode; |
1750 | 1750 | ||
@@ -1769,6 +1769,7 @@ remove_lru_entry: | |||
1769 | clear_bit(NFS_INO_ACL_LRU_SET, &nfsi->flags); | 1769 | clear_bit(NFS_INO_ACL_LRU_SET, &nfsi->flags); |
1770 | } | 1770 | } |
1771 | spin_unlock(&inode->i_lock); | 1771 | spin_unlock(&inode->i_lock); |
1772 | spin_unlock(&nfs_access_lru_lock); | ||
1772 | iput(inode); | 1773 | iput(inode); |
1773 | goto restart; | 1774 | goto restart; |
1774 | } | 1775 | } |