diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-11-28 11:05:42 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-11-28 19:43:43 +0100 |
commit | 9fe6f5cc1668e97be58847a3596890273a402c8f (patch) | |
tree | 9f7d53f36c7b28169a5849729058efc24f46a552 /src/gpt-auto-generator | |
parent | 6da498c28f2598bea4d651756485f57d54e379f4 (diff) | |
download | systemd-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.c | 283 |
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; |