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 <jack@xxxxxxx> --- lib/loopdev.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/loopdev.c b/lib/loopdev.c index 27ab06c66848..d49738fde122 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.31.1