mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-15 21:23:23 +00:00
btrfs: add extra error messages for delalloc range related errors
All the error handling bugs I hit so far are all -ENOSPC from either: - cow_file_range() - run_delalloc_nocow() - submit_uncompressed_range() Previously when those functions failed, there is no error message at all, making the debugging much harder. So here we introduce extra error messages for: - cow_file_range() - run_delalloc_nocow() - submit_uncompressed_range() - writepage_delalloc() when btrfs_run_delalloc_range() failed - extent_writepage() when extent_writepage_io() failed One example of the new debug error messages is the following one: run fstests generic/750 at 2024-12-08 12:41:41 BTRFS: device fsid 461b25f5-e240-4543-8deb-e7c2bd01a6d3 devid 1 transid 8 /dev/mapper/test-scratch1 (253:4) scanned by mount (2436600) BTRFS info (device dm-4): first mount of filesystem 461b25f5-e240-4543-8deb-e7c2bd01a6d3 BTRFS info (device dm-4): using crc32c (crc32c-arm64) checksum algorithm BTRFS info (device dm-4): forcing free space tree for sector size 4096 with page size 65536 BTRFS info (device dm-4): using free-space-tree BTRFS warning (device dm-4): read-write for sector size 4096 with page size 65536 is experimental BTRFS info (device dm-4): checking UUID tree BTRFS error (device dm-4): cow_file_range failed, root=363 inode=412 start=503808 len=98304: -28 BTRFS error (device dm-4): run_delalloc_nocow failed, root=363 inode=412 start=503808 len=98304: -28 BTRFS error (device dm-4): failed to run delalloc range, root=363 ino=412 folio=458752 submit_bitmap=11-15 start=503808 len=98304: -28 Which shows an error from cow_file_range() which is called inside a nocow write attempt, along with the extra bitmap from writepage_delalloc(). Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
87c53d275f
commit
d39da2bda9
@ -1254,6 +1254,15 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
|
||||
wbc);
|
||||
if (ret >= 0)
|
||||
last_finished = found_start + found_len;
|
||||
if (unlikely(ret < 0))
|
||||
btrfs_err_rl(fs_info,
|
||||
"failed to run delalloc range, root=%lld ino=%llu folio=%llu submit_bitmap=%*pbl start=%llu len=%u: %d",
|
||||
inode->root->root_key.objectid,
|
||||
btrfs_ino(inode),
|
||||
folio_pos(folio),
|
||||
fs_info->sectors_per_page,
|
||||
&bio_ctrl->submit_bitmap,
|
||||
found_start, found_len, ret);
|
||||
} else {
|
||||
/*
|
||||
* We've hit an error during previous delalloc range,
|
||||
@ -1546,6 +1555,13 @@ static int extent_writepage(struct folio *folio, struct btrfs_bio_ctrl *bio_ctrl
|
||||
PAGE_SIZE, bio_ctrl, i_size);
|
||||
if (ret == 1)
|
||||
return 0;
|
||||
if (ret < 0)
|
||||
btrfs_err_rl(fs_info,
|
||||
"failed to submit blocks, root=%lld inode=%llu folio=%llu submit_bitmap=%*pbl: %d",
|
||||
BTRFS_I(inode)->root->root_key.objectid,
|
||||
btrfs_ino(BTRFS_I(inode)),
|
||||
folio_pos(folio), fs_info->sectors_per_page,
|
||||
&bio_ctrl->submit_bitmap, ret);
|
||||
|
||||
bio_ctrl->wbc->nr_to_write--;
|
||||
|
||||
|
@ -1134,6 +1134,10 @@ static void submit_uncompressed_range(struct btrfs_inode *inode,
|
||||
if (locked_folio)
|
||||
btrfs_folio_end_lock(inode->root->fs_info, locked_folio,
|
||||
start, async_extent->ram_size);
|
||||
btrfs_err_rl(inode->root->fs_info,
|
||||
"%s failed, root=%llu inode=%llu start=%llu len=%llu: %d",
|
||||
__func__, btrfs_root_id(inode->root),
|
||||
btrfs_ino(inode), start, async_extent->ram_size, ret);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1246,7 +1250,7 @@ out_free_reserve:
|
||||
free_async_extent_pages(async_extent);
|
||||
if (async_chunk->blkcg_css)
|
||||
kthread_associate_blkcg(NULL);
|
||||
btrfs_debug(fs_info,
|
||||
btrfs_debug_rl(fs_info,
|
||||
"async extent submission failed root=%lld inode=%llu start=%llu len=%llu ret=%d",
|
||||
btrfs_root_id(root), btrfs_ino(inode), start,
|
||||
async_extent->ram_size, ret);
|
||||
@ -1580,6 +1584,10 @@ out_unlock:
|
||||
btrfs_qgroup_free_data(inode, NULL, start + cur_alloc_size,
|
||||
end - start - cur_alloc_size + 1, NULL);
|
||||
}
|
||||
btrfs_err_rl(fs_info,
|
||||
"%s failed, root=%llu inode=%llu start=%llu len=%llu: %d",
|
||||
__func__, btrfs_root_id(inode->root),
|
||||
btrfs_ino(inode), orig_start, end + 1 - orig_start, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2322,6 +2330,10 @@ error:
|
||||
btrfs_qgroup_free_data(inode, NULL, cur_offset, end - cur_offset + 1, NULL);
|
||||
}
|
||||
btrfs_free_path(path);
|
||||
btrfs_err_rl(fs_info,
|
||||
"%s failed, root=%llu inode=%llu start=%llu len=%llu: %d",
|
||||
__func__, btrfs_root_id(inode->root),
|
||||
btrfs_ino(inode), start, end + 1 - start, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -652,7 +652,7 @@ IMPLEMENT_BTRFS_PAGE_OPS(checked, folio_set_checked, folio_clear_checked,
|
||||
\
|
||||
GET_SUBPAGE_BITMAP(subpage, fs_info, name, &bitmap); \
|
||||
btrfs_warn(fs_info, \
|
||||
"dumpping bitmap start=%llu len=%u folio=%llu" #name "_bitmap=%*pbl", \
|
||||
"dumpping bitmap start=%llu len=%u folio=%llu " #name "_bitmap=%*pbl", \
|
||||
start, len, folio_pos(folio), \
|
||||
fs_info->sectors_per_page, &bitmap); \
|
||||
}
|
||||
@ -717,6 +717,7 @@ void btrfs_folio_set_lock(const struct btrfs_fs_info *fs_info,
|
||||
/* Target range should not yet be locked. */
|
||||
if (unlikely(!bitmap_test_range_all_zero(subpage->bitmaps, start_bit, nbits))) {
|
||||
subpage_dump_bitmap(fs_info, folio, locked, start, len);
|
||||
btrfs_warn(fs_info, "nr_locked=%u\n", atomic_read(&subpage->nr_locked));
|
||||
ASSERT(bitmap_test_range_all_zero(subpage->bitmaps, start_bit, nbits));
|
||||
}
|
||||
bitmap_set(subpage->bitmaps, start_bit, nbits);
|
||||
|
Loading…
x
Reference in New Issue
Block a user