From: Lennart Poettering Date: Mon, 1 Jul 2024 09:44:26 +0000 (+0200) Subject: blockdev-util: add partscan check function that takes an sd_device* X-Git-Tag: v257-rc1~1007^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bff5d2fd5af2fbf79f0f692ccc30ea47fd141188;p=thirdparty%2Fsystemd.git blockdev-util: add partscan check function that takes an sd_device* --- diff --git a/src/partition/repart.c b/src/partition/repart.c index a3a6605ae51..ab41769348d 100644 --- a/src/partition/repart.c +++ b/src/partition/repart.c @@ -5903,7 +5903,7 @@ static int context_write_partition_table(Context *context) { if (r < 0) return log_error_errno(r, "Failed to write partition table: %m"); - capable = blockdev_partscan_enabled(fdisk_get_devfd(context->fdisk_context)); + capable = blockdev_partscan_enabled_fd(fdisk_get_devfd(context->fdisk_context)); if (capable == -ENOTBLK) log_debug("Not telling kernel to reread partition table, since we are not operating on a block device."); else if (capable < 0) diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c index 2055550336f..53d60bd0dd7 100644 --- a/src/shared/blockdev-util.c +++ b/src/shared/blockdev-util.c @@ -356,8 +356,7 @@ int lock_whole_block_device(dev_t devt, int operation) { return TAKE_FD(lock_fd); } -int blockdev_partscan_enabled(int fd) { - _cleanup_(sd_device_unrefp) sd_device *dev = NULL; +int blockdev_partscan_enabled(sd_device *dev) { unsigned capability; int r, ext_range; @@ -408,11 +407,7 @@ int blockdev_partscan_enabled(int fd) { * 4) check 'ext_range' sysfs attribute, and if '1' we can conclude partition scanning is disabled, * 5) otherwise check 'capability' sysfs attribute for ancient version. */ - assert(fd >= 0); - - r = block_device_new_from_fd(fd, 0, &dev); - if (r < 0) - return r; + assert(dev); /* For v6.10 or newer. */ r = device_get_sysattr_bool(dev, "partscan"); @@ -458,6 +453,19 @@ int blockdev_partscan_enabled(int fd) { return true; } +int blockdev_partscan_enabled_fd(int fd) { + _cleanup_(sd_device_unrefp) sd_device *dev = NULL; + int r; + + assert(fd >= 0); + + r = block_device_new_from_fd(fd, 0, &dev); + if (r < 0) + return r; + + return blockdev_partscan_enabled(dev); +} + static int blockdev_is_encrypted(const char *sysfs_path, unsigned depth_left) { _cleanup_free_ char *p = NULL, *uuids = NULL; _cleanup_closedir_ DIR *d = NULL; diff --git a/src/shared/blockdev-util.h b/src/shared/blockdev-util.h index 28aede289a0..e8e9d37ef9b 100644 --- a/src/shared/blockdev-util.h +++ b/src/shared/blockdev-util.h @@ -40,7 +40,8 @@ int get_block_device_harder(const char *path, dev_t *dev); int lock_whole_block_device(dev_t devt, int operation); -int blockdev_partscan_enabled(int fd); +int blockdev_partscan_enabled(sd_device *d); +int blockdev_partscan_enabled_fd(int fd); int fd_is_encrypted(int fd); int path_is_encrypted(const char *path); diff --git a/src/shared/dissect-image.c b/src/shared/dissect-image.c index 1a3ed0cf7f4..28c2d7dbc0a 100644 --- a/src/shared/dissect-image.c +++ b/src/shared/dissect-image.c @@ -893,7 +893,7 @@ static int dissect_image( if (FLAGS_SET(flags, DISSECT_IMAGE_ADD_PARTITION_DEVICES)) { /* Safety check: refuse block devices that carry a partition table but for which the kernel doesn't * do partition scanning. */ - r = blockdev_partscan_enabled(fd); + r = blockdev_partscan_enabled_fd(fd); if (r < 0) return r; if (r == 0) diff --git a/src/shared/loop-util.c b/src/shared/loop-util.c index e295eb2a21c..d707d466abd 100644 --- a/src/shared/loop-util.c +++ b/src/shared/loop-util.c @@ -149,7 +149,7 @@ static int loop_configure_verify(int fd, const struct loop_config *c) { * into the block device. Let's hence verify if things work correctly here * before returning. */ - r = blockdev_partscan_enabled(fd); + r = blockdev_partscan_enabled_fd(fd); if (r < 0) return r; if (r == 0) { diff --git a/src/test/test-blockdev-util.c b/src/test/test-blockdev-util.c index 19626e0b771..6ede05852d9 100644 --- a/src/test/test-blockdev-util.c +++ b/src/test/test-blockdev-util.c @@ -65,7 +65,7 @@ TEST(partscan_enabled) { continue; } - r = blockdev_partscan_enabled(fd); + r = blockdev_partscan_enabled_fd(fd); if (r < 0) { log_warning_errno(r, "Failed to determine if block device '%s' has partition scanning enabled, skipping: %m", name); continue;