diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2024-11-22 21:47:40 +0100 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2024-11-23 09:31:36 +0100 |
commit | b76730f3fe0e824db001b38c8ea848302be786ee (patch) | |
tree | f0d5ed96fc694492421485cc3e953141f7fcab6d | |
parent | basic/linux: update kernel headers from v6.12 (diff) | |
download | systemd-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.c | 16 |
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 = { |