mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
blockdev-util: split out blockdev_reread_partition_table()
No functional changes, just refactoring.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user