Message ID | c94cdbf63118d14cfc0f95827cd67d8be1bae068.1695836511.git.josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: adjust overcommit logic and fixes | expand |
On Wed, Sep 27, 2023 at 01:47:00PM -0400, Josef Bacik wrote: > My overcommit patch exposed a bug with btrfs/177. The problem here is Which patch is that? > that when we grow the device we're not adding to ->free_chunk_space, so > subsequent allocations can cause ->free_chunk_space to wrap, which > causes problems in can_overcommit because we add this to ->total_bytes, > which causes the counter to wrap and gives us an unexpected ENOSPC. > > Fix this by properly updating ->free_chunk_space with the new available > space in btrfs_grow_device. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> > --- > fs/btrfs/volumes.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index 907ea775f4e4..1aedd15d1db7 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -2932,6 +2932,7 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans, > btrfs_set_super_total_bytes(super_copy, > round_down(old_total + diff, fs_info->sectorsize)); > device->fs_devices->total_rw_bytes += diff; > + atomic64_add(diff, &fs_info->free_chunk_space); > > btrfs_device_set_total_bytes(device, new_size); > btrfs_device_set_disk_total_bytes(device, new_size); > -- > 2.41.0
On Fri, Sep 29, 2023 at 06:30:35PM +0200, David Sterba wrote: > On Wed, Sep 27, 2023 at 01:47:00PM -0400, Josef Bacik wrote: > > My overcommit patch exposed a bug with btrfs/177. The problem here is > > Which patch is that? > Sorry the V1 version of this series. Thanks, Josef
On Mon, Oct 02, 2023 at 04:44:18PM -0400, Josef Bacik wrote: > On Fri, Sep 29, 2023 at 06:30:35PM +0200, David Sterba wrote: > > On Wed, Sep 27, 2023 at 01:47:00PM -0400, Josef Bacik wrote: > > > My overcommit patch exposed a bug with btrfs/177. The problem here is > > > > Which patch is that? > > > > Sorry the V1 version of this series. Thanks, Ok thanks, I've added a link to the changelog.
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 907ea775f4e4..1aedd15d1db7 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2932,6 +2932,7 @@ int btrfs_grow_device(struct btrfs_trans_handle *trans, btrfs_set_super_total_bytes(super_copy, round_down(old_total + diff, fs_info->sectorsize)); device->fs_devices->total_rw_bytes += diff; + atomic64_add(diff, &fs_info->free_chunk_space); btrfs_device_set_total_bytes(device, new_size); btrfs_device_set_disk_total_bytes(device, new_size);
My overcommit patch exposed a bug with btrfs/177. The problem here is that when we grow the device we're not adding to ->free_chunk_space, so subsequent allocations can cause ->free_chunk_space to wrap, which causes problems in can_overcommit because we add this to ->total_bytes, which causes the counter to wrap and gives us an unexpected ENOSPC. Fix this by properly updating ->free_chunk_space with the new available space in btrfs_grow_device. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- fs/btrfs/volumes.c | 1 + 1 file changed, 1 insertion(+)