Commit 36c86a9e authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: output more debug messages for uncommitted transaction

Print extra information about how many dirty bytes an uncommitted
has at the end of mount.
Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent c2f82263
...@@ -4483,6 +4483,48 @@ int btrfs_commit_super(struct btrfs_fs_info *fs_info) ...@@ -4483,6 +4483,48 @@ int btrfs_commit_super(struct btrfs_fs_info *fs_info)
return btrfs_commit_transaction(trans); return btrfs_commit_transaction(trans);
} }
static void warn_about_uncommitted_trans(struct btrfs_fs_info *fs_info)
{
struct btrfs_transaction *trans;
struct btrfs_transaction *tmp;
bool found = false;
if (list_empty(&fs_info->trans_list))
return;
/*
* This function is only called at the very end of close_ctree(),
* thus no other running transaction, no need to take trans_lock.
*/
ASSERT(test_bit(BTRFS_FS_CLOSING_DONE, &fs_info->flags));
list_for_each_entry_safe(trans, tmp, &fs_info->trans_list, list) {
struct extent_state *cached = NULL;
u64 dirty_bytes = 0;
u64 cur = 0;
u64 found_start;
u64 found_end;
found = true;
while (!find_first_extent_bit(&trans->dirty_pages, cur,
&found_start, &found_end, EXTENT_DIRTY, &cached)) {
dirty_bytes += found_end + 1 - found_start;
cur = found_end + 1;
}
btrfs_warn(fs_info,
"transaction %llu (with %llu dirty metadata bytes) is not committed",
trans->transid, dirty_bytes);
btrfs_cleanup_one_transaction(trans, fs_info);
if (trans == fs_info->running_transaction)
fs_info->running_transaction = NULL;
list_del_init(&trans->list);
btrfs_put_transaction(trans);
trace_btrfs_transaction_commit(fs_info);
}
ASSERT(!found);
}
void __cold close_ctree(struct btrfs_fs_info *fs_info) void __cold close_ctree(struct btrfs_fs_info *fs_info)
{ {
int ret; int ret;
...@@ -4591,7 +4633,7 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info) ...@@ -4591,7 +4633,7 @@ void __cold close_ctree(struct btrfs_fs_info *fs_info)
btrfs_stop_all_workers(fs_info); btrfs_stop_all_workers(fs_info);
/* We shouldn't have any transaction open at this point */ /* We shouldn't have any transaction open at this point */
ASSERT(list_empty(&fs_info->trans_list)); warn_about_uncommitted_trans(fs_info);
clear_bit(BTRFS_FS_OPEN, &fs_info->flags); clear_bit(BTRFS_FS_OPEN, &fs_info->flags);
free_root_pointers(fs_info, true); free_root_pointers(fs_info, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment