diff options
author | Christoph Hellwig <hch@lst.de> | 2014-04-22 17:11:50 -0400 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2014-04-22 17:11:50 -0400 |
commit | ce695c6551f9488e75247ac1eefcd173fda0c029 (patch) | |
tree | fbd28d5e65266788f28bbe3d832498fe855b63d5 /fs/xfs/xfs_mru_cache.c | |
parent | c977eb1065612bf64e18c61437e290c22183add8 (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.c | 14 |
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( | |||
443 | void *value) | 443 | void *value) |
444 | { | 444 | { |
445 | xfs_mru_cache_elem_t *elem; | 445 | xfs_mru_cache_elem_t *elem; |
446 | int error; | ||
446 | 447 | ||
447 | ASSERT(mru && mru->lists); | 448 | ASSERT(mru && mru->lists); |
448 | if (!mru || !mru->lists) | 449 | if (!mru || !mru->lists) |
@@ -453,8 +454,8 @@ xfs_mru_cache_insert( | |||
453 | return ENOMEM; | 454 | return ENOMEM; |
454 | 455 | ||
455 | if (radix_tree_preload(GFP_KERNEL)) { | 456 | if (radix_tree_preload(GFP_KERNEL)) { |
456 | kmem_zone_free(xfs_mru_elem_zone, elem); | 457 | error = ENOMEM; |
457 | return ENOMEM; | 458 | goto out_free_item; |
458 | } | 459 | } |
459 | 460 | ||
460 | INIT_LIST_HEAD(&elem->list_node); | 461 | INIT_LIST_HEAD(&elem->list_node); |
@@ -463,13 +464,20 @@ xfs_mru_cache_insert( | |||
463 | 464 | ||
464 | spin_lock(&mru->lock); | 465 | spin_lock(&mru->lock); |
465 | 466 | ||
466 | radix_tree_insert(&mru->store, key, elem); | 467 | error = -radix_tree_insert(&mru->store, key, elem); |
467 | radix_tree_preload_end(); | 468 | radix_tree_preload_end(); |
469 | if (error) { | ||
470 | spin_unlock(&mru->lock); | ||
471 | goto out_free_item; | ||
472 | } | ||
468 | _xfs_mru_cache_list_insert(mru, elem); | 473 | _xfs_mru_cache_list_insert(mru, elem); |
469 | 474 | ||
470 | spin_unlock(&mru->lock); | 475 | spin_unlock(&mru->lock); |
471 | 476 | ||
472 | return 0; | 477 | return 0; |
478 | out_free_item: | ||
479 | kmem_zone_free(xfs_mru_elem_zone, elem); | ||
480 | return error; | ||
473 | } | 481 | } |
474 | 482 | ||
475 | /* | 483 | /* |