From 562990b5520ec8331dab25d139af8cb15d37e5a1 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 20 Jan 2022 13:16:39 +0100 Subject: [PATCH] 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. Signed-off-by: Jan Kara --- lib/loopdev.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/loopdev.c b/lib/loopdev.c index 27ab06c668..d49738fde1 100644 --- a/lib/loopdev.c +++ b/lib/loopdev.c @@ -1777,10 +1777,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)); @@ -1789,13 +1792,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.47.2