summaryrefslogtreecommitdiffstats
path: root/mount/lomount.c
diff options
context:
space:
mode:
authorMatthias Koenig2007-06-20 15:17:45 +0200
committerKarel Zak2007-06-27 14:55:00 +0200
commit95ba33f7a4ed199bc749264359a973a394ea09c4 (patch)
tree46712a4396e39dcdfdbf5d60ba99a0f5944b13d3 /mount/lomount.c
parentsfdisk: setting default geometry values (diff)
downloadkernel-qcow2-util-linux-95ba33f7a4ed199bc749264359a973a394ea09c4.tar.gz
kernel-qcow2-util-linux-95ba33f7a4ed199bc749264359a973a394ea09c4.tar.xz
kernel-qcow2-util-linux-95ba33f7a4ed199bc749264359a973a394ea09c4.zip
mount: loop device race condition
Fix race in mount -o loop Retry acquiring a loop device if the setup failed with EBUSY. Signed-Off-By: Matthias Koenig <mkoenig@suse.de> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'mount/lomount.c')
-rw-r--r--mount/lomount.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/mount/lomount.c b/mount/lomount.c
index 4774a8539..a5def9804 100644
--- a/mount/lomount.c
+++ b/mount/lomount.c
@@ -341,8 +341,16 @@ set_loop(const char *device, const char *file, unsigned long long offset,
}
if (ioctl(fd, LOOP_SET_FD, ffd) < 0) {
- perror("ioctl: LOOP_SET_FD");
- return 1;
+ close(fd);
+ close(ffd);
+ if (errno == EBUSY) {
+ if (verbose)
+ printf(_("ioctl LOOP_SET_FD failed: %s\n"), strerror(errno));
+ return 2;
+ } else {
+ perror("ioctl: LOOP_SET_FD");
+ return 1;
+ }
}
close (ffd);