aboutsummaryrefslogtreecommitdiffstats
path: root/libmount/src/hook_loopdev.c
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2024-05-22 11:36:25 +0200
committerKarel Zak <kzak@redhat.com>2024-05-22 11:36:25 +0200
commit9f94d121228b924e7dcc81f30efb2de983ea3359 (patch)
treedb68790d7807afdb3201eb97e96ab172a4567bf6 /libmount/src/hook_loopdev.c
parent41476dd406114f231bea5bc1aa6297cfbb5474ba (diff)
downloadutil-linux-9f94d121228b924e7dcc81f30efb2de983ea3359.tar.gz
libmount: (loop) detect and report lost loop nodes
Fixed: https://github.com/util-linux/util-linux/issues/2605 Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src/hook_loopdev.c')
-rw-r--r--libmount/src/hook_loopdev.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/libmount/src/hook_loopdev.c b/libmount/src/hook_loopdev.c
index 597b9339ac..c01d536ce1 100644
--- a/libmount/src/hook_loopdev.c
+++ b/libmount/src/hook_loopdev.c
@@ -277,6 +277,14 @@ static int setup_loopdev(struct libmnt_context *cxt,
goto done_no_deinit;
if (mnt_opt_has_value(loopopt)) {
rc = loopcxt_set_device(&lc, mnt_opt_get_value(loopopt));
+ if (rc == 0 && loopcxt_is_lost(&lc)) {
+ DBG(LOOP, ul_debugobj(cxt, "node lost"));
+
+ dev_t devno = loopcxt_get_devno(&lc);
+ mnt_context_sprintf_errmsg(cxt, _("device node %s (%u:%u) is lost"),
+ loopcxt_get_device(&lc), major(devno), minor(devno));
+ rc = -EINVAL;
+ }
if (rc == 0)
loopdev = loopcxt_get_device(&lc);
}