Skip to content

Commit 4a500fd

Browse files
Yan, Zhengchrismason-xx
authored andcommitted
Btrfs: Metadata ENOSPC handling for tree log
Previous patches make the allocater return -ENOSPC if there is no unreserved free metadata space. This patch updates tree log code and various other places to propagate/handle the ENOSPC error. Signed-off-by: Yan Zheng <zheng.yan@oracle.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
1 parent d68fc57 commit 4a500fd

File tree

5 files changed

+156
-128
lines changed

5 files changed

+156
-128
lines changed

fs/btrfs/disk-io.c

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -972,42 +972,6 @@ static int find_and_setup_root(struct btrfs_root *tree_root,
972972
return 0;
973973
}
974974

975-
int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
976-
struct btrfs_fs_info *fs_info)
977-
{
978-
struct extent_buffer *eb;
979-
struct btrfs_root *log_root_tree = fs_info->log_root_tree;
980-
u64 start = 0;
981-
u64 end = 0;
982-
int ret;
983-
984-
if (!log_root_tree)
985-
return 0;
986-
987-
while (1) {
988-
ret = find_first_extent_bit(&log_root_tree->dirty_log_pages,
989-
0, &start, &end, EXTENT_DIRTY | EXTENT_NEW);
990-
if (ret)
991-
break;
992-
993-
clear_extent_bits(&log_root_tree->dirty_log_pages, start, end,
994-
EXTENT_DIRTY | EXTENT_NEW, GFP_NOFS);
995-
}
996-
eb = fs_info->log_root_tree->node;
997-
998-
WARN_ON(btrfs_header_level(eb) != 0);
999-
WARN_ON(btrfs_header_nritems(eb) != 0);
1000-
1001-
ret = btrfs_free_reserved_extent(fs_info->tree_root,
1002-
eb->start, eb->len);
1003-
BUG_ON(ret);
1004-
1005-
free_extent_buffer(eb);
1006-
kfree(fs_info->log_root_tree);
1007-
fs_info->log_root_tree = NULL;
1008-
return 0;
1009-
}
1010-
1011975
static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans,
1012976
struct btrfs_fs_info *fs_info)
1013977
{

fs/btrfs/disk-io.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ int btrfs_congested_async(struct btrfs_fs_info *info, int iodone);
9595
unsigned long btrfs_async_submit_limit(struct btrfs_fs_info *info);
9696
int btrfs_write_tree_block(struct extent_buffer *buf);
9797
int btrfs_wait_tree_block_writeback(struct extent_buffer *buf);
98-
int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
99-
struct btrfs_fs_info *fs_info);
10098
int btrfs_init_log_root_tree(struct btrfs_trans_handle *trans,
10199
struct btrfs_fs_info *fs_info);
102100
int btrfs_add_log_tree(struct btrfs_trans_handle *trans,

fs/btrfs/file-item.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,9 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
657657
goto found;
658658
}
659659
ret = PTR_ERR(item);
660+
if (ret != -EFBIG && ret != -ENOENT)
661+
goto fail_unlock;
662+
660663
if (ret == -EFBIG) {
661664
u32 item_size;
662665
/* we found one, but it isn't big enough yet */

0 commit comments

Comments
 (0)