]> git.hungrycats.org Git - linux/commitdiff
btrfs: relocation: Output current relocation stage at btrfs_relocate_block_group()
authorQu Wenruo <wqu@suse.com>
Fri, 29 Nov 2019 04:40:59 +0000 (12:40 +0800)
committerZygo Blaxell <ce3g8jdj@umail.furryterror.org>
Sat, 14 Dec 2019 04:53:07 +0000 (23:53 -0500)
There are several reports of hanging relocation, populating the dmesg
with things like:
  BTRFS info (device dm-5): found 1 extents

The investigation is still on going, but will never hurt to output a
little more info.

This patch will also output the current relocation stage, making that
output something like:

  BTRFS info (device dm-5): balance: start -d -m -s
  BTRFS info (device dm-5): relocating block group 30408704 flags metadata|dup
  BTRFS info (device dm-5): found 2 extents, stage: move data extents
  BTRFS info (device dm-5): relocating block group 22020096 flags system|dup
  BTRFS info (device dm-5): found 1 extents, stage: move data extents
  BTRFS info (device dm-5): relocating block group 13631488 flags data
  BTRFS info (device dm-5): found 1 extents, stage: move data extents
  BTRFS info (device dm-5): found 1 extents, stage: update data pointers
  BTRFS info (device dm-5): balance: ended with status: 0

This patch will not increase the number of lines, but with extra info
for us to debug the reported problem.
(Although it's very likely the bug is sticking at "update data pointers"
stage, even without the patch)

Signed-off-by: Qu Wenruo <wqu@suse.com>
(cherry picked from commit b04bb3a0ee5916885cb989f904d0168ac181e649)

fs/btrfs/relocation.c

index b37b52cfaa0e7ed5614038c54e7f15ae9eab2a63..88b4d0225ffb157dd743bff9f9c5b29fc84d6a65 100644 (file)
@@ -4295,6 +4295,15 @@ static void describe_relocation(struct btrfs_fs_info *fs_info,
                   block_group->start, buf);
 }
 
+static const char *stage_to_string(int stage)
+{
+       if (stage == MOVE_DATA_EXTENTS)
+               return "move data extents";
+       if (stage == UPDATE_DATA_PTRS)
+       return "update data pointers";
+       return "unknown";
+}
+
 /*
  * function to relocate all extents in a block group.
  */
@@ -4369,12 +4378,15 @@ int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start)
                                 rc->block_group->length);
 
        while (1) {
+               int finishes_stage;
+
                mutex_lock(&fs_info->cleaner_mutex);
                ret = relocate_block_group(rc);
                mutex_unlock(&fs_info->cleaner_mutex);
                if (ret < 0)
                        err = ret;
 
+               finishes_stage = rc->stage;
                /*
                 * We may have gotten ENOSPC after we already dirtied some
                 * extents.  If writeout happens while we're relocating a
@@ -4400,8 +4412,8 @@ int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start)
                if (rc->extents_found == 0)
                        break;
 
-               btrfs_info(fs_info, "found %llu extents", rc->extents_found);
-
+               btrfs_info(fs_info, "found %llu extents, stage: %s",
+                          rc->extents_found, stage_to_string(finishes_stage));
        }
 
        WARN_ON(rc->block_group->pinned > 0);