diff options
author | Karel Zak | 2013-07-19 17:05:31 +0200 |
---|---|---|
committer | Karel Zak | 2013-07-19 17:15:44 +0200 |
commit | 01307ecf1b1ec8f72377100d67d757f946c9dace (patch) | |
tree | 48a88a898f604c8db72f2bc19cf13fb95af55a7f | |
parent | mount: update xfs docs (diff) | |
download | kernel-qcow2-util-linux-01307ecf1b1ec8f72377100d67d757f946c9dace.tar.gz kernel-qcow2-util-linux-01307ecf1b1ec8f72377100d67d757f946c9dace.tar.xz kernel-qcow2-util-linux-01307ecf1b1ec8f72377100d67d757f946c9dace.zip |
losetup: set errno for misaligned offsets
References: https://bugs.archlinux.org/task/36189
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | lib/loopdev.c | 26 | ||||
-rw-r--r-- | sys-utils/losetup.c | 20 |
2 files changed, 33 insertions, 13 deletions
diff --git a/lib/loopdev.c b/lib/loopdev.c index 001a9ad4b..9789feb88 100644 --- a/lib/loopdev.c +++ b/lib/loopdev.c @@ -1094,13 +1094,16 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd) if (!lc->info.lo_offset && !lc->info.lo_sizelimit) return 0; - if (fstat(file_fd, &st)) + if (fstat(file_fd, &st)) { + DBG(lc, loopdev_debug("failed to fstat backing file")); return -errno; - + } if (S_ISBLK(st.st_mode)) { if (blkdev_get_size(file_fd, - (unsigned long long *) &expected_size)) + (unsigned long long *) &expected_size)) { + DBG(lc, loopdev_debug("failed to determine device size")); return -errno; + } } else expected_size = st.st_size; @@ -1116,11 +1119,15 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd) expected_size = lc->info.lo_sizelimit; dev_fd = loopcxt_get_fd(lc); - if (dev_fd < 0) + if (dev_fd < 0) { + DBG(lc, loopdev_debug("failed to get loop FD")); return -errno; + } - if (blkdev_get_size(dev_fd, (unsigned long long *) &size)) + if (blkdev_get_size(dev_fd, (unsigned long long *) &size)) { + DBG(lc, loopdev_debug("failed to determine loopdev size")); return -errno; + } if (expected_size != size) { DBG(lc, loopdev_debug("warning: loopdev and expected " @@ -1137,8 +1144,13 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd) if (blkdev_get_size(dev_fd, (unsigned long long *) &size)) return -errno; - if (expected_size != size) - return -ERANGE; + if (expected_size != size) { + errno = ERANGE; + DBG(lc, loopdev_debug("failed to set loopdev size, " + "size: %ju, expected: %ju", + size, expected_size)); + return -errno; + } } return 0; diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c index 5dd3c6c3e..1bd1f41a4 100644 --- a/sys-utils/losetup.c +++ b/sys-utils/losetup.c @@ -620,6 +620,8 @@ int main(int argc, char **argv) int hasdev = loopcxt_has_device(&lc); do { + const char *errpre; + /* Note that loopcxt_{find_unused,set_device}() resets * loopcxt struct. */ @@ -641,12 +643,18 @@ int main(int argc, char **argv) res = loopcxt_setup_device(&lc); if (res == 0) break; /* success */ - if (errno != EBUSY) { - warn(_("%s: failed to set up loop device"), - hasdev && loopcxt_get_fd(&lc) < 0 ? - loopcxt_get_device(&lc) : file); - break; - } + if (errno == EBUSY) + continue; + + /* errors */ + errpre = hasdev && loopcxt_get_fd(&lc) < 0 ? + loopcxt_get_device(&lc) : file; + if (errno == ERANGE && offset && offset % 512) + warnx(_("%s: failed to set up loop device, " + "offset is not 512-byte aligned."), errpre); + else + warn(_("%s: failed to set up loop device"), errpre); + break; } while (hasdev == 0); if (res == 0) { |