-
Notifications
You must be signed in to change notification settings - Fork 262
btrfs-progs: offline filesystem resize feature #1007
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Will this allow for resizing a fs that would normally go ro due to enospc during mount? |
Yeah, I don't see why not! |
Unfortunately not that simple. If the fs has metadata full, it may still fail. Thankfully this one is only mostly modifying chunk tree, which is not that common to exhaust system chunks. Please use chunk root instead since you're only modifying chunk tree. Furthermore there are a lot of code style problems, like unexpected new lines splitting variable definitions (e.g. between And the parameter list for that function is also pretty bad. I'd say normally we put more important parameter (like path, which specifies a whole fs) first, and more specific parameters like new size after that. |
And a lot of error handling is missing. E.g. if |
Ahh yeah, that makes sense.
Good catch... I don't have the best understanding of btrfs transactions. When I was testing this patch it appeared like the filesystem was being resized correctly, why would this be the case if I'm passing the wrong target? Was it making changes to the wrong tree? Was I just getting lucky?
Will do.
Will check this in v2.
I'll rethink the parameter ordering. I pass the amount parameter as a char because I call check_offline_resize_args inside offline_resize and I wanted to keep all of the argument logic together. |
Ok, makes sense will fix in v2. |
The target root for
You can check how other codes in btrfs-progs is doing. There are exceptions like the existing In your particular case, we won't support anything other than a number, thus parsing it early will be a more common solution. BTW, for your update, you can just force push the same branch. No need to create a new PR. |
In this case there is a difference between passing "+1G" and "1G" that would be lost if I just passed a u64. "+1G" increases the filesystem size by 1G and "1G" sets the filesystem size to 1G. I could pass a u64 along with a boolean to indicate whether the size is relative to the existing filesystem size, but it feels like this logic would be better encapsulated inside check_offline_resize_args. |
An offline tool that increases a device's size--and does nothing else--is much more likely to succeed in that situation than mount + fi-resize, but it can still fail in one really specific case. mount does a number of things that can result in enospc failure. Off the top of my head: orphan inode reclaim, the snapshot cleaner thread, tearing down an incomplete reloc tree, and resuming a balance (this is the only one that can be turned off by a mount option). Avoiding these other tasks makes success far more likely. The chunk tree is stored in the system chunk, which is a dedicated contiguous storage area that is usually already large enough for two copies of the chunk tree. To run out of space there, you'd need hundreds of thousands of chunks, like a Users can run into this case fairly often when they have filesystems that are close to this threshold size (100 TiB or multiples thereof). A smaller filesystem doesn't allocate enough chunks to require a new system chunk, while a bigger filesystem would have unallocated space when it needs a new system chunk. It also comes up if you're running any striped profile (raid0, raid10, raid5, or raid6) and you don't do something to reduce dev_extent fragmentation--I hit this with a 26T filesystem once, that had 250k chunks after several drive upgrades and naive balances. If you're willing to accept overwriting a metadata page in place, you can resize a device by finding the page in the chunk tree where the device item is, changing the size field in the dev item, and updating the csum (in addition to the superblock changes, which are already overwrite-in-place, and repeated across all mirrors). Increasing or decreasing a device size (without relocating any chunks) doesn't require any new allocations. |
Just use |
d7e49b7
to
44e653a
Compare
Force pushed with a v2
I'm still passing the amount as a cstring because a s64 doesn't convey the difference between "+1G" and "1G". |
f660864
to
a452b1e
Compare
@adam900710 ping for v2 review |
f4799f1
to
7a8c4e5
Compare
05e416f
to
539b0cb
Compare
b53afc2
to
62510de
Compare
Just sent out v3! I now have 3 commits the first refactors how check_resize_args parses the amount string into it's own function to parse_resize_args so it can be used in check_offline_resize_args. The second commit is the actual offline resize logic which does not allow for multi-device resizing and uses the new parse_resize_args. The third is a new test for offline resize. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks good to me overall. I like the extracted parser.
Mostly minor problems like extra holes, some error handling timing, and missing man page update.
62510de
to
4837b98
Compare
Just sent out v4 with updated documentation + fixes |
310731d
to
2403e3c
Compare
36aa4fc
to
7ab197e
Compare
Looks good to me, there are some minor coding things that I might fix once this is in devel as they're more stylistic than functional. Regarding the options, we'll probably settle on |
Thank you! |
Extract resize argument parsing logic from check_resize_args() into a separate parse_resize_args() function. This refactoring improves code organization and makes the parsing logic reusable for future features like offline resize. No functional changes to existing resize behavior. Signed-off-by: Leo Martins <[email protected]>
Add support for resizing btrfs filesystems while unmounted using a new --offline flag. This enables filesystem resizing without requiring mount privileges or dealing with mounted filesystem constraints. The offline resize functionality currently only supports increasing the size of single-device filesystem. It works on both block devices and regular files. For regular files it also truncates the file to the new size. This provides a safer alternative for users who need to resize filesystems in environments where mounting may not be possible or desirable, such as in containers or during system recovery. Signed-off-by: Leo Martins <[email protected]>
Add comprehensive test coverage for the new --offline resize feature. The test suite covers: - Valid resize operations: incremental (+1G, 1:+1G) and absolute (2G) - Invalid operations that should fail: shrinking, multi-device, cancel - Error conditions: invalid device IDs, malformed size arguments - Option compatibility: --offline with --enqueue should be rejected - Mount state validation: offline resize should fail on mounted filesystems Each test creates temporary filesystem images, performs resize operations, and verifies the resulting filesystem size matches expectations. Error cases use run_mustfail to ensure proper failure handling. Signed-off-by: Leo Martins <[email protected]>
Add documentation for the new --offline feature in btrfs-filesystem.rst. Changed the warning to reflect that it is now possible to resize a btrfs image, but you need to specify the --offline flag. Highlighted that --offline flag only supports increasing the size of single device filesystems. Signed-off-by: Leo Martins <[email protected]>
2403e3c
to
208cf2e
Compare
Merged. Thanks. |
Add support for resizing btrfs filesystems while unmounted using a new option --offline, without requiring mount privileges or dealing with mounted filesystem constraints. Current limitations: - increase size - single-device filesystem It works on both block devices and regular files. For regular files it also truncates the file to the new size. This provides an alternative for users who need to resize filesystems in environments where mounting may not be possible or desirable, such as in containers or during system recovery. Pull-request: #1007 Signed-off-by: Leo Martins <[email protected]>
A few notes from the post-merge review. I've fixed some of that directly, less trivial updates will be probably in separate commits. I've also edited the changelogs so it's closer to the style I'm trying to keep for the whole progs.
|
Add support for resizing btrfs filesystems while unmounted using a new option --offline, without requiring mount privileges or dealing with mounted filesystem constraints. Current limitations: - increase size - single-device filesystem It works on both block devices and regular files. For regular files it also truncates the file to the new size. This provides an alternative for users who need to resize filesystems in environments where mounting may not be possible or desirable, such as in containers or during system recovery. Pull-request: #1007 Signed-off-by: Leo Martins <[email protected]>
Add support for resizing btrfs filesystems while unmounted using a new option --offline, without requiring mount privileges or dealing with mounted filesystem constraints. Current limitations: - increase size - single-device filesystem It works on both block devices and regular files. For regular files it also truncates the file to the new size. This provides an alternative for users who need to resize filesystems in environments where mounting may not be possible or desirable, such as in containers or during system recovery. Pull-request: #1007 Signed-off-by: Leo Martins <[email protected]>
This patch introduces the ability to resize a btrfs filesystem while it is not mounted via a new
--offline
flag. Currently only increasing the size of the filesystem is supported, though I believe it would be possible to implement shrinking the filesystem to the end of the last device extent.This is a more general, and hopefully more useful, solution to the problem I was trying to solve with the
("btrfs-progs: add slack space for mkfs --shrink") patch. This patch should enable users to resize a filesystem without the higher capabilities needed for mounting a filesystem.