diff --git a/util-linux/losetup.c b/util-linux/losetup.c index bf480e9bf..2248f2cba 100644 --- a/util-linux/losetup.c +++ b/util-linux/losetup.c @@ -20,10 +20,11 @@ //kbuild:lib-$(CONFIG_LOSETUP) += losetup.o //usage:#define losetup_trivial_usage -//usage: "[-r] [-o OFS] {-f|LOOPDEV} FILE - associate loop devices\n" -//usage: " losetup -d LOOPDEV - disassociate\n" -//usage: " losetup -a - show status\n" -//usage: " losetup -f - show next free loop device" +//usage: "[-r] [-o OFS] {-f|LOOPDEV} FILE: associate loop devices\n" +//usage: " losetup -c LOOPDEV: reread file size\n" +//usage: " losetup -d LOOPDEV: disassociate\n" +//usage: " losetup -a: show status\n" +//usage: " losetup -f: show next free loop device" //usage:#define losetup_full_usage "\n\n" //usage: " -o OFS Start OFS bytes into FILE" //usage: "\n -r Read-only" @@ -50,14 +51,15 @@ int losetup_main(int argc UNUSED_PARAM, char **argv) char *opt_o; char dev[LOOP_NAMESIZE]; enum { - OPT_d = (1 << 0), - OPT_o = (1 << 1), - OPT_f = (1 << 2), - OPT_a = (1 << 3), - OPT_r = (1 << 4), /* must be last */ + OPT_c = (1 << 0), + OPT_d = (1 << 1), + OPT_o = (1 << 2), + OPT_f = (1 << 3), + OPT_a = (1 << 4), + OPT_r = (1 << 5), }; - opt = getopt32(argv, "^" "do:far" "\0" "?2:d--ofar:a--ofr", &opt_o); + opt = getopt32(argv, "^" "cdo:far" "\0" "?2:d--ofar:a--ofr", &opt_o); argv += optind; /* LOOPDEV */ @@ -73,6 +75,16 @@ int losetup_main(int argc UNUSED_PARAM, char **argv) return EXIT_SUCCESS; } + /* -c LOOPDEV */ + if (opt == OPT_c && argv[0]) { + int fd = xopen(argv[0], O_RDONLY); +#ifndef LOOP_SET_CAPACITY +# define LOOP_SET_CAPACITY 0x4C07 +#endif + xioctl(fd, LOOP_SET_CAPACITY, /*ignored:*/0); + return EXIT_SUCCESS; + } + /* -d LOOPDEV */ if (opt == OPT_d && argv[0]) { if (del_loop(argv[0]))