]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
loopdev: Do not treat errors when detecting overlap as fatal
authorJan Kara <jack@suse.cz>
Thu, 20 Jan 2022 12:16:39 +0000 (13:16 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 25 Jan 2022 16:15:58 +0000 (17:15 +0100)
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@suse.cz>
lib/loopdev.c

index 27ab06c668487c9cd879d34eea9977a88574aa80..d49738fde122220e0ab2c2e941ce712bfdb0ec81 100644 (file)
@@ -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 */