summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2024-11-22 21:47:40 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2024-11-23 09:31:36 +0100
commitb76730f3fe0e824db001b38c8ea848302be786ee (patch)
treef0d5ed96fc694492421485cc3e953141f7fcab6d
parentbasic/linux: update kernel headers from v6.12 (diff)
downloadsystemd-b76730f3fe0e824db001b38c8ea848302be786ee.tar.xz
systemd-b76730f3fe0e824db001b38c8ea848302be786ee.zip
shutdown: close DM block device before issuing DM_DEV_REMOVE ioctl
Otherwise, the ioctl() may fail with EBUSY. Follow-up for b4b66b26620bfaf5818c95d5cffafd85207694e7. Hopefully fixes #35243.
-rw-r--r--src/shutdown/detach-dm.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/shutdown/detach-dm.c b/src/shutdown/detach-dm.c
index bddd748d63..88e6a47a27 100644
--- a/src/shutdown/detach-dm.c
+++ b/src/shutdown/detach-dm.c
@@ -98,15 +98,17 @@ static int delete_dm(DeviceMapper *m) {
assert(major(m->devnum) != 0);
assert(m->path);
- fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
+ fd = open(m->path, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (fd < 0)
- return -errno;
-
- _cleanup_close_ int block_fd = open(m->path, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
- if (block_fd < 0)
log_debug_errno(errno, "Failed to open DM block device %s for syncing, ignoring: %m", m->path);
- else
- (void) sync_with_progress(block_fd);
+ else {
+ (void) sync_with_progress(fd);
+ fd = safe_close(fd);
+ }
+
+ fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
+ if (fd < 0)
+ return log_debug_errno(errno, "Failed to open /dev/mapper/control: %m");
return RET_NERRNO(ioctl(fd, DM_DEV_REMOVE, &(struct dm_ioctl) {
.version = {