0f303590e7
Resolves: #2094216 #2117203
57 lines
1.7 KiB
Diff
57 lines
1.7 KiB
Diff
From ea556ef1d9e26802842577597e3736528f54ee0f Mon Sep 17 00:00:00 2001
|
|
From: Jan Kara <jack@suse.cz>
|
|
Date: Thu, 20 Jan 2022 13:16:39 +0100
|
|
Subject: loopdev: Do not treat errors when detecting overlap as fatal
|
|
|
|
When looking for overlapping loop device we can fail getting some loop
|
|
device properties when we race with device autoclear. Just squelsh these
|
|
errors and try next loop device.
|
|
|
|
Addresses: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=2117203
|
|
Signed-off-by: Jan Kara <jack@suse.cz>
|
|
---
|
|
lib/loopdev.c | 15 +++++++++------
|
|
1 file changed, 9 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/lib/loopdev.c b/lib/loopdev.c
|
|
index db3aab29f..511f8a0d6 100644
|
|
--- a/lib/loopdev.c
|
|
+++ b/lib/loopdev.c
|
|
@@ -1773,10 +1773,13 @@ int loopcxt_find_overlap(struct loopdev_cxt *lc, const char *filename,
|
|
|
|
rc = loopcxt_is_used(lc, hasst ? &st : NULL,
|
|
filename, offset, sizelimit, 0);
|
|
- if (!rc)
|
|
- continue; /* unused */
|
|
- if (rc < 0)
|
|
- break; /* error */
|
|
+ /*
|
|
+ * Either the loopdev is unused or we've got an error which can
|
|
+ * happen when we are racing with device autoclear. Just ignore
|
|
+ * this loopdev...
|
|
+ */
|
|
+ if (rc <= 0)
|
|
+ continue;
|
|
|
|
DBG(CXT, ul_debugobj(lc, "found %s backed by %s",
|
|
loopcxt_get_device(lc), filename));
|
|
@@ -1785,13 +1788,13 @@ int loopcxt_find_overlap(struct loopdev_cxt *lc, const char *filename,
|
|
if (rc) {
|
|
DBG(CXT, ul_debugobj(lc, "failed to get offset for device %s",
|
|
loopcxt_get_device(lc)));
|
|
- break;
|
|
+ continue;
|
|
}
|
|
rc = loopcxt_get_sizelimit(lc, &lc_sizelimit);
|
|
if (rc) {
|
|
DBG(CXT, ul_debugobj(lc, "failed to get sizelimit for device %s",
|
|
loopcxt_get_device(lc)));
|
|
- break;
|
|
+ continue;
|
|
}
|
|
|
|
/* full match */
|
|
--
|
|
2.37.1
|
|
|