losetup: implement -c
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 23 May 2019 14:11:42 +0000 (16:11 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 23 May 2019 14:11:42 +0000 (16:11 +0200)
function                                             old     new   delta
losetup_main                                         422     449     +27
packed_usage                                       33243   33264     +21
get_next_block                                      1677    1681      +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 52/0)               Total: 52 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
util-linux/losetup.c

index bf480e9bf92076b65f72f02a1b26872a4e37a5cd..2248f2cba359b9ff082d35e6a28b64ff0bda19fe 100644 (file)
 //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]))