summaryrefslogtreecommitdiff
path: root/src/dissect
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-11-30 13:00:42 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-12-02 02:52:06 +0900
commit040d34390301977f90ee2655300be15f8fa7a2e8 (patch)
tree70d001e31be84311470f3f63db94405d799e89c2 /src/dissect
parentb62a45d89b7af949a2f3adf1e9cb36292c3d394d (diff)
downloadsystemd-040d34390301977f90ee2655300be15f8fa7a2e8.tar.gz
dissect: use sd-device to find and open loopback block device
Diffstat (limited to 'src/dissect')
-rw-r--r--src/dissect/dissect.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c
index 3cf250e8ec..395294ebb4 100644
--- a/src/dissect/dissect.c
+++ b/src/dissect/dissect.c
@@ -1176,9 +1176,9 @@ static int action_list_or_mtree_or_copy(DissectedImage *m, LoopDevice *d) {
static int action_umount(const char *path) {
_cleanup_close_ int fd = -1;
- _cleanup_free_ char *canonical = NULL, *devname = NULL;
+ _cleanup_free_ char *canonical = NULL;
_cleanup_(loop_device_unrefp) LoopDevice *d = NULL;
- dev_t devno;
+ _cleanup_(sd_device_unrefp) sd_device *dev = NULL;
int r;
fd = chase_symlinks_and_open(path, NULL, 0, O_DIRECTORY, &canonical);
@@ -1193,18 +1193,13 @@ static int action_umount(const char *path) {
if (r < 0)
return log_error_errno(r, "Failed to determine whether '%s' is a mount point: %m", canonical);
- r = fd_get_whole_disk(fd, /*backing=*/ true, &devno);
+ r = block_device_new_from_fd(fd, BLOCK_DEVICE_LOOKUP_WHOLE_DISK | BLOCK_DEVICE_LOOKUP_BACKING, &dev);
if (r < 0)
return log_error_errno(r, "Failed to find backing block device for '%s': %m", canonical);
- r = devname_from_devnum(S_IFBLK, devno, &devname);
+ r = loop_device_open(dev, 0, LOCK_EX, &d);
if (r < 0)
- return log_error_errno(r, "Failed to get devname of block device " DEVNUM_FORMAT_STR ": %m",
- DEVNUM_FORMAT_VAL(devno));
-
- r = loop_device_open_from_path(devname, 0, LOCK_EX, &d);
- if (r < 0)
- return log_error_errno(r, "Failed to open loop device '%s': %m", devname);
+ return log_device_error_errno(dev, r, "Failed to open loopback block device: %m");
/* We've locked the loop device, now we're ready to unmount. To allow the unmount to succeed, we have
* to close the O_PATH fd we opened earlier. */