Btrfs: Fix handling of space info full during allocations
authorChris Mason <chris.mason@oracle.com>
Thu, 13 Nov 2008 14:59:33 +0000 (09:59 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 13 Nov 2008 14:59:33 +0000 (09:59 -0500)
When we fail to allocate a new block group, we should still do the
checks to make sure allocations try again with the minimum requested
allocation size.

This also fixes a deadlock that come from a missed down_read in
the chunk allocation failure handling.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c

index b7530c3ac2063593c904ed52030ea9effd1e7d3f..22820f91d2b01247a353f06c2f59c84f348a80a2 100644 (file)
@@ -2301,9 +2301,9 @@ new_group_no_lock:
                                up_read(&space_info->groups_sem);
                                ret = do_chunk_alloc(trans, root, num_bytes +
                                                     2 * 1024 * 1024, data, 1);
-                               if (ret < 0)
-                                       break;
                                down_read(&space_info->groups_sem);
+                               if (ret < 0)
+                                       goto loop_check;
                                head = &space_info->block_groups;
                                /*
                                 * we've allocated a new chunk, keep
@@ -2314,6 +2314,7 @@ new_group_no_lock:
                        } else if (!allowed_chunk_alloc) {
                                space_info->force_alloc = 1;
                        }
+loop_check:
                        if (keep_going) {
                                cur = head->next;
                                extra_loop = 0;