blockdev-util: split out blockdev_reread_partition_table()

No functional changes, just refactoring.
This commit is contained in:
Yu Watanabe
2022-09-10 00:33:43 +09:00
parent 9409174ee7
commit 86f9b69a6a
3 changed files with 27 additions and 15 deletions

View File

@@ -3,6 +3,7 @@
#include <linux/blkpg.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <unistd.h>
#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;
}

View File

@@ -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);

View File

@@ -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);