]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
losetup: don't require 512-byte aligned offsets
authorKarel Zak <kzak@redhat.com>
Tue, 1 Oct 2013 13:52:11 +0000 (15:52 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 1 Oct 2013 13:52:11 +0000 (15:52 +0200)
Kernel aligns the device size, but the offset where the device starts
is not required to be aligned.

 # losetup --offset 32 -f file.img

is just fine, the final size of the look device will be (in sectors)

  (backing_file_size - offset) >> 9

so we have to do the same in userspace when we check for successful
set capacity ioctl.

Signed-off-by: Karel Zak <kzak@redhat.com>
lib/loopdev.c
sys-utils/losetup.c

index 27276bfab5e81e480cd6512efe85cb47f962422c..a636a89c8d36a4f1a80e46f44f828cb2d2e00be8 100644 (file)
@@ -1129,6 +1129,12 @@ static int loopcxt_check_size(struct loopdev_cxt *lc, int file_fd)
                return -errno;
        }
 
+       /* It's block device, so, align to 512-byte sectors */
+       if (expected_size % 512) {
+               DBG(lc, loopdev_debug("expected size misaligned to 512-byte sectors"));
+               expected_size = (expected_size >> 9) << 9;
+       }
+
        if (expected_size != size) {
                DBG(lc, loopdev_debug("warning: loopdev and expected "
                                      "size dismatch (%ju/%ju)",
index f51411570a3aea04ac486a6326d182a1c265e960..9169f88644ca794b1e9c628f42733f3a6ee5b58c 100644 (file)
@@ -673,11 +673,7 @@ int main(int argc, char **argv)
                        /* 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);
+                       warn(_("%s: failed to set up loop device"), errpre);
                        break;
                } while (hasdev == 0);