Btrfs: do not abort transaction in prealloc case
authorLiu Bo <liubo2009@cn.fujitsu.com>
Fri, 6 Jul 2012 09:31:33 +0000 (03:31 -0600)
committerChris Mason <chris.mason@fusionio.com>
Mon, 23 Jul 2012 20:28:01 +0000 (16:28 -0400)
During disk balance, we prealloc new file extent for file data relocation,
but we may fail in 'no available space' case, and it leads to flipping btrfs
into readonly.

It is not necessary to bail out and abort transaction since we do have several
ways to rescue ourselves from ENOSPC case.

Signed-off-by: Liu Bo <liubo2009@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
fs/btrfs/extent-tree.c

index d1ebd2a06116fc30645291894efcf207ac9248cc..67bd12a5236927cc001157c978cee19d3f2cc304 100644 (file)
@@ -5748,7 +5748,11 @@ loop:
                                ret = do_chunk_alloc(trans, root, num_bytes +
                                                     2 * 1024 * 1024, data,
                                                     CHUNK_ALLOC_LIMITED);
-                               if (ret < 0) {
+                               /*
+                                * Do not bail out on ENOSPC since we
+                                * can do more things.
+                                */
+                               if (ret < 0 && ret != -ENOSPC) {
                                        btrfs_abort_transaction(trans,
                                                                root, ret);
                                        goto out;