kfan / rpms / util-linux

Forked from rpms/util-linux 3 years ago
Clone
Blob Blame History Raw
--- util-linux-2.13-pre6/disk-utils/blockdev.c.rmparts	2006-02-08 14:10:48.000000000 -0500
+++ util-linux-2.13-pre6/disk-utils/blockdev.c	2006-02-08 14:19:31.000000000 -0500
@@ -29,6 +29,28 @@
 #define BLKGETSIZE64 _IOR(0x12,114,size_t)
 #endif
 
+#ifndef BLKPG
+#define BLKPG _IO(0x12,105)
+#define BLKPG_DEL_PARTITION 2
+#define BLKPG_DEVNAMELTH 64
+#define BLKPG_VOLNAMELTH 64
+
+struct blkpg_partition {
+	long long start;
+	long long length;
+	long long pno;
+	char devname[BLKPG_DEVNAMELTH];
+	char volname[BLKPG_VOLNAMELTH];
+};
+
+struct blkpg_ioctl_arg {
+	int op;
+	int flags;
+	int datalen;
+	void *data;
+};
+#endif
+
 /* Maybe <linux/hdreg.h> could be included */
 #ifndef HDIO_GETGEO
 #define HDIO_GETGEO 0x0301
@@ -93,6 +115,10 @@
 	{ "--rereadpt", "BLKRRPART", BLKRRPART, ARGNONE, 0, NULL,
 	  N_("reread partition table") },
 #endif
+#ifdef BLKPG
+	{ "--rmpart", "BLKPG", BLKPG, ARGINTAP, 0, "PARTNO", N_("disable partition") },
+	{ "--rmparts", "BLKPG", BLKPG, ARGNONE, 0, NULL, N_("disable all partitions") },
+#endif
 };
 
 #define SIZE(a)	(sizeof(a)/sizeof((a)[0]))
@@ -144,6 +170,35 @@
 	return 0;
 }
 
+#ifdef BLKPG
+static int
+disable_partition(int fd, int partno) {
+	struct blkpg_partition part = {
+		.pno = partno,
+	};
+	struct blkpg_ioctl_arg io = {
+		.op = BLKPG_DEL_PARTITION,
+		.datalen = sizeof(part),
+		.data = &part,
+	};
+	int res;
+
+	res = ioctl(fd, BLKPG, &io);
+	if (res < 0)
+		return 0;
+	return 1;
+}
+
+static int
+disable_partitions(int fd) {
+	int p, res = 0;
+
+	for (p = 1; p <= 256; p++)
+		res += disable_partition(fd, p);
+	return res ? 0 : -1;
+}
+#endif
+
 void do_commands(int fd, char **argv, int d);
 void report_header(void);
 void report_device(char *device, int quiet);
@@ -259,6 +314,12 @@
 		switch(bdcms[j].argtype) {
 		default:
 		case ARGNONE:
+#ifdef BLKPG
+			if (bdcms[j].ioc == BLKPG) {
+				res = disable_partitions(fd);
+				break;
+			}
+#endif
 			res = ioctl(fd, bdcms[j].ioc, 0);
 			break;
 		case ARGINTA:
@@ -276,6 +337,13 @@
 					bdcms[j].name);
 				usage();
 			}
+#ifdef BLKPG
+			if (bdcms[j].ioc == BLKPG) {
+				iarg = atoi(argv[++i]);
+				res = disable_partition(fd, iarg) ? 0 : -1;
+				break;
+			}
+#endif
 			iarg = atoi(argv[++i]);
 			res = ioctl(fd, bdcms[j].ioc, &iarg);
 			break;