diff options
author | Josef Bacik <josef@redhat.com> | 2012-05-23 16:10:14 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-17 11:21:24 -0700 |
commit | 4e050dfccceeb07641b8cf50618eb71e5208a6dc (patch) | |
tree | c4ab8a5a76896d58c1197edf7537f070d51b2bec /fs | |
parent | e82c95f9f0cb025da8e1af6df1c29080a78d0f84 (diff) | |
download | linux-3.10-4e050dfccceeb07641b8cf50618eb71e5208a6dc.tar.gz linux-3.10-4e050dfccceeb07641b8cf50618eb71e5208a6dc.tar.bz2 linux-3.10-4e050dfccceeb07641b8cf50618eb71e5208a6dc.zip |
Btrfs: fall back to non-inline if we don't have enough space
commit 2adcac1a7331d93a17285804819caa96070b231f upstream.
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>
Acked-by: Chris Mason <chris.mason@fusionio.com>
Cc: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 61b16c641ce..0df0d1fd4fe 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -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; |