From 422f0e9f206a145c59a71333dad20d38cbbfc0c4 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 22 Jan 2019 11:50:20 +0100 Subject: losetup: properly use --sector-size when create a new device The --partscan functionality depends on sector size. Make sure sector size is set before we force kernel to scan the device for partitions. For example: losetup -f loopfile --sector-size 4KiB --partscan --show where 'loopfile' contains GPT with 4096 sectors. Reported-by: Jeffrey Ferreira Signed-off-by: Karel Zak --- sys-utils/losetup.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'sys-utils/losetup.c') diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c index 06feb8377..6fc5d51cd 100644 --- a/sys-utils/losetup.c +++ b/sys-utils/losetup.c @@ -472,7 +472,8 @@ static void warn_size(const char *filename, uint64_t size, uint64_t offset, int static int create_loop(struct loopdev_cxt *lc, int nooverlap, int lo_flags, int flags, - const char *file, uint64_t offset, uint64_t sizelimit) + const char *file, uint64_t offset, uint64_t sizelimit, + uint64_t blocksize) { int hasdev = loopcxt_has_device(lc); int rc = 0; @@ -560,6 +561,9 @@ static int create_loop(struct loopdev_cxt *lc, loopcxt_set_sizelimit(lc, sizelimit); if (lo_flags) loopcxt_set_flags(lc, lo_flags); + if (blocksize > 0) + loopcxt_set_blocksize(lc, blocksize); + if ((rc = loopcxt_set_backing_file(lc, file))) { warn(_("%s: failed to use backing file"), file); break; @@ -834,13 +838,14 @@ int main(int argc, char **argv) switch (act) { case A_CREATE: - res = create_loop(&lc, no_overlap, lo_flags, flags, file, offset, sizelimit); + res = create_loop(&lc, no_overlap, lo_flags, flags, file, + offset, sizelimit, blocksize); if (res == 0) { if (showdev) printf("%s\n", loopcxt_get_device(&lc)); warn_size(file, sizelimit, offset, flags); - if (set_dio || set_blocksize) - goto lo_set_post; + if (set_dio) + goto lo_set_dio; } break; case A_DELETE: @@ -893,20 +898,17 @@ int main(int argc, char **argv) loopcxt_get_device(&lc)); break; case A_SET_DIRECT_IO: +lo_set_dio: + res = loopcxt_ioctl_dio(&lc, use_dio); + if (res) + warn(_("%s: set direct io failed"), + loopcxt_get_device(&lc)); + break; case A_SET_BLOCKSIZE: - lo_set_post: - if (set_dio) { - res = loopcxt_ioctl_dio(&lc, use_dio); - if (res) - warn(_("%s: set direct io failed"), - loopcxt_get_device(&lc)); - } - if (set_blocksize) { - res = loopcxt_ioctl_blocksize(&lc, blocksize); - if (res) - warn(_("%s: set logical block size failed"), - loopcxt_get_device(&lc)); - } + res = loopcxt_ioctl_blocksize(&lc, blocksize); + if (res) + warn(_("%s: set logical block size failed"), + loopcxt_get_device(&lc)); break; default: warnx(_("bad usage")); -- cgit v1.2.3-55-g7522