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