105 lines
2.2 KiB
Diff
105 lines
2.2 KiB
Diff
--- 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;
|