diff options
author | Peter Galbavy <peter@cvs.openbsd.org> | 1999-07-30 14:45:34 +0000 |
---|---|---|
committer | Peter Galbavy <peter@cvs.openbsd.org> | 1999-07-30 14:45:34 +0000 |
commit | 2d131282dabeb59997e716557431544d132defee (patch) | |
tree | 36b98c66a45bd7e085f283abb47dcf53504808af /sbin/raidctl/raidctl.c | |
parent | aad8058264cfbb51ec169e8ecd7f04209b706634 (diff) |
Update RAIDframe from NetBSD-current as of 1999/07/26.
Please note that you *must* follow the upgrade instructions at
http://www.cs.usask.ca/staff/oster/clabel_upgrade.html
before installing the new raidctl and new kernel using this code.
Diffstat (limited to 'sbin/raidctl/raidctl.c')
-rw-r--r-- | sbin/raidctl/raidctl.c | 316 |
1 files changed, 272 insertions, 44 deletions
diff --git a/sbin/raidctl/raidctl.c b/sbin/raidctl/raidctl.c index 95db0294c6a..6350be52c80 100644 --- a/sbin/raidctl/raidctl.c +++ b/sbin/raidctl/raidctl.c @@ -1,5 +1,5 @@ -/* $OpenBSD: raidctl.c,v 1.2 1999/02/16 21:51:39 niklas Exp $ */ -/* $NetBSD: raidctl.c,v 1.4 1999/02/04 14:50:31 oster Exp $ */ +/* $OpenBSD: raidctl.c,v 1.3 1999/07/30 14:45:32 peter Exp $ */ +/* $NetBSD: raidctl.c,v 1.6 1999/03/02 03:13:59 oster Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. * All rights reserved. @@ -57,6 +57,11 @@ #include <errno.h> #include <sys/types.h> #include <string.h> +#ifdef NETBSD +#include <sys/disklabel.h> +#include <machine/disklabel.h> +#endif +#include <stdlib.h> #include <unistd.h> #include "rf_raidframe.h" @@ -65,11 +70,18 @@ extern char *__progname; int main __P((int, char *[])); static void do_ioctl __P((int, unsigned long, void *, char *)); -static void rf_configure __P((int, char*)); +static void rf_configure __P((int, char*, int)); static char *device_status __P((RF_DiskStatus_t)); static void rf_get_device_status __P((int)); +static void get_component_number __P((int, char *, int *, int *)); static void rf_fail_disk __P((int, char *, int)); static void usage __P((void)); +static void get_component_label __P((int, char *)); +static void set_component_label __P((int, char *)); +static void init_component_labels __P((int, int)); +static void add_hot_spare __P((int, char *)); +static void remove_hot_spare __P((int, char *)); +static void rebuild_in_place __P((int, char *)); int main(argc,argv) @@ -84,53 +96,93 @@ main(argc,argv) char config_filename[PATH_MAX]; char dev_name[PATH_MAX]; char name[PATH_MAX]; - char component_to_fail[PATH_MAX]; + char component[PATH_MAX]; int do_recon; int raidID; int rawpart; int recon_percent_done; - struct stat st; - int fd; + int serial_number; + struct stat st; + int fd; + int force; num_options = 0; action = 0; do_recon = 0; + force = 0; - while ((ch = getopt(argc, argv, "c:Cf:F:rRsu")) != -1) + while ((ch = getopt(argc, argv, "a:Bc:C:f:F:g:iI:l:r:R:sSu")) != -1) switch(ch) { + case 'a': + action = RAIDFRAME_ADD_HOT_SPARE; + strncpy(component, optarg, PATH_MAX); + num_options++; + break; + case 'B': + action = RAIDFRAME_COPYBACK; + num_options++; + break; case 'c': - strncpy(config_filename,optarg,PATH_MAX); action = RAIDFRAME_CONFIGURE; + strncpy(config_filename,optarg,PATH_MAX); + force = 0; num_options++; break; case 'C': - action = RAIDFRAME_COPYBACK; + strncpy(config_filename,optarg,PATH_MAX); + action = RAIDFRAME_CONFIGURE; + force = 1; num_options++; break; case 'f': action = RAIDFRAME_FAIL_DISK; + strncpy(component, optarg, PATH_MAX); do_recon = 0; - strncpy(component_to_fail, optarg, PATH_MAX); num_options++; break; case 'F': action = RAIDFRAME_FAIL_DISK; + strncpy(component, optarg, PATH_MAX); do_recon = 1; - strncpy(component_to_fail, optarg, PATH_MAX); num_options++; break; - case 'r': + case 'g': + action = RAIDFRAME_GET_COMPONENT_LABEL; + strncpy(component, optarg, PATH_MAX); + num_options++; + break; + case 'i': action = RAIDFRAME_REWRITEPARITY; num_options++; break; + case 'I': + action = RAIDFRAME_INIT_LABELS; + serial_number = atoi(optarg); + num_options++; + break; + case 'l': + action = RAIDFRAME_SET_COMPONENT_LABEL; + strncpy(component, optarg, PATH_MAX); + num_options++; + break; + case 'r': + action = RAIDFRAME_REMOVE_HOT_SPARE; + strncpy(component, optarg, PATH_MAX); + num_options++; + break; case 'R': - action = RAIDFRAME_CHECKRECON; + strncpy(component,optarg,PATH_MAX); + action = RAIDFRAME_REBUILD_IN_PLACE; num_options++; break; case 's': action = RAIDFRAME_GET_INFO; num_options++; break; + case 'S': + action = RAIDFRAME_CHECKRECON; + num_options++; + break; case 'u': action = RAIDFRAME_SHUTDOWN; num_options++; @@ -180,15 +232,30 @@ main(argc,argv) switch(action) { + case RAIDFRAME_ADD_HOT_SPARE: + add_hot_spare(fd,component); + break; + case RAIDFRAME_REMOVE_HOT_SPARE: + remove_hot_spare(fd,component); + break; case RAIDFRAME_CONFIGURE: - rf_configure(fd, config_filename); + rf_configure(fd, config_filename, force); break; case RAIDFRAME_COPYBACK: printf("Copyback.\n"); do_ioctl(fd, RAIDFRAME_COPYBACK, NULL, "RAIDFRAME_COPYBACK"); break; case RAIDFRAME_FAIL_DISK: - rf_fail_disk(fd,component_to_fail,do_recon); + rf_fail_disk(fd,component,do_recon); + break; + case RAIDFRAME_SET_COMPONENT_LABEL: + set_component_label(fd,component); + break; + case RAIDFRAME_GET_COMPONENT_LABEL: + get_component_label(fd,component); + break; + case RAIDFRAME_INIT_LABELS: + init_component_labels(fd,serial_number); break; case RAIDFRAME_REWRITEPARITY: printf("Initiating re-write of parity\n"); @@ -204,6 +271,9 @@ main(argc,argv) case RAIDFRAME_GET_INFO: rf_get_device_status(fd); break; + case RAIDFRAME_REBUILD_IN_PLACE: + rebuild_in_place(fd,component); + break; case RAIDFRAME_SHUTDOWN: do_ioctl(fd, RAIDFRAME_SHUTDOWN, NULL, "RAIDFRAME_SHUTDOWN"); break; @@ -230,9 +300,10 @@ do_ioctl(fd, command, arg, ioctl_name) static void -rf_configure(fd,config_file) +rf_configure(fd,config_file,force) int fd; char *config_file; + int force; { void *generic; RF_Config_t cfg; @@ -243,6 +314,8 @@ rf_configure(fd,config_file) exit(1); } + cfg.force = force; + /* Note the extra level of redirection needed here, since @@ -252,13 +325,7 @@ rf_configure(fd,config_file) */ generic = (void *) &cfg; - do_ioctl(fd,RAIDFRAME_CONFIGURE,&generic,"RAIDFRAME_CONFIGURE"); -#if 0 - if (ioctl(fd, RAIDFRAME_CONFIGURE, &generic) < 0) { - warn("ioctl (RAIDFRAME_CONFIGURE): failed\n"); - exit(1); - } -#endif + do_ioctl(fd, RAIDFRAME_CONFIGURE, &generic, "RAIDFRAME_CONFIGURE"); } static char * @@ -316,10 +383,8 @@ rf_get_device_status(fd) if (device_config.nspares > 0) { printf("Spares:\n"); for(i=0; i < device_config.nspares; i++) { - printf("%20s [%d][%d]: %s\n", + printf("%20s: %s\n", device_config.spares[i].devname, - device_config.spares[i].spareRow, - device_config.spares[i].spareCol, device_status(device_config.spares[i].status)); } } else { @@ -329,42 +394,55 @@ rf_get_device_status(fd) } static void -rf_fail_disk(fd, component_to_fail, do_recon) +get_component_number(fd, component_name, component_number, num_columns) int fd; - char *component_to_fail; - int do_recon; + char *component_name; + int *component_number; + int *num_columns; { - struct rf_recon_req recon_request; RF_DeviceConfig_t device_config; void *cfg_ptr; int i; int found; - int component_num; - component_num = -1; + *component_number = -1; /* Assuming a full path spec... */ cfg_ptr = &device_config; do_ioctl(fd, RAIDFRAME_GET_INFO, &cfg_ptr, "RAIDFRAME_GET_INFO"); + + *num_columns = device_config.cols; + found = 0; for(i=0; i < device_config.ndevs; i++) { - if (strncmp(component_to_fail, - device_config.devs[i].devname, + if (strncmp(component_name, device_config.devs[i].devname, PATH_MAX)==0) { found = 1; - component_num = i; + *component_number = i; } } if (!found) { - fprintf(stderr,"%s: %s is not a component %s", - __progname, component_to_fail, - "of this device\n"); + fprintf(stderr,"%s: %s is not a component %s", __progname, + component_name, "of this device\n"); exit(1); } +} - recon_request.row = component_num / device_config.cols; - recon_request.col = component_num % device_config.cols; +static void +rf_fail_disk(fd, component_to_fail, do_recon) + int fd; + char *component_to_fail; + int do_recon; +{ + struct rf_recon_req recon_request; + int component_num; + int num_cols; + + get_component_number(fd, component_to_fail, &component_num, &num_cols); + + recon_request.row = component_num / num_cols; + recon_request.col = component_num % num_cols; if (do_recon) { recon_request.flags = RF_FDFLAGS_RECON; } else { @@ -372,20 +450,170 @@ rf_fail_disk(fd, component_to_fail, do_recon) } do_ioctl(fd, RAIDFRAME_FAIL_DISK, &recon_request, "RAIDFRAME_FAIL_DISK"); +} + +static void +get_component_label(fd, component) + int fd; + char *component; +{ + RF_ComponentLabel_t component_label; + void *label_ptr; + int component_num; + int num_cols; + + get_component_number(fd, component, &component_num, &num_cols); + + memset( &component_label, 0, sizeof(RF_ComponentLabel_t)); + component_label.row = component_num / num_cols; + component_label.column = component_num % num_cols; + + label_ptr = &component_label; + do_ioctl( fd, RAIDFRAME_GET_COMPONENT_LABEL, &label_ptr, + "RAIDFRAME_GET_COMPONENT_LABEL"); + + printf("Component label for %s:\n",component); + printf("Version: %d\n",component_label.version); + printf("Serial Number: %d\n",component_label.serial_number); + printf("Mod counter: %d\n",component_label.mod_counter); + printf("Row: %d\n", component_label.row); + printf("Column: %d\n", component_label.column); + printf("Num Rows: %d\n", component_label.num_rows); + printf("Num Columns: %d\n", component_label.num_columns); + printf("Clean: %d\n", component_label.clean); + printf("Status: %s\n", device_status(component_label.status)); +} + +static void +set_component_label(fd, component) + int fd; + char *component; +{ + RF_ComponentLabel_t component_label; + int component_num; + int num_cols; + + get_component_number(fd, component, &component_num, &num_cols); + + /* XXX This is currently here for testing, and future expandability */ + + component_label.version = 1; + component_label.serial_number = 123456; + component_label.mod_counter = 0; + component_label.row = component_num / num_cols; + component_label.column = component_num % num_cols; + component_label.num_rows = 0; + component_label.num_columns = 5; + component_label.clean = 0; + component_label.status = 1; + + do_ioctl( fd, RAIDFRAME_SET_COMPONENT_LABEL, &component_label, + "RAIDFRAME_SET_COMPONENT_LABEL"); +} + + +static void +init_component_labels(fd, serial_number) + int fd; + int serial_number; +{ + RF_ComponentLabel_t component_label; + + component_label.version = 0; + component_label.serial_number = serial_number; + component_label.mod_counter = 0; + component_label.row = 0; + component_label.column = 0; + component_label.num_rows = 0; + component_label.num_columns = 0; + component_label.clean = 0; + component_label.status = 0; + + do_ioctl( fd, RAIDFRAME_INIT_LABELS, &component_label, + "RAIDFRAME_SET_COMPONENT_LABEL"); +} + +static void +add_hot_spare(fd, component) + int fd; + char *component; +{ + RF_SingleComponent_t hot_spare; + + hot_spare.row = 0; + hot_spare.column = 0; + strncpy(hot_spare.component_name, component, + sizeof(hot_spare.component_name)); + + do_ioctl( fd, RAIDFRAME_ADD_HOT_SPARE, &hot_spare, + "RAIDFRAME_ADD_HOT_SPARE"); +} + +static void +remove_hot_spare(fd, component) + int fd; + char *component; +{ + RF_SingleComponent_t hot_spare; + int component_num; + int num_cols; + + get_component_number(fd, component, &component_num, &num_cols); + + hot_spare.row = component_num / num_cols; + hot_spare.column = component_num % num_cols; + strncpy(hot_spare.component_name, component, + sizeof(hot_spare.component_name)); + + do_ioctl( fd, RAIDFRAME_REMOVE_HOT_SPARE, &hot_spare, + "RAIDFRAME_REMOVE_HOT_SPARE"); } static void +rebuild_in_place( fd, component ) + int fd; + char *component; +{ + RF_SingleComponent_t comp; + int component_num; + int num_cols; + + get_component_number(fd, component, &component_num, &num_cols); + + comp.row = 0; + comp.column = component_num; + strncpy(comp.component_name, component, sizeof(comp.component_name)); + + do_ioctl( fd, RAIDFRAME_REBUILD_IN_PLACE, &comp, + "RAIDFRAME_REBUILD_IN_PLACE"); +} + + +static void usage() { - fprintf(stderr, "usage: %s -c config_file dev\n", __progname); - fprintf(stderr, " %s -C dev\n", __progname); + fprintf(stderr, "usage: %s -a component dev\n", __progname); + fprintf(stderr, " %s -B dev\n", __progname); + fprintf(stderr, " %s -c config_file dev\n", __progname); + fprintf(stderr, " %s -C config_file dev\n", __progname); fprintf(stderr, " %s -f component dev\n", __progname); fprintf(stderr, " %s -F component dev\n", __progname); - fprintf(stderr, " %s -r dev\n", __progname); - fprintf(stderr, " %s -R dev\n", __progname); + fprintf(stderr, " %s -g component dev\n", __progname); + fprintf(stderr, " %s -i dev\n", __progname); + fprintf(stderr, " %s -I serial_number dev\n", __progname); + fprintf(stderr, " %s -r component dev\n", __progname); + fprintf(stderr, " %s -R component dev\n", __progname); fprintf(stderr, " %s -s dev\n", __progname); + fprintf(stderr, " %s -S dev\n", __progname); fprintf(stderr, " %s -u dev\n", __progname); +#if 0 + fprintf(stderr, "usage: %s %s\n", __progname, + "-a | -f | -F | -g | -r | -R component dev"); + fprintf(stderr, " %s -B | -i | -s | -S -u dev\n", __progname); + fprintf(stderr, " %s -c | -C config_file dev\n", __progname); + fprintf(stderr, " %s -I serial_number dev\n", __progname); +#endif exit(1); /* NOTREACHED */ } |