diff options
Diffstat (limited to 'fs/btrfs/block-group.c')
| -rw-r--r-- | fs/btrfs/block-group.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 1e09aeea69c2..1a66be33bb04 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1785,6 +1785,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)  		container_of(work, struct btrfs_fs_info, reclaim_bgs_work);  	struct btrfs_block_group *bg;  	struct btrfs_space_info *space_info; +	LIST_HEAD(retry_list);  	if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags))  		return; @@ -1921,8 +1922,11 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)  		}  next: -		if (ret) -			btrfs_mark_bg_to_reclaim(bg); +		if (ret) { +			/* Refcount held by the reclaim_bgs list after splice. */ +			btrfs_get_block_group(bg); +			list_add_tail(&bg->bg_list, &retry_list); +		}  		btrfs_put_block_group(bg);  		mutex_unlock(&fs_info->reclaim_bgs_lock); @@ -1942,6 +1946,9 @@ next:  	spin_unlock(&fs_info->unused_bgs_lock);  	mutex_unlock(&fs_info->reclaim_bgs_lock);  end: +	spin_lock(&fs_info->unused_bgs_lock); +	list_splice_tail(&retry_list, &fs_info->reclaim_bgs); +	spin_unlock(&fs_info->unused_bgs_lock);  	btrfs_exclop_finish(fs_info);  	sb_end_write(fs_info->sb);  }  | 
