Btrfs: fall back to non-inline if we don't have enough space
authorJosef Bacik <josef@redhat.com>
Wed, 23 May 2012 20:10:14 +0000 (16:10 -0400)
committerJosef Bacik <josef@redhat.com>
Wed, 30 May 2012 14:23:38 +0000 (10:23 -0400)
If cow_file_range_inline fails with ENOSPC we abort the transaction which
isn't very nice.  This really shouldn't be happening anyways but there's no
sense in making it a horrible error when we can easily just go allocate
normal data space for this stuff.  Thanks,

Signed-off-by: Josef Bacik <josef@redhat.com>
fs/btrfs/inode.c

index 029892887fc1f364bb53cbfbd273f4fda0aeb8f4..92df0a5d1d942c56d48d754ec4b4f901ce984c29 100644 (file)
@@ -257,10 +257,13 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans,
        ret = insert_inline_extent(trans, root, inode, start,
                                   inline_len, compressed_size,
                                   compress_type, compressed_pages);
-       if (ret) {
+       if (ret && ret != -ENOSPC) {
                btrfs_abort_transaction(trans, root, ret);
                return ret;
+       } else if (ret == -ENOSPC) {
+               return 1;
        }
+
        btrfs_delalloc_release_metadata(inode, end + 1 - start);
        btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0);
        return 0;