The only failure condition is for GFP_ATOMIC allocations. Push up to
 callers which are already handling it.

Signed-off-by: Jeff Mahoney <je...@suse.com>
---
 fs/btrfs/extent_io.c |   26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

Index: linux-3.0-SLE11-SP2/fs/btrfs/extent_io.c
===================================================================
--- linux-3.0-SLE11-SP2.orig/fs/btrfs/extent_io.c       2011-11-21 
14:09:59.000000000 -0500
+++ linux-3.0-SLE11-SP2/fs/btrfs/extent_io.c    2011-11-21 14:11:54.000000000 
-0500
@@ -765,6 +765,9 @@ static void uncache_state(struct extent_
  * part of the range already has the desired bits set.  The start of the
  * existing range is returned in failed_start in this case.
  *
+ * It may also fail with -ENOMEM if memory cannot be obtained for extent_state
+ * structures when called with mask == GFP_ATOMIC.
+ *
  * [start, end] is inclusive This takes the tree lock.
  */
 
@@ -803,7 +806,11 @@ again:
        if (!node) {
                assert_atomic_alloc(prealloc, mask);
                prealloc = alloc_extent_state_atomic(prealloc);
-               BUG_ON(!prealloc);
+               if (!prealloc) {
+                       err = -ENOMEM;
+                       goto out;
+               }
+
                err = insert_state(tree, prealloc, start, end, &bits);
                if (err)
                        extent_io_tree_panic(tree, err);
@@ -873,7 +880,11 @@ hit_next:
 
                assert_atomic_alloc(prealloc, mask);
                prealloc = alloc_extent_state_atomic(prealloc);
-               BUG_ON(!prealloc);
+               if (!prealloc) {
+                       err = -ENOMEM;
+                       goto out;
+               }
+
                err = split_state(tree, state, prealloc, start);
                if (err)
                        extent_io_tree_panic(tree, err);
@@ -907,7 +918,10 @@ hit_next:
 
                assert_atomic_alloc(prealloc, mask);
                prealloc = alloc_extent_state_atomic(prealloc);
-               BUG_ON(!prealloc);
+               if (!prealloc) {
+                       err = -ENOMEM;
+                       goto out;
+               }
 
                /*
                 * Avoid to free 'prealloc' if it can be merged with
@@ -938,7 +952,11 @@ hit_next:
 
                assert_atomic_alloc(prealloc, mask);
                prealloc = alloc_extent_state_atomic(prealloc);
-               BUG_ON(!prealloc);
+               if (!prealloc) {
+                       err = -ENOMEM;
+                       goto out;
+               }
+
                err = split_state(tree, state, prealloc, end + 1);
                if (err)
                        extent_io_tree_panic(tree, err);


--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to