Commit 1cfdbe0d authored by Naohiro Aota's avatar Naohiro Aota Committed by David Sterba
Browse files

btrfs: factor out check_removing_space_info() from btrfs_free_block_groups()



Factor out check_removing_space_info() from btrfs_free_block_groups(). It
sanity checks a to-be-removed space_info. There is no functional change.

Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 4ec06a9d
Loading
Loading
Loading
Loading
+27 −22
Original line number Diff line number Diff line
@@ -4400,6 +4400,32 @@ void btrfs_put_block_group_cache(struct btrfs_fs_info *info)
	}
}

static void check_removing_space_info(struct btrfs_space_info *space_info)
{
	struct btrfs_fs_info *info = space_info->fs_info;

	/*
	 * Do not hide this behind enospc_debug, this is actually important and
	 * indicates a real bug if this happens.
	 */
	if (WARN_ON(space_info->bytes_pinned > 0 || space_info->bytes_may_use > 0))
		btrfs_dump_space_info(info, space_info, 0, 0);

	/*
	 * If there was a failure to cleanup a log tree, very likely due to an
	 * IO failure on a writeback attempt of one or more of its extent
	 * buffers, we could not do proper (and cheap) unaccounting of their
	 * reserved space, so don't warn on bytes_reserved > 0 in that case.
	 */
	if (!(space_info->flags & BTRFS_BLOCK_GROUP_METADATA) ||
	    !BTRFS_FS_LOG_CLEANUP_ERROR(info)) {
		if (WARN_ON(space_info->bytes_reserved > 0))
			btrfs_dump_space_info(info, space_info, 0, 0);
	}

	WARN_ON(space_info->reclaim_size > 0);
}

/*
 * Must be called only after stopping all workers, since we could have block
 * group caching kthreads running, and therefore they could race with us if we
@@ -4500,28 +4526,7 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)
		space_info = list_first_entry(&info->space_info,
					      struct btrfs_space_info, list);

		/*
		 * Do not hide this behind enospc_debug, this is actually
		 * important and indicates a real bug if this happens.
		 */
		if (WARN_ON(space_info->bytes_pinned > 0 ||
			    space_info->bytes_may_use > 0))
			btrfs_dump_space_info(info, space_info, 0, 0);

		/*
		 * If there was a failure to cleanup a log tree, very likely due
		 * to an IO failure on a writeback attempt of one or more of its
		 * extent buffers, we could not do proper (and cheap) unaccounting
		 * of their reserved space, so don't warn on bytes_reserved > 0 in
		 * that case.
		 */
		if (!(space_info->flags & BTRFS_BLOCK_GROUP_METADATA) ||
		    !BTRFS_FS_LOG_CLEANUP_ERROR(info)) {
			if (WARN_ON(space_info->bytes_reserved > 0))
				btrfs_dump_space_info(info, space_info, 0, 0);
		}

		WARN_ON(space_info->reclaim_size > 0);
		check_removing_space_info(space_info);
		list_del(&space_info->list);
		btrfs_sysfs_remove_space_info(space_info);
	}