2009/2/26 Josef Bacik <jo...@redhat.com>: > On Wed, Feb 25, 2009 at 02:13:10PM -0500, Chris Ball wrote: >> Hi, >> >> This patch (against experimental HEAD) attempts to make shrinking more >> robust, by only updating device size if we've succeeded in creating >> enough free space without any failures in btrfs_relocate_chunk(). >> >> Here's a log with my patch applied. The two things to note are that a >> near-limit shrink now works, and that a failed shrink (in this case, >> trying to shrink to less than the used space) no longer updates the >> device size erroneously: >> >> http://dev.laptop.org/~cjb/btrfs/shrink-log >> >> Please review carefully -- I'm still new to btrfs. The short version of >> the patch is: >> >> * create a success path, as a break out of the while(1) relocating >> (rather than going to the "done" label). >> * move the device size updating code into that path >> * leave "path->reada = 2;" behind in the entry path, since path is >> used by the searching operation rather than the later resize. >> >> Thanks! >> >> Signed-off-by: Chris Ball <c...@laptop.org> >> >> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c >> index 1316139..e2fa072 100644 >> --- a/fs/btrfs/volumes.c >> +++ b/fs/btrfs/volumes.c >> @@ -1815,30 +1815,8 @@ int btrfs_shrink_device(struct btrfs_device *device, >> u64 new_size) >> if (!path) >> return -ENOMEM; >> >> - trans = btrfs_start_transaction(root, 1); >> - if (!trans) { >> - ret = -ENOMEM; >> - goto done; >> - } >> - >> path->reada = 2; >> >> - lock_chunks(root); >> - >> - device->total_bytes = new_size; >> - if (device->writeable) >> - device->fs_devices->total_rw_bytes -= diff; > > So I think you still want to do this part, to keep the allocator from actually > allocating new space in the area we are trying to cull with the shrink, we > just > don't want to update the ondisk stuff just yet, so everything else can be > moved > to below the loop. > > So this >> - ret = btrfs_update_device(trans, device); >> - if (ret) { >> - unlock_chunks(root); >> - btrfs_end_transaction(trans, root); >> - goto done; >> - } >> - WARN_ON(diff > old_total); >> - btrfs_set_super_total_bytes(super_copy, old_total - diff); > > to here should all be moved below like you have it. Other than that it looks > good. Thanks, >
This isn't working. we don't call btrfs_update_device here, but it can be called in other places. I think we should add a new field in btrfs_device to reflect the on disk device size, and update it when shrinking succeeds. Regards Yan Zheng -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html