]> git.karo-electronics.de Git - linux-beck.git/commitdiff
xfs: handle duplicate entries in xfs_mru_cache_insert
authorChristoph Hellwig <hch@lst.de>
Tue, 22 Apr 2014 21:11:50 +0000 (07:11 +1000)
committerDave Chinner <david@fromorbit.com>
Tue, 22 Apr 2014 21:11:50 +0000 (07:11 +1000)
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>
fs/xfs/xfs_mru_cache.c

index 4aff56395732591e6d06b8e95d4e6b89ddb59b70..4aa31664472123ff4bfca273fb5f6f9415f67c2d 100644 (file)
@@ -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;
 }
 
 /*