From 86f9b69a6a394bd752be01d997d47849de67006f Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 10 Sep 2022 00:33:43 +0900 Subject: [PATCH] blockdev-util: split out blockdev_reread_partition_table() No functional changes, just refactoring. --- src/shared/blockdev-util.c | 21 +++++++++++++++++++++ src/shared/blockdev-util.h | 1 + src/udev/udevd.c | 22 ++++++---------------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c index 87c19d70869..e5abb524d5e 100644 --- a/src/shared/blockdev-util.c +++ b/src/shared/blockdev-util.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "sd-device.h" @@ -649,3 +650,23 @@ int block_device_has_partitions(sd_device *dev) { return !!sd_device_enumerator_get_device_first(e); } + +int blockdev_reread_partition_table(sd_device *dev) { + _cleanup_close_ int fd = -1; + + assert(dev); + + /* Try to re-read the partition table. This only succeeds if none of the devices is busy. */ + + fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); + if (fd < 0) + return fd; + + if (flock(fd, LOCK_EX|LOCK_NB) < 0) + return -errno; + + if (ioctl(fd, BLKRRPART, 0) < 0) + return -errno; + + return 0; +} diff --git a/src/shared/blockdev-util.h b/src/shared/blockdev-util.h index 8df76ff30ee..550b2786d2a 100644 --- a/src/shared/blockdev-util.h +++ b/src/shared/blockdev-util.h @@ -39,3 +39,4 @@ int block_device_resize_partition(int fd, int nr, uint64_t start, uint64_t size) int partition_enumerator_new(sd_device *dev, sd_device_enumerator **ret); int block_device_remove_all_partitions(sd_device *dev, int fd); int block_device_has_partitions(sd_device *dev); +int blockdev_reread_partition_table(sd_device *dev); diff --git a/src/udev/udevd.c b/src/udev/udevd.c index c034e6a3cfe..c2a4a8a7bd6 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -1400,23 +1400,13 @@ static int synthesize_change(sd_device *dev) { streq_ptr(devtype, "disk") && !startswith(sysname, "dm-")) { _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL; - bool part_table_read = false; + bool part_table_read; sd_device *d; - int fd; - - /* Try to re-read the partition table. This only succeeds if none of the devices is - * busy. The kernel returns 0 if no partition table is found, and we will not get an - * event for the disk. */ - fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK); - if (fd >= 0) { - r = flock(fd, LOCK_EX|LOCK_NB); - if (r >= 0) - r = ioctl(fd, BLKRRPART, 0); - - close(fd); - if (r >= 0) - part_table_read = true; - } + + r = blockdev_reread_partition_table(dev); + if (r < 0) + log_device_debug_errno(dev, r, "Failed to re-read partition table, ignoring: %m"); + part_table_read = r >= 0; /* search for partitions */ r = partition_enumerator_new(dev, &e); -- 2.47.3