summaryrefslogtreecommitdiffstats
path: root/sbin/vinum/commands.c
diff options
context:
space:
mode:
authorgrog <grog@FreeBSD.org>1999-03-02 07:00:57 +0000
committergrog <grog@FreeBSD.org>1999-03-02 07:00:57 +0000
commitc7982bfad01c8bfa5b2fd94bce28e35c4247d975 (patch)
tree7c1cdcbc04e51d0d117e3a4663b873403d26c514 /sbin/vinum/commands.c
parent4913dff128dc2f34657efb86945036a4e02fc82a (diff)
downloadFreeBSD-src-c7982bfad01c8bfa5b2fd94bce28e35c4247d975.zip
FreeBSD-src-c7982bfad01c8bfa5b2fd94bce28e35c4247d975.tar.gz
resetconfig: don't log the "obliterated" message, the kernel does that
for us. Rebuild the (almost empty) /dev/vinum directory. vinum_start: remove superflous "read" parameter when starting with no parameters. vinum_stop: without an argument, stop Vinum and remove the kld if it's idle. vinum_saveconfig: New command to save configuration.
Diffstat (limited to 'sbin/vinum/commands.c')
-rw-r--r--sbin/vinum/commands.c58
1 files changed, 47 insertions, 11 deletions
diff --git a/sbin/vinum/commands.c b/sbin/vinum/commands.c
index b0f593a..6083347 100644
--- a/sbin/vinum/commands.c
+++ b/sbin/vinum/commands.c
@@ -54,6 +54,8 @@
#include <dev/vinum/vinumhdr.h>
#include "vext.h"
#include <sys/types.h>
+#include <sys/linker.h>
+#include <sys/module.h>
#include <sys/wait.h>
#include <readline/history.h>
#include <readline/readline.h>
@@ -68,6 +70,7 @@ vinum_create(int argc, char *argv[], char *arg0[])
FILE *dfd; /* file descriptor for the config file */
char buffer[BUFSIZE]; /* read config file in here */
struct _ioctl_reply *reply;
+ int ioctltype; /* for ioctl call */
if (argc != 1) { /* wrong arg count */
fprintf(stderr, "Expecting 1 parameter, not %d\n", argc);
@@ -109,7 +112,8 @@ vinum_create(int argc, char *argv[], char *arg0[])
}
}
fclose(dfd); /* done with the config file */
- error = ioctl(superdev, VINUM_SAVECONFIG, NULL); /* save the config to disk */
+ ioctltype = 0; /* saveconfig after update */
+ error = ioctl(superdev, VINUM_SAVECONFIG, &ioctltype); /* save the config to disk */
if (error != 0)
perror("Can't save Vinum config");
make_devices();
@@ -304,9 +308,8 @@ vinum_resetconfig(int argc, char *argv[], char *arg0[])
else
perror("Can't find vinum config");
} else {
+ make_devices(); /* recreate the /dev/vinum hierarchy */
printf("\b Vinum configuration obliterated\n");
- system("rm -rf " VINUM_DIR "/" "*"); /* remove the old /dev/vinum */
- syslog(LOG_NOTICE | LOG_KERN, "configuration obliterated");
start_daemon(); /* then restart the daemon */
}
}
@@ -448,10 +451,11 @@ vinum_start(int argc, char *argv[], char *arg0[])
fprintf(stderr, "Can't allocate memory for drive list\n");
return;
}
- token[0] = "read"; /* make a read command of this mess */
- tokens = 1; /* so far, it's the only token */
-
- getdevs(&statinfo); /* find out what devices we have */
+ tokens = 0; /* no tokens yet */
+ if (getdevs(&statinfo) < 0) { /* find out what devices we have */
+ perror("Can't get device list");
+ return;
+ }
namelist[0] = '\0'; /* start with empty namelist */
enamelist = namelist; /* point to the end of the list */
@@ -459,7 +463,7 @@ vinum_start(int argc, char *argv[], char *arg0[])
struct devstat *stat = &statinfo.dinfo->devices[i];
if (((stat->device_type & DEVSTAT_TYPE_MASK) == DEVSTAT_TYPE_DIRECT) /* disk device */
- &&((stat->device_type & DEVSTAT_TYPE_PASS) == 0) /* and not passthrough */
+&&((stat->device_type & DEVSTAT_TYPE_PASS) == 0) /* and not passthrough */
&&((stat->device_name[0] != '\0'))) { /* and it has a name */
sprintf(enamelist, "/dev/%s%d", stat->device_name, stat->unit_number);
token[tokens] = enamelist; /* point to it */
@@ -511,9 +515,26 @@ vinum_stop(int argc, char *argv[], char *arg0[])
struct vinum_ioctl_msg *message = (struct vinum_ioctl_msg *) &reply;
message->force = force; /* should we force the transition? */
- if (argc == 0) /* stop everything */
- fprintf(stderr, "stop must have an argument\n");
- else { /* stop specified objects */
+ if (argc == 0) { /* stop vinum */
+ int fileid = 0; /* ID of Vinum kld */
+
+ close(superdev); /* we can't stop if we have vinum open */
+ fileid = kldfind(VINUMMOD);
+ if ((fileid < 0) /* no go */
+ ||(kldunload(fileid) < 0))
+ perror("Can't unload " VINUMMOD);
+ else {
+ fprintf(stderr, VINUMMOD " unloaded\n");
+ exit(0);
+ }
+
+ /* If we got here, the stop failed. Reopen the superdevice. */
+ superdev = open(VINUM_SUPERDEV_NAME, O_RDWR); /* reopen vinum superdevice */
+ if (superdev < 0) {
+ perror("Can't reopen Vinum superdevice");
+ exit(1);
+ }
+ } else { /* stop specified objects */
int i;
enum objecttype type;
@@ -1102,3 +1123,18 @@ vinum_setdaemon(int argc, char *argv[], char *argv0[])
fprintf(stderr, "Usage: \tsetdaemon [<bitmask>]\n");
}
}
+
+/* Save config info */
+void
+vinum_saveconfig(int argc, char *argv[], char *argv0[])
+{
+ int ioctltype;
+
+ if (argc != 0) {
+ printf("Usage: saveconfig\n");
+ return;
+ }
+ ioctltype = 1; /* user saveconfig */
+ if (ioctl(superdev, VINUM_SAVECONFIG, &ioctltype) < 0)
+ fprintf(stderr, "Can't set daemon options: %s (%d)\n", strerror(errno), errno);
+}
OpenPOWER on IntegriCloud