]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
repart: Extend squashfs logic to all read-only filesystems
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 22 Sep 2022 19:28:58 +0000 (21:28 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Fri, 23 Sep 2022 07:55:17 +0000 (09:55 +0200)
The same logic will apply to every read-only filesystem that we
might add support for in the future, so let's make this a bit more
future proof.

src/partition/repart.c
src/shared/mkfs-util.c
src/shared/mkfs-util.h

index 5b9d142e4082dfd8a7767102965b314f6a50c364..325cdf0b9972122f603f29a838c62b326bd98310 100644 (file)
@@ -3306,12 +3306,12 @@ static int partition_populate_directory(Partition *p, char **ret_root, char **re
         assert(ret_root);
         assert(ret_tmp_root);
 
-        /* When generating squashfs, we need the source tree to be available when we generate the squashfs
-         * filesystem. Because we might have multiple source trees, we build a temporary source tree
-         * beforehand where we merge all our inputs. We then use this merged source tree to create the
-         * squashfs filesystem. */
+        /* When generating read-only filesystems, we need the source tree to be available when we generate
+         * the read-only filesystem. Because we might have multiple source trees, we build a temporary source
+         * tree beforehand where we merge all our inputs. We then use this merged source tree to create the
+         * read-only filesystem. */
 
-        if (!streq(p->format, "squashfs")) {
+        if (!fstype_is_ro(p->format)) {
                 *ret_root = NULL;
                 *ret_tmp_root = NULL;
                 return 0;
@@ -3357,7 +3357,7 @@ static int partition_populate_filesystem(Partition *p, const char *node) {
         assert(p);
         assert(node);
 
-        if (streq(p->format, "squashfs"))
+        if (fstype_is_ro(p->format))
                 return 0;
 
         if (strv_isempty(p->copy_files) && strv_isempty(p->make_directories))
@@ -3464,9 +3464,9 @@ static int context_mkfs(Context *context) {
 
                 /* Ideally, we populate filesystems using our own code after creating the filesystem to
                  * ensure consistent handling of chattrs, xattrs and other similar things. However, when
-                 * using squashfs, we can't populate after creating the filesystem because it's read-only, so
-                 * instead we create a temporary root to use as the source tree when generating the squashfs
-                 * filesystem. */
+                 * using read-only filesystems such as squashfs, we can't populate after creating the
+                 * filesystem because it's read-only, so instead we create a temporary root to use as the
+                 * source tree when generating the read-only filesystem. */
                 r = partition_populate_directory(p, &root, &tmp_root);
                 if (r < 0)
                         return r;
@@ -3485,7 +3485,7 @@ static int context_mkfs(Context *context) {
                         if (flock(encrypted_dev_fd, LOCK_UN) < 0)
                                 return log_error_errno(errno, "Failed to unlock LUKS device: %m");
 
-                /* Now, we can populate all the other filesystems that aren't squashfs. */
+                /* Now, we can populate all the other filesystems that aren't read-only. */
                 r = partition_populate_filesystem(p, fsdev);
                 if (r < 0) {
                         encrypted_dev_fd = safe_close(encrypted_dev_fd);
index 4c31045a867fa9313a4f5fbf1b6df197e3967142..c8e31aeb96e0f50bee9772d91278b43bdac283a2 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "id128-util.h"
 #include "mkfs-util.h"
+#include "mountpoint-util.h"
 #include "path-util.h"
 #include "process-util.h"
 #include "stdio-util.h"
@@ -102,6 +103,11 @@ int make_filesystem(
         assert(fstype);
         assert(label);
 
+        if (fstype_is_ro(fstype) && !root)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                       "Cannot generate read-only filesystem %s without a source tree.",
+                                       fstype);
+
         if (streq(fstype, "swap")) {
                 if (root)
                         return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
@@ -112,10 +118,6 @@ int make_filesystem(
                 if (r < 0)
                         return log_error_errno(r, "Failed to determine whether mkswap binary exists: %m");
         } else if (streq(fstype, "squashfs")) {
-                if (!root)
-                        return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
-                                               "Cannot generate squashfs filesystems without a source tree.");
-
                 r = find_executable("mksquashfs", &mkfs);
                 if (r == -ENOENT)
                         return log_error_errno(SYNTHETIC_ERRNO(EPROTONOSUPPORT), "mksquashfs binary not available.");
@@ -124,7 +126,7 @@ int make_filesystem(
         } else {
                 if (root)
                         return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
-                                               "Populating with source tree is only supported for squashfs");
+                                               "Populating with source tree is only supported for read-only filesystems");
                 r = mkfs_exists(fstype);
                 if (r < 0)
                         return log_error_errno(r, "Failed to determine whether mkfs binary for %s exists: %m", fstype);
index 7cff11634955efaa761be4bab09f57974d7cc58f..3125ef176d6babd4cfbdaac7753a9db79200625b 100644 (file)
@@ -5,6 +5,8 @@
 
 #include "sd-id128.h"
 
+#include "strv.h"
+
 int mkfs_exists(const char *fstype);
 
 int make_filesystem(const char *node, const char *fstype, const char *label, const char *root, sd_id128_t uuid, bool discard);