Btrfs: avoid premature -ENOMEM in clear_extent_bit()
authorFilipe Manana <fdmanana@suse.com>
Mon, 3 Nov 2014 14:12:57 +0000 (14:12 +0000)
committerChris Mason <clm@fb.com>
Fri, 21 Nov 2014 01:20:06 +0000 (17:20 -0800)
We try to allocate an extent state structure before acquiring the extent
state tree's spinlock as we might need a new one later and therefore avoid
doing later an atomic allocation while holding the tree's spinlock. However
we returned -ENOMEM if that initial non-atomic allocation failed, which is
a bit excessive since we might end up not needing the pre-allocated extent
state at all - for the case where the tree doesn't have any extent states
that cover the input range and cover too any other range. Therefore don't
return -ENOMEM if that pre-allocation fails.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/extent_io.c

index 654ed3de005461a5f1829a5d432401a9035bb1fa..4ebabd2371533788c496070122def464004328ac 100644 (file)
@@ -595,9 +595,14 @@ int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end,
                clear = 1;
 again:
        if (!prealloc && (mask & __GFP_WAIT)) {
+               /*
+                * Don't care for allocation failure here because we might end
+                * up not needing the pre-allocated extent state at all, which
+                * is the case if we only have in the tree extent states that
+                * cover our input range and don't cover too any other range.
+                * If we end up needing a new extent state we allocate it later.
+                */
                prealloc = alloc_extent_state(mask);
-               if (!prealloc)
-                       return -ENOMEM;
        }
 
        spin_lock(&tree->lock);