diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-16 17:00:56 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-06-16 17:00:56 +0200 |
| commit | 46d315ae445b3653f6e8a49003011c5bcf0eed9d (patch) | |
| tree | 586553a166fe9fd95b8f22dc825ca13c122ccee7 /util-linux | |
| parent | 609df6f22a960e45b727698f33be695d42541e25 (diff) | |
| download | busybox-w32-46d315ae445b3653f6e8a49003011c5bcf0eed9d.tar.gz busybox-w32-46d315ae445b3653f6e8a49003011c5bcf0eed9d.tar.bz2 busybox-w32-46d315ae445b3653f6e8a49003011c5bcf0eed9d.zip | |
blockdev: support --get/setra
function old new delta
blockdev_main 251 263 +12
bdcmd_names 82 94 +12
packed_usage 33534 33542 +8
bdcmd_ioctl 44 52 +8
bdcmd_flags 11 13 +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 5/0 up/down: 42/0) Total: 42 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'util-linux')
| -rw-r--r-- | util-linux/blockdev.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/util-linux/blockdev.c b/util-linux/blockdev.c index 20a031377..3b550220a 100644 --- a/util-linux/blockdev.c +++ b/util-linux/blockdev.c | |||
| @@ -25,8 +25,11 @@ | |||
| 25 | //usage: "\n --getbsz Get block size" | 25 | //usage: "\n --getbsz Get block size" |
| 26 | //usage: "\n --setbsz BYTES Set block size" | 26 | //usage: "\n --setbsz BYTES Set block size" |
| 27 | //usage: "\n --getsz Get device size in 512-byte sectors" | 27 | //usage: "\n --getsz Get device size in 512-byte sectors" |
| 28 | /*//usage: "\n --getsize Get device size in sectors (deprecated)"*/ | 28 | ///////: "\n --getsize Get device size in sectors (deprecated)" |
| 29 | ///////^^^^^ supported, but not shown in help ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| 29 | //usage: "\n --getsize64 Get device size in bytes" | 30 | //usage: "\n --getsize64 Get device size in bytes" |
| 31 | //usage: "\n --getra Get readahead in 512-byte sectors" | ||
| 32 | //usage: "\n --setra SECTORS Set readahead" | ||
| 30 | //usage: "\n --flushbufs Flush buffers" | 33 | //usage: "\n --flushbufs Flush buffers" |
| 31 | //usage: "\n --rereadpt Reread partition table" | 34 | //usage: "\n --rereadpt Reread partition table" |
| 32 | // util-linux 2.31 also has: | 35 | // util-linux 2.31 also has: |
| @@ -57,6 +60,9 @@ static const char bdcmd_names[] ALIGN1 = | |||
| 57 | "getsz" "\0" | 60 | "getsz" "\0" |
| 58 | "getsize" "\0" | 61 | "getsize" "\0" |
| 59 | "getsize64" "\0" | 62 | "getsize64" "\0" |
| 63 | "getra" "\0" | ||
| 64 | "setra" "\0" | ||
| 65 | #define CMD_SETRA 10 | ||
| 60 | "flushbufs" "\0" | 66 | "flushbufs" "\0" |
| 61 | "rereadpt" "\0" | 67 | "rereadpt" "\0" |
| 62 | ; | 68 | ; |
| @@ -70,6 +76,8 @@ static const uint32_t bdcmd_ioctl[] ALIGN4 = { | |||
| 70 | BLKGETSIZE64, //getsz | 76 | BLKGETSIZE64, //getsz |
| 71 | BLKGETSIZE, //getsize | 77 | BLKGETSIZE, //getsize |
| 72 | BLKGETSIZE64, //getsize64 | 78 | BLKGETSIZE64, //getsize64 |
| 79 | BLKRAGET, //getra | ||
| 80 | BLKRASET, //setra | ||
| 73 | BLKFLSBUF, //flushbufs | 81 | BLKFLSBUF, //flushbufs |
| 74 | BLKRRPART, //rereadpt | 82 | BLKRRPART, //rereadpt |
| 75 | }; | 83 | }; |
| @@ -95,6 +103,8 @@ static const uint8_t bdcmd_flags[] ALIGN1 = { | |||
| 95 | ARG_U64 + FL_SCALE512, //getsz | 103 | ARG_U64 + FL_SCALE512, //getsz |
| 96 | ARG_ULONG, //getsize | 104 | ARG_ULONG, //getsize |
| 97 | ARG_U64, //getsize64 | 105 | ARG_U64, //getsize64 |
| 106 | ARG_ULONG, //getra | ||
| 107 | ARG_ULONG + FL_NORESULT, //setra | ||
| 98 | ARG_NONE + FL_NORESULT, //flushbufs | 108 | ARG_NONE + FL_NORESULT, //flushbufs |
| 99 | ARG_NONE + FL_NORESULT, //rereadpt | 109 | ARG_NONE + FL_NORESULT, //rereadpt |
| 100 | }; | 110 | }; |
| @@ -130,8 +140,9 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
| 130 | /* setrw translates to BLKROSET(0), most other ioctls don't care... */ | 140 | /* setrw translates to BLKROSET(0), most other ioctls don't care... */ |
| 131 | /* ...setro will do BLKROSET(1) */ | 141 | /* ...setro will do BLKROSET(1) */ |
| 132 | u64 = (bdcmd == CMD_SETRO); | 142 | u64 = (bdcmd == CMD_SETRO); |
| 133 | if (bdcmd == CMD_SETBSZ) { | 143 | if (bdcmd == CMD_SETBSZ || bdcmd == CMD_SETRA) { |
| 134 | /* ...setbsz is BLKBSZSET(bytes) */ | 144 | /* ...setbsz is BLKBSZSET(bytes) */ |
| 145 | /* ...setra is BLKRASET(512 bytes) */ | ||
| 135 | u64 = xatoi_positive(*++argv); | 146 | u64 = xatoi_positive(*++argv); |
| 136 | } | 147 | } |
| 137 | 148 | ||
| @@ -145,8 +156,11 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
| 145 | #if BB_BIG_ENDIAN | 156 | #if BB_BIG_ENDIAN |
| 146 | /* Store data properly wrt data size. | 157 | /* Store data properly wrt data size. |
| 147 | * (1) It's no-op for little-endian. | 158 | * (1) It's no-op for little-endian. |
| 148 | * (2) it's no-op for 0 and -1. Only --setro uses arg != 0 and != -1, | 159 | * (2) it's no-op for 0 and -1. |
| 149 | * and it is ARG_INT. --setbsz USER_VAL is also ARG_INT. | 160 | * --setro uses arg != 0 and != -1, and it is ARG_INT |
| 161 | * --setbsz USER_VAL is also ARG_INT | ||
| 162 | * --setra USER_VAL is ARG_ULONG, but it is passed by value, | ||
| 163 | * not reference (see below in ioctl call). | ||
| 150 | * Thus, we don't need to handle ARG_ULONG. | 164 | * Thus, we don't need to handle ARG_ULONG. |
| 151 | */ | 165 | */ |
| 152 | switch (flags & ARG_MASK) { | 166 | switch (flags & ARG_MASK) { |
| @@ -161,7 +175,11 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv) | |||
| 161 | } | 175 | } |
| 162 | #endif | 176 | #endif |
| 163 | 177 | ||
| 164 | if (ioctl(fd, bdcmd_ioctl[bdcmd], &ioctl_val_on_stack.u64) == -1) | 178 | if (ioctl(fd, bdcmd_ioctl[bdcmd], |
| 179 | bdcmd == CMD_SETRA | ||
| 180 | ? (void*)(uintptr_t)u64 /* BLKRASET passes _value_, not pointer to it */ | ||
| 181 | : &ioctl_val_on_stack.u64 | ||
| 182 | ) == -1) | ||
| 165 | bb_simple_perror_msg_and_die(*argv); | 183 | bb_simple_perror_msg_and_die(*argv); |
| 166 | 184 | ||
| 167 | /* Fetch it into register(s) */ | 185 | /* Fetch it into register(s) */ |
