Sophie

Sophie

distrib > * > 2008.0 > x86_64 > by-pkgid > 2d4ad1ca5d26eb2694d23ca68c3b8fe4 > files > 20

util-linux-ng-2.13-3.4mdv2008.0.src.rpm

--- util-linux-ng-2.13-rc3/disk-utils/blockdev.c.kzak	2007-08-01 15:40:21.000000000 +0200
+++ util-linux-ng-2.13-rc3/disk-utils/blockdev.c	2007-08-13 12:31:47.000000000 +0200
@@ -32,6 +32,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
@@ -104,6 +126,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]))
@@ -163,6 +189,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);
@@ -280,6 +335,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:
@@ -297,6 +358,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;