diff mbox series

btrfs: reset RO counter on block group if we fail to relocate

Message ID ca31fa4152849cee02f16c49f7ef818b89995a25.1658768686.git.josef@toxicpanda.com (mailing list archive)
State New, archived
Headers show
Series btrfs: reset RO counter on block group if we fail to relocate | expand

Commit Message

Josef Bacik July 25, 2022, 5:05 p.m. UTC
With the automatic block group reclaim code we will preemptively try to
mark the block group RO before we start the relocation.  We do this to
make sure we should actually try to relocate the block group.

However if we hit an error during the actual relocation we won't clean
up our RO counter and the block group will remain RO.  This was observed
internally with file systems reporting less space available from df when
we had failed background relocations.

Fix this by doing the dec_ro in the error case.

Fixes: 18bb8bbf13c1 ("btrfs: zoned: automatically reclaim zones")
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 fs/btrfs/block-group.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Boris Burkov July 25, 2022, 9:55 p.m. UTC | #1
On Mon, Jul 25, 2022 at 01:05:05PM -0400, Josef Bacik wrote:
> With the automatic block group reclaim code we will preemptively try to
> mark the block group RO before we start the relocation.  We do this to
> make sure we should actually try to relocate the block group.
> 
> However if we hit an error during the actual relocation we won't clean
> up our RO counter and the block group will remain RO.  This was observed
> internally with file systems reporting less space available from df when
> we had failed background relocations.
> 
> Fix this by doing the dec_ro in the error case.
> 
> Fixes: 18bb8bbf13c1 ("btrfs: zoned: automatically reclaim zones")
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Boris Burkov <boris@bur.io>
> ---
>  fs/btrfs/block-group.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
> index c3aecfb0a71d..993aca2f1e18 100644
> --- a/fs/btrfs/block-group.c
> +++ b/fs/btrfs/block-group.c
> @@ -1640,9 +1640,11 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
>  				div64_u64(zone_unusable * 100, bg->length));
>  		trace_btrfs_reclaim_block_group(bg);
>  		ret = btrfs_relocate_chunk(fs_info, bg->start);
> -		if (ret)
> +		if (ret) {
> +			btrfs_dec_block_group_ro(bg);
>  			btrfs_err(fs_info, "error relocating chunk %llu",
>  				  bg->start);
> +		}
>  
>  next:
>  		btrfs_put_block_group(bg);
> -- 
> 2.26.3
>
David Sterba July 27, 2022, 7:24 p.m. UTC | #2
On Mon, Jul 25, 2022 at 01:05:05PM -0400, Josef Bacik wrote:
> With the automatic block group reclaim code we will preemptively try to
> mark the block group RO before we start the relocation.  We do this to
> make sure we should actually try to relocate the block group.
> 
> However if we hit an error during the actual relocation we won't clean
> up our RO counter and the block group will remain RO.  This was observed
> internally with file systems reporting less space available from df when
> we had failed background relocations.
> 
> Fix this by doing the dec_ro in the error case.
> 
> Fixes: 18bb8bbf13c1 ("btrfs: zoned: automatically reclaim zones")
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>

Added to misc-next, thanks.
diff mbox series

Patch

diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index c3aecfb0a71d..993aca2f1e18 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -1640,9 +1640,11 @@  void btrfs_reclaim_bgs_work(struct work_struct *work)
 				div64_u64(zone_unusable * 100, bg->length));
 		trace_btrfs_reclaim_block_group(bg);
 		ret = btrfs_relocate_chunk(fs_info, bg->start);
-		if (ret)
+		if (ret) {
+			btrfs_dec_block_group_ro(bg);
 			btrfs_err(fs_info, "error relocating chunk %llu",
 				  bg->start);
+		}
 
 next:
 		btrfs_put_block_group(bg);