@@ -182,6 +182,12 @@ static inline u64 btrfs_block_group_end(struct btrfs_block_group *block_group)
return (block_group->start + block_group->length);
}
+static inline bool btrfs_is_block_group_data(
+ struct btrfs_block_group *block_group)
+{
+ return (block_group->flags & BTRFS_BLOCK_GROUP_DATA);
+}
+
#ifdef CONFIG_BTRFS_DEBUG
static inline int btrfs_should_fragment_free_space(
struct btrfs_block_group *block_group)
@@ -49,6 +49,9 @@ static void __btrfs_add_to_discard_list(struct btrfs_discard_ctl *discard_ctl,
void btrfs_add_to_discard_list(struct btrfs_discard_ctl *discard_ctl,
struct btrfs_block_group *block_group)
{
+ if (!btrfs_is_block_group_data(block_group))
+ return;
+
spin_lock(&discard_ctl->lock);
__btrfs_add_to_discard_list(discard_ctl, block_group);
@@ -159,7 +162,11 @@ static struct btrfs_block_group *peek_discard_list(
if (block_group && now > block_group->discard_eligible_time) {
if (block_group->discard_index == BTRFS_DISCARD_INDEX_UNUSED &&
block_group->used != 0) {
- __btrfs_add_to_discard_list(discard_ctl, block_group);
+ if (btrfs_is_block_group_data(block_group))
+ __btrfs_add_to_discard_list(discard_ctl,
+ block_group);
+ else
+ list_del_init(&block_group->discard_list);
goto again;
}
if (block_group->discard_state == BTRFS_DISCARD_RESET_CURSOR) {
@@ -501,7 +508,8 @@ void btrfs_discard_update_discardable(struct btrfs_block_group *block_group,
s64 bytes_delta;
if (!block_group ||
- !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC))
+ !btrfs_test_opt(block_group->fs_info, DISCARD_ASYNC) ||
+ !btrfs_is_block_group_data(block_group))
return;
discard_ctl = &block_group->fs_info->discard_ctl;