]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
repart: Force --rootdir population for btrfs with compression
authorChris Down <chris@chrisdown.name>
Thu, 6 Nov 2025 15:17:01 +0000 (23:17 +0800)
committerChris Down <chris@chrisdown.name>
Fri, 7 Nov 2025 10:17:08 +0000 (18:17 +0800)
When a btrfs partition is configured with both Compression= and
CopyFiles=, we need to ensure files are copied during filesystem
creation using mkfs.btrfs --rootdir, rather than copying files
afterwards via loop device mounting.

This is required because mkfs.btrfs can only apply compression settings
when files are provided via --rootdir during filesystem creation. If we
format the filesystem first and then mount it to copy files, the
compression setting is meaningless.

Modify the partition_needs_populate() condition to force the --rootdir
code path when the format is btrfs and compression is requested.

This ensures that partition_populate_directory() runs and creates a
temporary directory with the files, which is then passed to
make_filesystem() as the root parameter, allowing mkfs.btrfs to create
the filesystem with compression applied.

Fixes: https://github.com/systemd/systemd/issues/39584
src/repart/repart.c

index dbf261bb262856d0deb40b510c8dee1d9090cdd1..456aed41bd7f6d437f71656a8115c375aa23522e 100644 (file)
@@ -6785,7 +6785,8 @@ static int context_mkfs(Context *context) {
                  * have to populate using the filesystem's mkfs's --root= (or equivalent) option. To do that,
                  * we need to set up the final directory tree beforehand. */
 
-                if (partition_needs_populate(p) && (!t->loop || fstype_is_ro(p->format))) {
+                if (partition_needs_populate(p) &&
+                    (!t->loop || fstype_is_ro(p->format) || (streq_ptr(p->format, "btrfs") && p->compression))) {
                         if (!mkfs_supports_root_option(p->format))
                                 return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
                                                         "Loop device access is required to populate %s filesystems.",
@@ -8533,7 +8534,7 @@ static int context_minimize(Context *context) {
                                 return r;
                 }
 
-                if (!d || fstype_is_ro(p->format)) {
+                if (!d || fstype_is_ro(p->format) || (streq_ptr(p->format, "btrfs") && p->compression)) {
                         if (!mkfs_supports_root_option(p->format))
                                 return log_error_errno(SYNTHETIC_ERRNO(ENODEV),
                                                        "Loop device access is required to populate %s filesystems.",