[git commit] mount: fix incorrect "success" exitcode if loop device setup fails

Denys Vlasenko vda.linux at googlemail.com
Wed Dec 9 19:56:43 UTC 2020


commit: https://git.busybox.net/busybox/commit/?id=56ee5765074b2f2389066f3234a4da21501d3eaa
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

When mounting, in parallel, multiple loop devices (squashfs for the
submitter's case), the following behavior can be observed:

stat64(/path/to/image, {st_mode=S_IFREG|0644, st_size=4096, ...}) = 0
openat(AT_FDCWD, /path/to/image, O_RDWR|O_LARGEFILE) = 3
openat(AT_FDCWD, /dev/loop-control, O_RDWR|O_LARGEFILE|O_CLOEXEC) = 4
ioctl(4, LOOP_CTL_GET_FREE)             = 12
close(4)                                = 0
openat(AT_FDCWD, /dev/loop12, O_RDWR|O_LARGEFILE) = 4
ioctl(4, LOOP_GET_STATUS64, {lo_offset=0, lo_number=12, lo_flags=LO_FLAGS_AUTOCLEAR, lo_file_name=/path/to/image, ...}) = 0
close(4)                                = 0
close(3)                                = 0
write(2, "mount: can't setup loop device\n", 31mount: can't setup loop device
) = 31
exit_group(0)                           = ?
+++ exited with 0 +++

The ioctl LOOP_CTL_GET_FREE has resulted in the same result for
a competing mount process. The subsequent ioctl LOOP_GET_STATUS64
fails, having succeeded for the competing mount process.

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 util-linux/mount.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/util-linux/mount.c b/util-linux/mount.c
index 2eadee88b..0814a5256 100644
--- a/util-linux/mount.c
+++ b/util-linux/mount.c
@@ -2078,8 +2078,8 @@ static int singlemount(struct mntent *mp, int ignore_busy)
 	 && (!mp->mnt_type || is_prefixed_with(mp->mnt_type, "nfs"))
 	) {
 		char *colon = strchr(mp->mnt_fsname, ':');
-		if (colon /* looks like "hostname:..." */
-		 && strchrnul(mp->mnt_fsname, '/') > colon /* "hostname:" has no slashes */
+		if (colon // looks like "hostname:..."
+		 && strchrnul(mp->mnt_fsname, '/') > colon // "hostname:" has no slashes
 		) {
 			if (!mp->mnt_type)
 				mp->mnt_type = (char*)"nfs";
@@ -2125,7 +2125,7 @@ static int singlemount(struct mntent *mp, int ignore_busy)
 					bb_simple_error_msg(bb_msg_perm_denied_are_you_root);
 				else
 					bb_simple_perror_msg("can't setup loop device");
-				return errno;
+				return loopfd; // was "return errno", but it can be 0 here
 			}
 
 		// Autodetect bind mounts


More information about the busybox-cvs mailing list