diff -uNr busybox-1.17.2/util-linux/blockdev.c busybox-1.17.2-new/util-linux/blockdev.c
--- busybox-1.17.2/util-linux/blockdev.c	1970-01-01 03:00:00.000000000 +0300
+++ busybox-1.17.2-new/util-linux/blockdev.c	2010-09-05 21:24:09.000000000 +0400
@@ -0,0 +1,199 @@
+/*
+ * blockdev implementation for busybox
+ *
+ * Copyright (C) 2010 Sergey Naumov <sknaumov@gmail.com>
+ *
+ * Licensed under GPLv2, see file License in this tarball for details.
+ */
+
+//applet:IF_BLOCKDEV(APPLET(blockdev, _BB_DIR_SBIN, _BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_BLOCKDEV)          += blockdev.o
+
+//config:config BLOCKDEV
+//config:	bool "blockdev"
+//config:	default y
+//config:	help
+//config:	  Performs some ioctls with block devices.
+
+//usage:#define blockdev_trivial_usage
+//usage:	"OPTION [OPTARG] DEVICE"
+//usage:#define blockdev_full_usage "\n\n"
+//usage:	"OPTIONS:\n"
+//usage:	"--setro		Set ro\n"
+//usage:	"--setrw		Set rw\n"
+//usage:	"--getro		Get ro (1 if ro, 0 if rw)\n"
+//usage:	"--getss		Get sector size\n"
+//usage:	"--getbsz	Get block size\n"
+//usage:	"--setbsz N	Set block size to N\n"
+//usage:	"--getsize	Get device size in 512-sectors\n"
+//usage:	"--getsize64	Get device size in bytes\n"
+//usage:	"--flushbufs	Flush buffers\n"
+//usage:	"--rereadpt	Reread partition table\n\n"
+//usage:	"RETURN CODES:\n"
+//usage:	"0	OK\n"
+//usage:	"1	bad usage\n"
+//usage:	"2	IOCTL failure\n"
+//usage:	"3	no such device\n"
+
+
+#include "libbb.h"
+#include <linux/fs.h>
+
+enum {
+	OK = 0,
+	/* 1 for bb_show_usage() */
+	ERR_IOCTL = 2,
+	ERR_NODEV,
+};
+
+/* ioctl argument types */
+enum {
+	ARG_NONE = 0,
+	ARG_INT,
+	ARG_ULONG,
+	ARG_ULLONG,
+};
+
+enum {
+	FL_NORESULT = (1 << 2),
+	FL_USRARG = (1 << 3), /* argument is provided by user */
+};
+
+struct bdc {
+	long		ioc;		/* ioctl code */
+	int8_t		argval;		/* default argument */
+
+	const char	*name;		/* --setfoo */
+
+	uint8_t		argtype;
+	uint8_t		flags;
+};
+
+const struct bdc bdcms[] =
+{
+	{
+		.ioc = BLKROSET,
+		.name = "--setro",
+		.argtype = ARG_INT,
+		.argval = 1,
+		.flags = FL_NORESULT,
+	},{
+		.ioc = BLKROSET,
+		.name = "--setrw",
+		.argtype = ARG_INT,
+		.argval = 0,
+		.flags = FL_NORESULT,
+	},{
+		.ioc = BLKROGET,
+		.name = "--getro",
+		.argtype = ARG_INT,
+		.argval = -1,
+	},{
+		.ioc = BLKSSZGET,
+		.name = "--getss",
+		.argtype = ARG_INT,
+		.argval = -1,
+	},{
+		.ioc = BLKBSZGET,
+		.name = "--getbsz",
+		.argtype = ARG_INT,
+		.argval = -1,
+	},{
+		.ioc = BLKBSZSET,
+		.name = "--setbsz",
+		.argtype = ARG_INT,
+		.flags = FL_NORESULT | FL_USRARG,
+	},{
+		.ioc = BLKGETSIZE,
+		.name = "--getsize",
+		.argtype = ARG_ULONG,
+		.argval = -1,
+	},{
+		.ioc = BLKGETSIZE64,
+		.name = "--getsize64",
+		.argtype = ARG_ULLONG,
+		.argval = -1,
+	},{
+		.ioc = BLKFLSBUF,
+		.name = "--flushbufs",
+	},{
+		.ioc = BLKRRPART,
+		.name = "--rereadpt",
+	}
+};
+
+static int find_cmd(char *s)
+{
+	int j;
+
+	for (j = 0; j < ARRAY_SIZE(bdcms); j++)
+		if (!strcmp(s, bdcms[j].name))
+			return j;
+	return -1;
+}
+
+int blockdev_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int blockdev_main(int argc, char **argv)
+{
+	int fd;
+	int j; /* cmd index */
+	int res = OK;
+	
+	int iarg;
+	unsigned long lu;
+	unsigned long long llu;
+	
+	if (argc != 3 && argc != 4) bb_show_usage();
+	j = find_cmd(argv[1]);
+	if (-1 == j) bb_show_usage();
+	
+	if (bdcms[j].flags & FL_USRARG) {
+		if (argc != 4) bb_show_usage();
+	}
+	else
+		if (argc != 3) bb_show_usage();
+	
+	fd = open(argv[argc - 1], O_RDONLY, 0);
+	if (fd < 0) return bb_perror_msg("%s", argv[argc - 1]), ERR_NODEV;
+	
+	switch (bdcms[j].argtype) {
+	default: /* ARG_NONE */
+		res = ioctl(fd, bdcms[j].ioc, 0);
+		break;
+	case ARG_INT:
+		if (bdcms[j].flags & FL_USRARG) {
+			iarg = xatoi_u(argv[2]);
+		} else
+			iarg = bdcms[j].argval;
+
+		res = ioctl(fd, bdcms[j].ioc, &iarg);
+		break;
+	case ARG_ULONG:
+		lu = bdcms[j].argval;
+		res = ioctl(fd, bdcms[j].ioc, &lu);
+		break;
+	case ARG_ULLONG:
+		llu = bdcms[j].argval;
+		res = ioctl(fd, bdcms[j].ioc, &llu);
+		break;
+	}
+	
+	if (res == -1) return bb_perror_msg("ioctl failure"), ERR_IOCTL;
+	
+	if (!(bdcms[j].flags & FL_NORESULT)) {
+		switch (bdcms[j].argtype) {
+		case ARG_INT:
+			printf("%d\n", iarg);
+			break;
+		case ARG_ULONG:
+			printf("%lu\n", lu);
+			break;
+		case ARG_ULLONG:
+			printf("%llu\n", llu);
+			break;
+		}
+	}
+	close(fd);
+	return OK;
+}
