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>
This commit is contained in:
Denys Vlasenko 2021-06-16 17:00:56 +02:00
parent 609df6f22a
commit 46d315ae44

View File

@ -25,8 +25,11 @@
//usage: "\n --getbsz Get block size"
//usage: "\n --setbsz BYTES Set block size"
//usage: "\n --getsz Get device size in 512-byte sectors"
/*//usage: "\n --getsize Get device size in sectors (deprecated)"*/
///////: "\n --getsize Get device size in sectors (deprecated)"
///////^^^^^ supported, but not shown in help ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//usage: "\n --getsize64 Get device size in bytes"
//usage: "\n --getra Get readahead in 512-byte sectors"
//usage: "\n --setra SECTORS Set readahead"
//usage: "\n --flushbufs Flush buffers"
//usage: "\n --rereadpt Reread partition table"
// util-linux 2.31 also has:
@ -57,6 +60,9 @@ static const char bdcmd_names[] ALIGN1 =
"getsz" "\0"
"getsize" "\0"
"getsize64" "\0"
"getra" "\0"
"setra" "\0"
#define CMD_SETRA 10
"flushbufs" "\0"
"rereadpt" "\0"
;
@ -70,6 +76,8 @@ static const uint32_t bdcmd_ioctl[] ALIGN4 = {
BLKGETSIZE64, //getsz
BLKGETSIZE, //getsize
BLKGETSIZE64, //getsize64
BLKRAGET, //getra
BLKRASET, //setra
BLKFLSBUF, //flushbufs
BLKRRPART, //rereadpt
};
@ -95,6 +103,8 @@ static const uint8_t bdcmd_flags[] ALIGN1 = {
ARG_U64 + FL_SCALE512, //getsz
ARG_ULONG, //getsize
ARG_U64, //getsize64
ARG_ULONG, //getra
ARG_ULONG + FL_NORESULT, //setra
ARG_NONE + FL_NORESULT, //flushbufs
ARG_NONE + FL_NORESULT, //rereadpt
};
@ -130,8 +140,9 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv)
/* setrw translates to BLKROSET(0), most other ioctls don't care... */
/* ...setro will do BLKROSET(1) */
u64 = (bdcmd == CMD_SETRO);
if (bdcmd == CMD_SETBSZ) {
if (bdcmd == CMD_SETBSZ || bdcmd == CMD_SETRA) {
/* ...setbsz is BLKBSZSET(bytes) */
/* ...setra is BLKRASET(512 bytes) */
u64 = xatoi_positive(*++argv);
}
@ -145,8 +156,11 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv)
#if BB_BIG_ENDIAN
/* Store data properly wrt data size.
* (1) It's no-op for little-endian.
* (2) it's no-op for 0 and -1. Only --setro uses arg != 0 and != -1,
* and it is ARG_INT. --setbsz USER_VAL is also ARG_INT.
* (2) it's no-op for 0 and -1.
* --setro uses arg != 0 and != -1, and it is ARG_INT
* --setbsz USER_VAL is also ARG_INT
* --setra USER_VAL is ARG_ULONG, but it is passed by value,
* not reference (see below in ioctl call).
* Thus, we don't need to handle ARG_ULONG.
*/
switch (flags & ARG_MASK) {
@ -161,7 +175,11 @@ int blockdev_main(int argc UNUSED_PARAM, char **argv)
}
#endif
if (ioctl(fd, bdcmd_ioctl[bdcmd], &ioctl_val_on_stack.u64) == -1)
if (ioctl(fd, bdcmd_ioctl[bdcmd],
bdcmd == CMD_SETRA
? (void*)(uintptr_t)u64 /* BLKRASET passes _value_, not pointer to it */
: &ioctl_val_on_stack.u64
) == -1)
bb_simple_perror_msg_and_die(*argv);
/* Fetch it into register(s) */