summaryrefslogtreecommitdiff
path: root/src/gpt-auto-generator
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-11-28 11:05:42 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-11-28 19:43:43 +0100
commit9fe6f5cc1668e97be58847a3596890273a402c8f (patch)
tree9f7d53f36c7b28169a5849729058efc24f46a552 /src/gpt-auto-generator
parent6da498c28f2598bea4d651756485f57d54e379f4 (diff)
downloadsystemd-9fe6f5cc1668e97be58847a3596890273a402c8f.tar.gz
gpt-auto-generator: move functions around
open_parent_devno() which is a helper is moved out of the main "business logic" block of various add_*() functions. And parse_proc_cmdline_item() is moved to the end, near to run() where it is used. No functional change.
Diffstat (limited to 'src/gpt-auto-generator')
-rw-r--r--src/gpt-auto-generator/gpt-auto-generator.c283
1 files changed, 141 insertions, 142 deletions
diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c
index de51801d23..1dd98eeb1f 100644
--- a/src/gpt-auto-generator/gpt-auto-generator.c
+++ b/src/gpt-auto-generator/gpt-auto-generator.c
@@ -39,6 +39,69 @@ static bool arg_enabled = true;
static bool arg_root_enabled = true;
static int arg_root_rw = -1;
+static int open_parent_devno(dev_t devnum, int *ret) {
+ _cleanup_(sd_device_unrefp) sd_device *d = NULL;
+ const char *name, *devtype, *node;
+ sd_device *parent;
+ dev_t pn;
+ int fd, r;
+
+ assert(ret);
+
+ r = sd_device_new_from_devnum(&d, 'b', devnum);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to open device: %m");
+
+ if (sd_device_get_devname(d, &name) < 0) {
+ r = sd_device_get_syspath(d, &name);
+ if (r < 0) {
+ log_device_debug_errno(d, r, "Device %u:%u does not have a name, ignoring: %m", major(devnum), minor(devnum));
+ return 0;
+ }
+ }
+
+ r = sd_device_get_parent(d, &parent);
+ if (r < 0) {
+ log_device_debug_errno(d, r, "Not a partitioned device, ignoring: %m");
+ return 0;
+ }
+
+ /* Does it have a devtype? */
+ r = sd_device_get_devtype(parent, &devtype);
+ if (r < 0) {
+ log_device_debug_errno(parent, r, "Parent doesn't have a device type, ignoring: %m");
+ return 0;
+ }
+
+ /* Is this a disk or a partition? We only care for disks... */
+ if (!streq(devtype, "disk")) {
+ log_device_debug(parent, "Parent isn't a raw disk, ignoring.");
+ return 0;
+ }
+
+ /* Does it have a device node? */
+ r = sd_device_get_devname(parent, &node);
+ if (r < 0) {
+ log_device_debug_errno(parent, r, "Parent device does not have device node, ignoring: %m");
+ return 0;
+ }
+
+ log_device_debug(d, "Root device %s.", node);
+
+ r = sd_device_get_devnum(parent, &pn);
+ if (r < 0) {
+ log_device_debug_errno(parent, r, "Parent device is not a proper block device, ignoring: %m");
+ return 0;
+ }
+
+ fd = open(node, O_RDONLY|O_CLOEXEC|O_NOCTTY);
+ if (fd < 0)
+ return log_error_errno(errno, "Failed to open %s: %m", node);
+
+ *ret = fd;
+ return 1;
+}
+
static int add_cryptsetup(const char *id, const char *what, bool rw, bool require, char **device) {
_cleanup_free_ char *e = NULL, *n = NULL, *d = NULL, *id_escaped = NULL, *what_escaped = NULL;
_cleanup_fclose_ FILE *f = NULL;
@@ -530,67 +593,61 @@ static int add_root_rw(DissectedPartition *p) {
return 0;
}
-static int open_parent_devno(dev_t devnum, int *ret) {
- _cleanup_(sd_device_unrefp) sd_device *d = NULL;
- const char *name, *devtype, *node;
- sd_device *parent;
- dev_t pn;
- int fd, r;
-
- assert(ret);
+#if ENABLE_EFI
+static int add_root_cryptsetup(void) {
- r = sd_device_new_from_devnum(&d, 'b', devnum);
- if (r < 0)
- return log_debug_errno(r, "Failed to open device: %m");
+ /* If a device /dev/gpt-auto-root-luks appears, then make it pull in systemd-cryptsetup-root.service, which
+ * sets it up, and causes /dev/gpt-auto-root to appear which is all we are looking for. */
- if (sd_device_get_devname(d, &name) < 0) {
- r = sd_device_get_syspath(d, &name);
- if (r < 0) {
- log_device_debug_errno(d, r, "Device %u:%u does not have a name, ignoring: %m", major(devnum), minor(devnum));
- return 0;
- }
- }
+ return add_cryptsetup("root", "/dev/gpt-auto-root-luks", true, false, NULL);
+}
+#endif
- r = sd_device_get_parent(d, &parent);
- if (r < 0) {
- log_device_debug_errno(d, r, "Not a partitioned device, ignoring: %m");
- return 0;
- }
+static int add_root_mount(void) {
+#if ENABLE_EFI
+ int r;
- /* Does it have a devtype? */
- r = sd_device_get_devtype(parent, &devtype);
- if (r < 0) {
- log_device_debug_errno(parent, r, "Parent doesn't have a device type, ignoring: %m");
+ if (!is_efi_boot()) {
+ log_debug("Not a EFI boot, not creating root mount.");
return 0;
}
- /* Is this a disk or a partition? We only care for disks... */
- if (!streq(devtype, "disk")) {
- log_device_debug(parent, "Parent isn't a raw disk, ignoring.");
+ r = efi_loader_get_device_part_uuid(NULL);
+ if (r == -ENOENT) {
+ log_debug("EFI loader partition unknown, exiting.");
return 0;
- }
+ } else if (r < 0)
+ return log_error_errno(r, "Failed to read ESP partition UUID: %m");
- /* Does it have a device node? */
- r = sd_device_get_devname(parent, &node);
- if (r < 0) {
- log_device_debug_errno(parent, r, "Parent device does not have device node, ignoring: %m");
- return 0;
- }
+ /* OK, we have an ESP partition, this is fantastic, so let's
+ * wait for a root device to show up. A udev rule will create
+ * the link for us under the right name. */
- log_device_debug(d, "Root device %s.", node);
+ if (in_initrd()) {
+ r = generator_write_initrd_root_device_deps(arg_dest, "/dev/gpt-auto-root");
+ if (r < 0)
+ return 0;
- r = sd_device_get_devnum(parent, &pn);
- if (r < 0) {
- log_device_debug_errno(parent, r, "Parent device is not a proper block device, ignoring: %m");
- return 0;
+ r = add_root_cryptsetup();
+ if (r < 0)
+ return r;
}
- fd = open(node, O_RDONLY|O_CLOEXEC|O_NOCTTY);
- if (fd < 0)
- return log_error_errno(errno, "Failed to open %s: %m", node);
+ /* Note that we do not need to enable systemd-remount-fs.service here. If
+ * /etc/fstab exists, systemd-fstab-generator will pull it in for us. */
- *ret = fd;
- return 1;
+ return add_mount(
+ "root",
+ "/dev/gpt-auto-root",
+ in_initrd() ? "/sysroot" : "/",
+ NULL,
+ arg_root_rw > 0,
+ NULL,
+ "Root Partition",
+ in_initrd() ? SPECIAL_INITRD_ROOT_FS_TARGET : SPECIAL_LOCAL_FS_TARGET);
+#else
+ return 0;
+#endif
}
static int enumerate_partitions(dev_t devnum) {
@@ -649,6 +706,43 @@ static int enumerate_partitions(dev_t devnum) {
return r;
}
+static int add_mounts(void) {
+ dev_t devno;
+ int r;
+
+ r = get_block_device_harder("/", &devno);
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine block device of root file system: %m");
+ if (r == 0) {
+ r = get_block_device_harder("/usr", &devno);
+ if (r < 0)
+ return log_error_errno(r, "Failed to determine block device of /usr file system: %m");
+ if (r == 0) {
+ _cleanup_free_ char *p = NULL;
+ mode_t m;
+
+ /* If the root mount has been replaced by some form of volatile file system (overlayfs), the
+ * original root block device node is symlinked in /run/systemd/volatile-root. Let's read that
+ * here. */
+ r = readlink_malloc("/run/systemd/volatile-root", &p);
+ if (r == -ENOENT) {
+ log_debug("Neither root nor /usr file system are on a (single) block device.");
+ return 0;
+ }
+ if (r < 0)
+ return log_error_errno(r, "Failed to read symlink /run/systemd/volatile-root: %m");
+
+ r = device_path_parse_major_minor(p, &m, &devno);
+ if (r < 0)
+ return log_error_errno(r, "Failed to parse major/minor device node: %m");
+ if (!S_ISBLK(m))
+ return log_error_errno(SYNTHETIC_ERRNO(ENOTBLK), "Volatile root device is of wrong type.");
+ }
+ }
+
+ return enumerate_partitions(devno);
+}
+
static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
int r;
@@ -690,101 +784,6 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
return 0;
}
-#if ENABLE_EFI
-static int add_root_cryptsetup(void) {
-
- /* If a device /dev/gpt-auto-root-luks appears, then make it pull in systemd-cryptsetup-root.service, which
- * sets it up, and causes /dev/gpt-auto-root to appear which is all we are looking for. */
-
- return add_cryptsetup("root", "/dev/gpt-auto-root-luks", true, false, NULL);
-}
-#endif
-
-static int add_root_mount(void) {
-
-#if ENABLE_EFI
- int r;
-
- if (!is_efi_boot()) {
- log_debug("Not a EFI boot, not creating root mount.");
- return 0;
- }
-
- r = efi_loader_get_device_part_uuid(NULL);
- if (r == -ENOENT) {
- log_debug("EFI loader partition unknown, exiting.");
- return 0;
- } else if (r < 0)
- return log_error_errno(r, "Failed to read ESP partition UUID: %m");
-
- /* OK, we have an ESP partition, this is fantastic, so let's
- * wait for a root device to show up. A udev rule will create
- * the link for us under the right name. */
-
- if (in_initrd()) {
- r = generator_write_initrd_root_device_deps(arg_dest, "/dev/gpt-auto-root");
- if (r < 0)
- return 0;
-
- r = add_root_cryptsetup();
- if (r < 0)
- return r;
- }
-
- /* Note that we do not need to enable systemd-remount-fs.service here. If
- * /etc/fstab exists, systemd-fstab-generator will pull it in for us. */
-
- return add_mount(
- "root",
- "/dev/gpt-auto-root",
- in_initrd() ? "/sysroot" : "/",
- NULL,
- arg_root_rw > 0,
- NULL,
- "Root Partition",
- in_initrd() ? SPECIAL_INITRD_ROOT_FS_TARGET : SPECIAL_LOCAL_FS_TARGET);
-#else
- return 0;
-#endif
-}
-
-static int add_mounts(void) {
- dev_t devno;
- int r;
-
- r = get_block_device_harder("/", &devno);
- if (r < 0)
- return log_error_errno(r, "Failed to determine block device of root file system: %m");
- if (r == 0) {
- r = get_block_device_harder("/usr", &devno);
- if (r < 0)
- return log_error_errno(r, "Failed to determine block device of /usr file system: %m");
- if (r == 0) {
- _cleanup_free_ char *p = NULL;
- mode_t m;
-
- /* If the root mount has been replaced by some form of volatile file system (overlayfs), the
- * original root block device node is symlinked in /run/systemd/volatile-root. Let's read that
- * here. */
- r = readlink_malloc("/run/systemd/volatile-root", &p);
- if (r == -ENOENT) {
- log_debug("Neither root nor /usr file system are on a (single) block device.");
- return 0;
- }
- if (r < 0)
- return log_error_errno(r, "Failed to read symlink /run/systemd/volatile-root: %m");
-
- r = device_path_parse_major_minor(p, &m, &devno);
- if (r < 0)
- return log_error_errno(r, "Failed to parse major/minor device node: %m");
- if (!S_ISBLK(m))
- return log_error_errno(SYNTHETIC_ERRNO(ENOTBLK), "Volatile root device is of wrong type.");
- }
- }
-
- return enumerate_partitions(devno);
-}
-
static int run(const char *dest, const char *dest_early, const char *dest_late) {
int r, k;