]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: add extra error messages for delalloc range related errors
authorQu Wenruo <wqu@suse.com>
Thu, 12 Dec 2024 06:14:02 +0000 (16:44 +1030)
committerDavid Sterba <dsterba@suse.com>
Mon, 13 Jan 2025 14:59:35 +0000 (15:59 +0100)
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 was 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().

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c
fs/btrfs/inode.c

index 5014134b9aa2c9e4c25146e7d45a74c3f4282c9a..d9f856358704f4f8476aa897f69b768b29e993a6 100644 (file)
@@ -1255,6 +1255,15 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
                                                       wbc);
                        if (ret >= 0)
                                last_finished_delalloc_end = 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",
+                                            btrfs_root_id(inode->root),
+                                            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,
@@ -1553,6 +1562,12 @@ 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_root_id(inode->root), btrfs_ino(inode),
+                            folio_pos(folio), fs_info->sectors_per_page,
+                            &bio_ctrl->submit_bitmap, ret);
 
        bio_ctrl->wbc->nr_to_write--;
 
index 7aa178e728cfaf762bf9017d28aa9ade4487327b..57bd601cc736446d37f743917ee09c197e00b63e 100644 (file)
@@ -1132,6 +1132,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);
        }
 }
 
@@ -1576,6 +1580,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;
 }