From: Jan Kara Date: Thu, 20 Jan 2022 12:16:39 +0000 (+0100) Subject: loopdev: Do not treat errors when detecting overlap as fatal X-Git-Tag: v2.38-rc1~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=562990b5520ec8331dab25d139af8cb15d37e5a1;p=thirdparty%2Futil-linux.git 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 --- 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 */