[git commit] blockdev: support --get/setra

Denys Vlasenko vda.linux at googlemail.com
Wed Jun 16 15:00:56 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=46d315ae445b3653f6e8a49003011c5bcf0eed9d
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at googlemail.com>
---
 util-linux/blockdev.c | 28 +++++++++++++++++++++++-----
 1 file 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 @@
 //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) */


More information about the busybox-cvs mailing list