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:
parent
609df6f22a
commit
46d315ae44
@ -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) */
|
||||||
|
Loading…
Reference in New Issue
Block a user