1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-06 13:09:50 +00:00

Change the name of the v flag variable from 'verbose' to 'vflag',

indicating the multiple use (verbose or verify).

initsd: rewrite:
  Initialization is now done in the kernel.

  Verify (again!) if -v is specified.

  Allow specification of a blocksize, the length to be transferred in
  one transfer.

vinum_revive:
  Allow specification of a blocksize, the length to be transferred in
  one transfer.
This commit is contained in:
Greg Lehey 1999-10-13 03:27:06 +00:00
parent 5473959c2b
commit 23528a021d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=52192

View File

@ -36,10 +36,10 @@
* otherwise) arising in any way out of the use of this software, even if
* advised of the possibility of such damage.
*
* $Id: commands.c,v 1.9 1999/10/13 02:33:26 grog Exp grog $
* $FreeBSD$
*/
/* $FreeBSD$ */
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
@ -131,12 +131,12 @@ vinum_create(int argc, char *argv[], char *arg0[])
break;
}
file_line++; /* count the lines */
if (verbose)
if (vflag)
printf("%4d: %s", file_line, buffer);
strcpy(commandline, buffer); /* make a copy */
ioctl(superdev, VINUM_CREATE, buffer);
if (reply->error != 0) { /* error in config */
if (!verbose) /* print this line anyway */
if (!vflag) /* print this line anyway */
printf("%4d: %s", file_line, commandline);
fprintf(stdout, "** %d %s: %s\n",
file_line,
@ -257,7 +257,7 @@ vinum_rm(int argc, char *argv[], char *arg0[])
argv[index],
reply.msg[0] ? reply.msg : strerror(reply.error),
reply.error);
} else if (verbose)
} else if (vflag)
fprintf(stderr, "%s removed\n", argv[index]);
}
}
@ -405,6 +405,14 @@ initplex(int plexno, char *name)
exit(0); /* we've done our dash */
}
/*
* Initialize a subdisk. Currently (October 1999)
* there is something very funny with
* initialization, and it's a good idea to verify.
* We do this twice, once in the kernel and once
* after finishing the initialization. One day
* this should be removed.
*/
void
initsd(int sdno, int dowait)
{
@ -412,13 +420,14 @@ initsd(int sdno, int dowait)
struct _ioctl_reply reply;
struct vinum_ioctl_msg *message = (struct vinum_ioctl_msg *) &reply;
char filename[MAXPATHLEN]; /* create a file name here */
off_t pos;
/* Variables for use by children */
int sdfh; /* and for subdisk */
char zeros[PLEXINITSIZE];
int count; /* write count */
long long offset; /* offset in subdisk */
char buf[MAXPLEXINITSIZE];
int initsize; /* actual size to write */
long long sdsize; /* size of subdisk */
int retval;
if (dowait == 0) {
pid = fork(); /* into the background with you */
@ -429,8 +438,13 @@ initsd(int sdno, int dowait)
return;
}
}
if (SSize != 0) { /* specified a size for init */
if (SSize < 512)
SSize <<= DEV_BSHIFT;
initsize = min(SSize, MAXPLEXINITSIZE);
} else
initsize = PLEXINITSIZE;
openlog("vinum", LOG_CONS | LOG_PERROR | LOG_PID, LOG_KERN);
bzero(zeros, sizeof(zeros));
get_sd_info(&sd, sdno);
sdsize = sd.sectors * DEV_BSIZE; /* size of subdisk in bytes */
sprintf(filename, VINUM_DIR "/rsd/%s", sd.name);
@ -447,27 +461,66 @@ initsd(int sdno, int dowait)
message->index = sd.sdno; /* pass object number */
message->type = sd_object; /* and type of object */
message->state = object_initializing;
message->verify = vflag; /* verify what we write? */
message->force = 1; /* insist */
ioctl(superdev, VINUM_SETSTATE, message);
for (offset = 0; offset < sdsize; offset += count) {
count = write(sdfh, zeros, PLEXINITSIZE); /* write a block */
if (count < 0) {
if ((SSize > 0) /* specified a size for init */
&&(SSize < 512))
SSize <<= DEV_BSHIFT;
if (reply.error) {
fprintf(stderr, "Can't initialize %s: %s (%d)\n",
filename,
strerror(reply.error),
reply.error);
exit(1);
} else {
do {
message->index = sd.sdno; /* pass object number */
message->type = sd_object; /* and type of object */
message->state = object_up;
message->verify = vflag; /* verify what we write? */
message->blocksize = SSize;
ioctl(superdev, VINUM_SETSTATE, message);
}
while (reply.error == EAGAIN); /* until we're done */
}
if (vflag) { /* don't trust the thing, check again */
close(sdfh);
pos = 0;
if ((sdfh = open(filename, O_RDWR, S_IRWXU)) < 0) { /* no go */
syslog(LOG_ERR | LOG_KERN,
"can't write subdisk %s: %s",
"can't open subdisk %s: %s",
filename,
strerror(errno));
exit(1);
} else if (count == 0)
break;
} else {
for (;;) { /* damn style(9) */
retval = read(sdfh, buf, initsize);
if (retval == 0) /* EOF */
break;
else if (retval < 0) {
fprintf(stderr,
"Can't read %s: %s (%d)\n",
sd.name,
strerror(errno),
errno);
if (dowait)
return;
else
exit(1);
} else if ((buf[0] != 0) /* first word spammed */
||(bcmp(buf, &buf[1], initsize - 1))) { /* or one of the others */
fprintf(stderr,
"init error on %s, offset 0x%llx sectors\n",
sd.name,
pos);
}
pos += retval;
}
}
}
syslog(LOG_INFO | LOG_KERN, "subdisk %s initialized", filename);
/* Bring the subdisk up */
message->index = sd.sdno; /* pass object number */
message->type = sd_object; /* and type of object */
message->state = object_initialized;
message->force = 0; /* don't insist */
ioctl(superdev, VINUM_SETSTATE, message);
exit(0);
if (!dowait)
exit(0);
}
void
@ -486,6 +539,7 @@ vinum_start(int argc, char *argv[], char *arg0[])
char **token; /* list of tokens */
int tokens; /* and their number */
bzero(&statinfo, sizeof(struct statinfo));
statinfo.dinfo = malloc(devs * sizeof(struct statinfo));
namelist = malloc(devs * (DEVSTAT_NAME_LEN + 8));
token = malloc((devs + 1) * sizeof(char *));
@ -559,6 +613,19 @@ vinum_start(int argc, char *argv[], char *arg0[])
message->type = sd_object; /* it's a subdisk */
message->state = object_up;
message->force = force; /* don't force it, use a larger hammer */
/*
* We don't do any checking here.
* The kernel module has a better
* understanding of these things,
* let it do it.
*/
if (SSize != 0) { /* specified a size for init */
if (SSize < 512)
SSize <<= DEV_BSHIFT;
message->blocksize = SSize;
} else
message->blocksize = 0;
ioctl(superdev, VINUM_SETSTATE, message);
if (reply.error != 0) {
if (reply.error == EAGAIN) /* we're reviving */
@ -1286,7 +1353,7 @@ create_drive(char *devicename)
char command[MAXDRIVENAME * 2];
sprintf(command, "drive %s device %s", drivename, devicename); /* create a create command */
if (verbose)
if (vflag)
printf("drive %s device %s\n", drivename, devicename); /* create a create command */
ioctl(superdev, VINUM_CREATE, command);
reply = (struct _ioctl_reply *) &command;
@ -1339,7 +1406,7 @@ vinum_concat(int argc, char *argv[], char *argv0[])
if (!objectname) /* we need a name for our object */
genvolname();
sprintf(buffer, "volume %s", objectname);
if (verbose)
if (vflag)
printf("volume %s\n", objectname);
ioctl(superdev, VINUM_CREATE, buffer); /* create the volume */
if (reply->error != 0) { /* error in config */
@ -1357,7 +1424,7 @@ vinum_concat(int argc, char *argv[], char *argv0[])
longjmp(command_fail, -1); /* give up */
}
sprintf(buffer, "plex name %s.p0 org concat", objectname);
if (verbose)
if (vflag)
printf(" plex name %s.p0 org concat\n", objectname);
ioctl(superdev, VINUM_CREATE, buffer);
if (reply->error != 0) { /* error in config */
@ -1378,7 +1445,7 @@ vinum_concat(int argc, char *argv[], char *argv0[])
if ((drive = find_drive_by_devname(argv[o])) == NULL) /* doesn't exist */
drive = create_drive(argv[o]); /* create it */
sprintf(buffer, "sd name %s.p0.s%d drive %s size 0", objectname, o, drive->label.name);
if (verbose)
if (vflag)
printf(" sd name %s.p0.s%d drive %s size 0\n", objectname, o, drive->label.name);
ioctl(superdev, VINUM_CREATE, buffer);
if (reply->error != 0) { /* error in config */
@ -1406,8 +1473,8 @@ vinum_concat(int argc, char *argv[], char *argv0[])
perror("Can't save Vinum config");
find_object(objectname, &type); /* find the index of the volume */
make_vol_dev(vol.volno, 1); /* and create the devices */
if (verbose) {
verbose--; /* XXX don't give too much detail */
if (vflag) {
vflag--; /* XXX don't give too much detail */
find_object(objectname, &type); /* point to the volume */
vinum_lvi(vol.volno, 1); /* and print info about it */
}
@ -1475,7 +1542,7 @@ vinum_stripe(int argc, char *argv[], char *argv0[])
/* Now create the volume */
sprintf(buffer, "volume %s", objectname);
if (verbose)
if (vflag)
printf("volume %s\n", objectname);
ioctl(superdev, VINUM_CREATE, buffer); /* create the volume */
if (reply->error != 0) { /* error in config */
@ -1493,7 +1560,7 @@ vinum_stripe(int argc, char *argv[], char *argv0[])
longjmp(command_fail, -1); /* give up */
}
sprintf(buffer, "plex name %s.p0 org striped 256k", objectname);
if (verbose)
if (vflag)
printf(" plex name %s.p0 org striped 256k\n", objectname);
ioctl(superdev, VINUM_CREATE, buffer);
if (reply->error != 0) { /* error in config */
@ -1518,7 +1585,7 @@ vinum_stripe(int argc, char *argv[], char *argv0[])
o,
drive->label.name,
maxsize);
if (verbose)
if (vflag)
printf(" sd name %s.p0.s%d drive %s size %lldb\n",
objectname,
o,
@ -1550,8 +1617,8 @@ vinum_stripe(int argc, char *argv[], char *argv0[])
perror("Can't save Vinum config");
find_object(objectname, &type); /* find the index of the volume */
make_vol_dev(vol.volno, 1); /* and create the devices */
if (verbose) {
verbose--; /* XXX don't give too much detail */
if (vflag) {
vflag--; /* XXX don't give too much detail */
find_object(objectname, &type); /* point to the volume */
vinum_lvi(vol.volno, 1); /* and print info about it */
}
@ -1635,7 +1702,7 @@ vinum_mirror(int argc, char *argv[], char *argv0[])
/* Now create the volume */
sprintf(buffer, "volume %s setupstate", objectname);
if (verbose)
if (vflag)
printf("volume %s setupstate\n", objectname);
ioctl(superdev, VINUM_CREATE, buffer); /* create the volume */
if (reply->error != 0) { /* error in config */
@ -1655,11 +1722,11 @@ vinum_mirror(int argc, char *argv[], char *argv0[])
for (p = 0; p < 2; p++) { /* create each plex */
if (sflag) {
sprintf(buffer, "plex name %s.p%d org striped 256k", objectname, p);
if (verbose)
if (vflag)
printf(" plex name %s.p%d org striped 256k\n", objectname, p);
} else { /* concat */
sprintf(buffer, "plex name %s.p%d org concat", objectname, p);
if (verbose)
if (vflag)
printf(" plex name %s.p%d org concat\n", objectname, p);
}
ioctl(superdev, VINUM_CREATE, buffer);
@ -1689,7 +1756,7 @@ vinum_mirror(int argc, char *argv[], char *argv0[])
o >> 1,
drive->label.name,
maxsize[p]);
if (verbose)
if (vflag)
printf(" sd name %s.p%d.s%d drive %s size %lldb\n",
objectname,
p,
@ -1725,8 +1792,8 @@ vinum_mirror(int argc, char *argv[], char *argv0[])
perror("Can't save Vinum config");
find_object(objectname, &type); /* find the index of the volume */
make_vol_dev(vol.volno, 1); /* and create the devices */
if (verbose) {
verbose--; /* XXX don't give too much detail */
if (vflag) {
vflag--; /* XXX don't give too much detail */
sflag = 0; /* no stats, please */
find_object(objectname, &type); /* point to the volume */
vinum_lvi(vol.volno, 1); /* and print info about it */
@ -1770,7 +1837,7 @@ vinum_readpol(int argc, char *argv[], char *argv0[])
message->otherobject = plexno;
if (ioctl(superdev, VINUM_READPOL, message) < 0)
fprintf(stderr, "Can't set read policy: %s (%d)\n", strerror(errno), errno);
if (verbose)
if (vflag)
vinum_lpi(plexno, recurse);
}
@ -1879,7 +1946,7 @@ vinum_checkparity(int argc, char *argv[], char *argv0[])
message->index = object; /* pass object number */
message->type = type; /* and type of object */
ioctl(superdev, VINUM_CHECKPARITY, message);
if (verbose) {
if (vflag) {
get_plex_info(&plex, object);
if (plex.checkblock != 0)
printf("\rChecking at %s ", roughlength(plex.checkblock << DEV_BSHIFT, 1));
@ -1894,7 +1961,7 @@ vinum_checkparity(int argc, char *argv[], char *argv0[])
fprintf(stderr,
"checkparity failed: %s\n",
strerror(reply.error));
} else if (verbose)
} else if (vflag)
fprintf(stderr, "%s has correct parity\n", argv[index]);
}
}