Blob Blame History Raw
diff -up 1.0.0.rc15/include/dmraid/lib_context.h.rmparts 1.0.0.rc15/include/dmraid/lib_context.h
--- 1.0.0.rc15/include/dmraid/lib_context.h.rmparts	2008-06-20 16:17:35.000000000 +0200
+++ 1.0.0.rc15/include/dmraid/lib_context.h	2009-02-13 12:03:57.000000000 +0100
@@ -169,6 +169,7 @@ enum action {
 	PARTCHAR = 0x20000000,
 
 #endif
+	RMPARTITIONS = 0x40000000,
 };
 
 /* Arguments allowed ? */
diff -up 1.0.0.rc15/lib/Makefile.in.rmparts 1.0.0.rc15/lib/Makefile.in
--- 1.0.0.rc15/lib/Makefile.in.rmparts	2008-06-11 15:07:04.000000000 +0200
+++ 1.0.0.rc15/lib/Makefile.in	2009-02-13 12:03:57.000000000 +0100
@@ -12,6 +12,7 @@ SOURCES=\
 	activate/activate.c \
 	activate/devmapper.c \
 	device/ata.c \
+	device/partition.c \
 	device/scan.c \
 	device/scsi.c \
 	display/display.c \
diff -up 1.0.0.rc15/lib/device/dev-io.h.rmparts 1.0.0.rc15/lib/device/dev-io.h
--- 1.0.0.rc15/lib/device/dev-io.h.rmparts	2008-06-12 12:54:32.000000000 +0200
+++ 1.0.0.rc15/lib/device/dev-io.h	2009-02-13 12:03:57.000000000 +0100
@@ -19,5 +19,6 @@
 
 int discover_devices(struct lib_context *lc, char **devnodes);
 int removable_device(struct lib_context *lc, char *dev_path);
+int remove_device_partitions(struct lib_context *lc, void *rs, int dummy);
 
 #endif
