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 /lib/loopdev.c | |
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>
Diffstat (limited to 'lib/loopdev.c')
-rw-r--r-- | lib/loopdev.c | 26 |
1 files changed, 19 insertions, 7 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; |