start plex/subdisk:

Add -i option to delay between blocks copied, to reduce performance
   impact.

   Remove -v option, things work now.

Rewrite parity maintenance functions.

Rebuildparity: Add -v option to check whether it was broken before
rebuilding each block.
This commit is contained in:
Greg Lehey 2000-05-11 07:29:09 +00:00
parent de8ac2cfda
commit a744e0d33d

View File

@ -36,7 +36,7 @@
* 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.10 2000/01/03 04:31:58 grog Exp grog $
* $Id: commands.c,v 1.12 2000/03/01 03:03:53 grog Exp grog $
* $FreeBSD$
*/
@ -412,14 +412,7 @@ 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.
*/
/* Initialize a subdisk. */
void
initsd(int sdno, int dowait)
{
@ -427,14 +420,11 @@ 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 buf[MAXPLEXINITSIZE];
int initsize; /* actual size to write */
int64_t sdsize; /* size of subdisk */
int retval;
if (dowait == 0) {
pid = fork(); /* into the background with you */
@ -483,6 +473,8 @@ initsd(int sdno, int dowait)
exit(1);
} else {
do {
if (interval) /* pause between copies */
usleep(interval * 1000);
message->index = sd.sdno; /* pass object number */
message->type = sd_object; /* and type of object */
message->state = object_up;
@ -508,41 +500,7 @@ initsd(int sdno, int dowait)
ioctl(superdev, VINUM_SETSTATE, message);
}
}
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 open subdisk %s: %s",
filename,
strerror(errno));
exit(1);
} 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;
}
}
}
printf("subdisk %s initialized\n", filename);
if (!dowait)
exit(0);
}
@ -2408,9 +2366,16 @@ vinum_rebuildparity(int argc, char *argv[], char *argv0[])
if (argc == 0) /* no parameters? */
fprintf(stderr, "Usage: rebuildparity object [object...]\n");
else
parityops(argc, argv, rebuildparity);
parityops(argc, argv, vflag ? rebuildandcheckparity : rebuildparity);
}
/*
* Common code for rebuildparity and checkparity.
* We bend the meanings of some flags here:
*
* -v: Report incorrect parity on rebuild.
* -f: Start from beginning of the plex.
*/
void
parityops(int argc, char *argv[], enum parityop op)
{
@ -2421,6 +2386,7 @@ parityops(int argc, char *argv[], enum parityop op)
int index;
enum objecttype type;
char *msg;
off_t block;
if (op == checkparity)
msg = "Checking";
@ -2438,16 +2404,24 @@ parityops(int argc, char *argv[], enum parityop op)
do {
message->index = object; /* pass object number */
message->type = type; /* and type of object */
if (op == checkparity)
ioctl(superdev, VINUM_CHECKPARITY, message);
message->op = op; /* what to do */
if (force)
message->offset = 0; /* start at the beginning */
else
ioctl(superdev, VINUM_REBUILDPARITY, message);
if (vflag) {
get_plex_info(&plex, object);
if (plex.checkblock != 0)
printf("\r%s at %s ",
message->offset = plex.checkblock; /* continue where we left off */
force = 0; /* don't reset after the first time */
ioctl(superdev, VINUM_PARITYOP, message);
get_plex_info(&plex, object);
if (Verbose) {
block = (plex.checkblock << DEV_BSHIFT) * (plex.subdisks - 1);
if (block != 0)
printf("\r%s at %s (%d%%) ",
msg,
roughlength(plex.checkblock << DEV_BSHIFT, 1));
roughlength(block, 1),
((int) (block * 100 / plex.length) >> DEV_BSHIFT));
if ((reply.error == EAGAIN)
&& (reply.msg[0])) /* got a comment back */
fputs(reply.msg, stderr); /* show it */
fflush(stdout);
}
}
@ -2460,7 +2434,7 @@ parityops(int argc, char *argv[], enum parityop op)
"%s failed: %s\n",
msg,
strerror(reply.error));
} else if (vflag) {
} else if (Verbose) {
if (op == checkparity)
fprintf(stderr, "%s has correct parity\n", argv[index]);
else