On Tue, Jun 19, 2007 at 12:58:06PM +0200, Matthias Koenig wrote:
> Hi,
>
> in addition to the race described recently
> (http://article.gmane.org/gmane.linux.utilities.util-linux-ng/241),
> there is also a race if you have concurring processes running
> mount -o loop. Patch below.
Good idea! We can also add the same logic to the losetup.c:main().
A few suggestions:
> --- util-linux-devel.orig/mount/lomount.c
> +++ util-linux-devel/mount/lomount.c
> @@ -341,8 +341,15 @@ set_loop(const char *device, const char
> }
>
> if (ioctl(fd, LOOP_SET_FD, ffd) < 0) {
> - perror("ioctl: LOOP_SET_FD");
> - return 1;
> + switch (errno) {
> + case EBUSY:
> + if (verbose)
> + perror("ioctl: LOOP_SET_FD");
close (ffd);
> + return 2;
> + default:
> + perror("ioctl: LOOP_SET_FD");
close (ffd);
> + return 1;
> + }
> }
> close (ffd);
> --- util-linux-devel.orig/mount/mount.c
> +++ util-linux-devel/mount/mount.c
> @@ -846,20 +846,34 @@ loop_check(const char **spec, const char
> + if (!*loopdev || !**loopdev)
> + *loopdev = find_unused_loop_device();
> + if (!*loopdev)
> + return EX_SYSERR; /* no more loop devices */
> if (verbose)
> - printf(_("mount: failed setting up loop device\n"));
> - return EX_FAIL;
> - }
> + printf(_("mount: going to use the loop device %s\n"), *loopdev);
> + offset = opt_offset ? strtoull(opt_offset, NULL, 0) : 0;
> + if (res = set_loop (*loopdev, *loopfile, offset,
> + opt_encryption, pfd, &loopro)) {
> + switch(res) {
> + case 2:
> + /* loop dev has been grabbed by some other process,
> + try again */
> + if (verbose)
> + printf("mount: stolen loop=%s ...trying again\n", *loopdev);
> + *loopdev = NULL;
^^^^^^^^^^^^^^
memory leak?
free(*loopdev);
*loopdev = NULL;
> + continue;
^^^^^^^^
Please, don't use the find_unused_loop_device() if user explicitly
define a device.
if (!opt_loop) {
if (verbose)
printf("mount: stolen loop=%s ...trying again\n", *loopdev);
continue;
}
return EX_FAIL;
Because:
mount foo.img /foo -o loop=/dev/loop0
Karel
--
Karel Zak <[EMAIL PROTECTED]>
-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html