--- 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 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;