diff -up /dev/null 1.0.0.rc15/lib/device/partition.c
--- /dev/null	2009-02-13 08:38:43.364262886 +0100
+++ 1.0.0.rc15/lib/device/partition.c	2009-02-13 12:03:57.000000000 +0100
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2009  Hans de Goede <hdegoede@redhat.com>, Red Hat Inc.
+ *                     All rights reserved.
+ *
+ * See file LICENSE at the top of this source tree for license information.
+ */
+#include <linux/blkpg.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "internal.h"
+
+static int
+_remove_subset_partitions(struct lib_context *lc, struct raid_set *rs)
+{
+	struct raid_dev *rd;
+	struct blkpg_partition part = { 0, };
+	struct blkpg_ioctl_arg io = {
+		.op = BLKPG_DEL_PARTITION,
+		.datalen = sizeof(part),
+		.data = &part,
+	};
+
+	list_for_each_entry(rd, &rs->devs, devs) {
+		int fd = open(rd->di->path, O_RDWR);
+		if (fd < 0)
+			LOG_ERR(lc, 0, "opening %s: %s\n", rd->di->path,
+				strerror(errno));
+
+		/* There is no way to enumerate partitions */
+		for (part.pno = 1; part.pno <= 256; part.pno++) {
+			if (ioctl(fd, BLKPG, &io) < 0 && errno != ENXIO &&
+					(part.pno < 16 || errno != EINVAL))
+				LOG_ERR(lc, 0,
+					"removing part %d from %s: %s\n",
+					part.pno, rd->di->path,
+					strerror(errno));
+		}
+	}
+	return 1;
+}
+
+/* Remove the partition block devices (ie sda1) from block devices (ie sda)
+   used in the set, so that things like hal / blkid won't try to access the
+   disks directly */
+int
+remove_device_partitions(struct lib_context *lc, void *v, int dummy)
+{
+	struct raid_set *subset, *rs = v;
+
+	/* Recursively walk down the chain of stacked RAID sets */
+	list_for_each_entry(subset, &rs->sets, list) {
+		/* Remove partitions from devices of set below this one */
+		if (!T_GROUP(rs) && !remove_device_partitions(lc, subset, 0))
+			return 0;
+	}
+
+	return _remove_subset_partitions(lc, rs);
+}
diff -up 1.0.0.rc15/lib/metadata/metadata.c.rmparts 1.0.0.rc15/lib/metadata/metadata.c
--- 1.0.0.rc15/lib/metadata/metadata.c.rmparts	2008-09-17 14:58:31.000000000 +0200
+++ 1.0.0.rc15/lib/metadata/metadata.c	2009-02-13 12:03:57.000000000 +0100
@@ -2147,6 +2147,9 @@ lib_perform(struct lib_context *lc, enum
 	if (get_metadata(lc, action, p, argv))
 		ret = p->post(lc, p->pre ? p->pre(p->arg) : p->arg);
 
+	if (ret && (RMPARTITIONS & action))
+		process_sets(lc, remove_device_partitions, 0, SETS);
+
 	if (LOCK == p->lock)
 		unlock_resource(lc, NULL);
 
diff -up 1.0.0.rc15/man/dmraid.8.rmparts 1.0.0.rc15/man/dmraid.8
--- 1.0.0.rc15/man/dmraid.8.rmparts	2008-06-11 15:07:20.000000000 +0200
+++ 1.0.0.rc15/man/dmraid.8	2009-02-13 12:10:11.000000000 +0100
@@ -8,6 +8,7 @@ dmraid \- discover, configure and activa
  [-f|--format FORMAT[,FORMAT...]]
  [{-P|--partchar} CHAR]
  [-p|--no_partitions]
+ [-Z|--rm_partitions]
  [--separator SEPARATOR]
  [-t|--test]
  [RAID-set...]
@@ -110,7 +111,11 @@ In case metadata format handlers are cho
 Useful if devices have multiple metadata signatures.
 When activating RAID sets,
 .B -p
-disables the activation of partitions on them.
+disables the activation of partitions on them, and
+.B -Z
+will make dmraid tell the kernel to remove the partitions from the disks
+underlying the set, ie if sda is part of the set, remove sda1, sda2, etc.
+This prevents applications from directly accessiong the disks bypassing dmraid.
 RAID set names given on command line don't need to be fully specified
 (eg, "dmraid -ay sil" would activate all discovered Silicon Image Medley
 RAID sets).
diff -up 1.0.0.rc15/tools/commands.c.rmparts 1.0.0.rc15/tools/commands.c
--- 1.0.0.rc15/tools/commands.c.rmparts	2008-06-20 22:25:33.000000000 +0200
+++ 1.0.0.rc15/tools/commands.c	2009-02-13 12:03:57.000000000 +0100
@@ -38,7 +38,7 @@ static char const *short_opts = "a:hipP:
 #endif
 	"rR:s::tv"
 #endif
-	"VC:S::";
+	"VC:S::Z";
 
 #ifdef HAVE_GETOPTLONG
 static struct option long_opts[] = {
@@ -73,6 +73,7 @@ static struct option long_opts[] = {
 	{"version", no_argument, NULL, 'V'},
 	{"create", required_argument, NULL, 'C'},
 	{"spare", optional_argument, NULL, 'S'},
+	{"rm_partitions", no_argument, NULL, 'Z'},
 	{NULL, no_argument, NULL, 0}
 };
 #endif /* #ifdef HAVE_GETOPTLONG */
@@ -209,6 +210,7 @@ help(struct lib_context *lc, int arg)
 		  "\t[-f|--format FORMAT[,FORMAT...]]\n"
 		  "\t[-P|--partchar CHAR]\n"
 		  "\t[-p|--no_partitions]\n"
+		  "\t[-Z|--rm_partitions]\n"
 		  "\t[--separator SEPARATOR]\n" "\t[RAID-set...]\n", c);
 	log_print(lc, "%s\t{-h|--help}\n", c);
 	log_print(lc, "%s\t{-V/--version}\n", c);
@@ -221,7 +223,7 @@ help(struct lib_context *lc, int arg)
 		  "\t[-f|--format FORMAT[,FORMAT...]]\n"
 		  "\t[-P|--partchar CHAR]\n" "\t[-p|--no_partitions]\n"
 		  "\t[--separator SEPARATOR]\n" "\t[-t|--test]\n"
-		  "\t[RAID-set...]\n", c);
+		  "\t[-Z|--rm_partitions] [RAID-set...]\n", c);
 	log_print(lc,
 		  "%s\t{-b|--block_devices} *\n"
 		  "\t[-c|--display_columns][FIELD[,FIELD...]]...\n"
@@ -274,7 +276,7 @@ static struct actions actions[] = {
 	 UNDEF,			/* Set in check_activate() by mandatory option argument. */
 	 UNDEF,
 	 ACTIVATE | DEACTIVATE | FORMAT | HELP | IGNORELOCKING | NOPARTITIONS |
-	 SEPARATOR
+	 SEPARATOR | RMPARTITIONS
 #ifndef DMRAID_MINI
 	 | DBG | TEST | VERBOSE
 #endif
@@ -293,7 +295,8 @@ static struct actions actions[] = {
 #  endif
 	 | RAID_DEVICES | RAID_SETS,
 	 ACTIVE | INACTIVE | COLUMN | DBG | DUMP | DMERASE | GROUP | HELP |
-	 IGNORELOCKING | NOPARTITIONS | SEPARATOR | TEST | VERBOSE
+	 IGNORELOCKING | NOPARTITIONS | SEPARATOR | TEST | VERBOSE |
+	 RMPARTITIONS
 #else
 	 , UNDEF
 #endif
@@ -310,7 +313,7 @@ static struct actions actions[] = {
 	{'P',
 	 PARTCHAR,
 	 ACTIVATE | DEACTIVATE,
-	 FORMAT | HELP | IGNORELOCKING | SEPARATOR
+	 FORMAT | HELP | IGNORELOCKING | SEPARATOR | RMPARTITIONS
 #ifndef DMRAID_MINI
 	 | DBG | TEST | VERBOSE
 #endif
@@ -323,7 +326,7 @@ static struct actions actions[] = {
 	{'p',
 	 NOPARTITIONS,
 	 ACTIVATE | DEACTIVATE,
-	 FORMAT | HELP | IGNORELOCKING | SEPARATOR
+	 FORMAT | HELP | IGNORELOCKING | SEPARATOR | RMPARTITIONS
 #ifndef DMRAID_MINI
 	 | DBG | TEST | VERBOSE
 #endif
@@ -573,6 +576,15 @@ static struct actions actions[] = {
 	 check_spare_argument,
 	 LC_HOT_SPARE_SET,
 	 },
+	{'Z',
+	 RMPARTITIONS,
+	 ACTIVATE, /* We cannot undo this on DEACTIVATE ! */
+	 DBG | FORMAT | HELP | IGNORELOCKING | NOPARTITIONS | VERBOSE |
+	 SEPARATOR,
+	 ARGS,
+	 NULL,
+	 0,
+	 },
 };
 
 /*