summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_mru_cache.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2014-04-23 07:11:50 +1000
committerDave Chinner <david@fromorbit.com>2014-04-23 07:11:50 +1000
commitce695c6551f9488e75247ac1eefcd173fda0c029 (patch)
treefbd28d5e65266788f28bbe3d832498fe855b63d5 /fs/xfs/xfs_mru_cache.c
parentc977eb1065612bf64e18c61437e290c22183add8 (diff)
xfs: handle duplicate entries in xfs_mru_cache_insert
The radix tree code can detect and reject duplicate keys at insert time. Make xfs_mru_cache_insert handle this case so that future changes to the filestream allocator can take advantage of this. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_mru_cache.c')
-rw-r--r--fs/xfs/xfs_mru_cache.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c
index 4aff56395732..4aa316644721 100644
--- a/fs/xfs/xfs_mru_cache.c
+++ b/fs/xfs/xfs_mru_cache.c
@@ -443,6 +443,7 @@ xfs_mru_cache_insert(
void *value)
{
xfs_mru_cache_elem_t *elem;
+ int error;
ASSERT(mru && mru->lists);
if (!mru || !mru->lists)
@@ -453,8 +454,8 @@ xfs_mru_cache_insert(
return ENOMEM;
if (radix_tree_preload(GFP_KERNEL)) {
- kmem_zone_free(xfs_mru_elem_zone, elem);
- return ENOMEM;
+ error = ENOMEM;
+ goto out_free_item;
}
INIT_LIST_HEAD(&elem->list_node);
@@ -463,13 +464,20 @@ xfs_mru_cache_insert(
spin_lock(&mru->lock);
- radix_tree_insert(&mru->store, key, elem);
+ error = -radix_tree_insert(&mru->store, key, elem);
radix_tree_preload_end();
+ if (error) {
+ spin_unlock(&mru->lock);
+ goto out_free_item;
+ }
_xfs_mru_cache_list_insert(mru, elem);
spin_unlock(&mru->lock);
return 0;
+out_free_item:
+ kmem_zone_free(xfs_mru_elem_zone, elem);
+ return error;
}
/*