summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgrog <grog@FreeBSD.org>1999-08-24 02:26:15 +0000
committergrog <grog@FreeBSD.org>1999-08-24 02:26:15 +0000
commit65014fdc6389f488d5ceb6ae69cdf69324943359 (patch)
tree83974984a5d90bebafed188e9e272a556e95d3f7
parentb4cf138bbbe03782951b7d864cd1c72df47432b3 (diff)
downloadFreeBSD-src-65014fdc6389f488d5ceb6ae69cdf69324943359.zip
FreeBSD-src-65014fdc6389f488d5ceb6ae69cdf69324943359.tar.gz
Add VINUM_SETSTATE_FORCE ioctl for diddling individual object states.
This is a repair tool which can also be used for panicing the system. Use with utmost care if at all.
-rw-r--r--sys/dev/vinum/vinumio.h2
-rw-r--r--sys/dev/vinum/vinumioctl.c20
2 files changed, 15 insertions, 7 deletions
diff --git a/sys/dev/vinum/vinumio.h b/sys/dev/vinum/vinumio.h
index c3bd528..a7c43d3 100644
--- a/sys/dev/vinum/vinumio.h
+++ b/sys/dev/vinum/vinumio.h
@@ -126,7 +126,7 @@ struct vinum_ioctl_msg {
#define VINUM_INITSD _IOW(L, 82, int) /* initialize a subdisk */
#define VINUM_REMOVE _IOWR(L, 83, struct vinum_ioctl_msg) /* remove an object */
#define VINUM_READPOL _IOWR(L, 84, struct vinum_ioctl_msg) /* set read policy */
-/* 85 going begging */
+#define VINUM_SETSTATE_FORCE _IOC(IOC_IN | IOC_OUT, L, 85, MAX_IOCTL_REPLY) /* diddle object state */
#define VINUM_RESETSTATS _IOWR(L, 86, struct vinum_ioctl_msg) /* reset object stats */
#define VINUM_ATTACH _IOWR(L, 87, struct vinum_ioctl_msg) /* attach an object */
#define VINUM_DETACH _IOWR(L, 88, struct vinum_ioctl_msg) /* remove an object */
diff --git a/sys/dev/vinum/vinumioctl.c b/sys/dev/vinum/vinumioctl.c
index 4200602..5eaa697 100644
--- a/sys/dev/vinum/vinumioctl.c
+++ b/sys/dev/vinum/vinumioctl.c
@@ -60,7 +60,7 @@ void replaceobject(struct vinum_ioctl_msg *);
jmp_buf command_fail; /* return on a failed command */
/* ioctl routine */
-int
+int
vinumioctl(dev_t dev,
u_long cmd,
caddr_t data,
@@ -220,6 +220,14 @@ vinumioctl(dev_t dev,
setstate((struct vinum_ioctl_msg *) data); /* set an object state */
return 0;
+ /*
+ * Set state by force, without changing
+ * anything else.
+ */
+ case VINUM_SETSTATE_FORCE:
+ setstate_by_force((struct vinum_ioctl_msg *) data); /* set an object state */
+ return 0;
+
#ifdef VINUMDEBUG
case VINUM_MEMINFO:
vinum_meminfo(data);
@@ -463,7 +471,7 @@ validvol(int volno, struct _ioctl_reply *reply)
}
/* reset an object's stats */
-void
+void
resetstats(struct vinum_ioctl_msg *msg)
{
struct _ioctl_reply *reply = (struct _ioctl_reply *) msg;
@@ -542,7 +550,7 @@ resetstats(struct vinum_ioctl_msg *msg)
}
/* attach an object to a superior object */
-void
+void
attachobject(struct vinum_ioctl_msg *msg)
{
struct _ioctl_reply *reply = (struct _ioctl_reply *) msg;
@@ -623,7 +631,7 @@ attachobject(struct vinum_ioctl_msg *msg)
}
/* detach an object from a superior object */
-void
+void
detachobject(struct vinum_ioctl_msg *msg)
{
struct _ioctl_reply *reply = (struct _ioctl_reply *) msg;
@@ -751,7 +759,7 @@ detachobject(struct vinum_ioctl_msg *msg)
}
}
-void
+void
renameobject(struct vinum_rename_msg *msg)
{
struct _ioctl_reply *reply = (struct _ioctl_reply *) msg;
@@ -832,7 +840,7 @@ renameobject(struct vinum_rename_msg *msg)
* message->index is the drive number of the old drive
* message->otherobject is the drive number of the new drive
*/
-void
+void
replaceobject(struct vinum_ioctl_msg *msg)
{
struct _ioctl_reply *reply = (struct _ioctl_reply *) msg;
OpenPOWER on IntegriCloud