change printf() calls to log() calls.
Don't save config while we're reading it from disk. Change the way we handle the daemon: if we can't communicate with it for 1 second (which is possible), start a new one. The daemon saves its pid in daemonpid; on each iteration of the main loop the daemon checks whether it's still in favour. If not, it silently exits. Also, when trying to communicate with the daemon, check daemonpid first. If it's set to 0, don't even try.
This commit is contained in:
parent
a0a8b3768e
commit
e0e19a088b
@ -34,7 +34,7 @@
|
||||
* otherwise) arising in any way out of the use of this software, even if
|
||||
* advised of the possibility of such damage.
|
||||
*
|
||||
* $Id: vinumdaemon.c,v 1.1.2.3 1999/02/11 05:28:41 grog Exp $
|
||||
* $Id: vinumdaemon.c,v 1.3 1999/01/18 04:32:50 grog Exp grog $
|
||||
*/
|
||||
|
||||
#define REALLYKERNEL
|
||||
@ -72,7 +72,7 @@ vinum_daemon(void)
|
||||
*/
|
||||
if (curproc->p_pid != daemonpid) { /* we've been ousted in our sleep */
|
||||
if (daemon_options & daemon_verbose)
|
||||
printf("vinumd: abdicating\n");
|
||||
log(LOG_INFO, "vinumd: abdicating\n");
|
||||
return;
|
||||
}
|
||||
while (daemonq != NULL) { /* we have work to do, */
|
||||
@ -92,7 +92,8 @@ vinum_daemon(void)
|
||||
if (daemon_options & daemon_verbose) {
|
||||
struct request *rq = request->info.rq;
|
||||
|
||||
printf("vinumd: recovering I/O request: %x\n%s dev 0x%x, offset 0x%x, length %ld\n",
|
||||
log(LOG_WARNING,
|
||||
"vinumd: recovering I/O request: %x\n%s dev 0x%x, offset 0x%x, length %ld\n",
|
||||
(u_int) rq,
|
||||
rq->bp->b_flags & B_READ ? "Read" : "Write",
|
||||
rq->bp->b_dev,
|
||||
@ -110,9 +111,18 @@ vinum_daemon(void)
|
||||
case daemonrq_saveconfig:
|
||||
if ((daemonq == NULL) /* no more requests */
|
||||
||(daemonq->type != daemonrq_saveconfig)) { /* or the next isn't the same */
|
||||
if ((daemon_options & daemon_noupdate) == 0) { /* we can do it */
|
||||
if (((daemon_options & daemon_noupdate) == 0) /* we're allowed to do it */
|
||||
&&((vinum_conf.flags & VF_READING_CONFIG) == 0)) { /* and we're not building the config now */
|
||||
/*
|
||||
* We obviously don't want to save a
|
||||
* partial configuration. Less obviously,
|
||||
* we don't need to do anything if we're
|
||||
* asked to write the config when we're
|
||||
* building it up, because we save it at
|
||||
* the end.
|
||||
*/
|
||||
if (daemon_options & daemon_verbose)
|
||||
printf("vinumd: saving config\n");
|
||||
log(LOG_INFO, "vinumd: saving config\n");
|
||||
daemon_save_config(); /* save it */
|
||||
}
|
||||
}
|
||||
@ -120,14 +130,13 @@ vinum_daemon(void)
|
||||
|
||||
case daemonrq_return: /* been told to stop */
|
||||
if (daemon_options & daemon_verbose)
|
||||
printf("vinumd: stopping\n");
|
||||
log(LOG_INFO, "vinumd: stopping\n");
|
||||
daemon_options |= daemon_stopped; /* note that we've stopped */
|
||||
wakeup(vinum_daemon); /* in case somebody's waiting for us to stop */
|
||||
return;
|
||||
|
||||
case daemonrq_ping: /* tell the caller we're here */
|
||||
if (daemon_options & daemon_verbose)
|
||||
printf("vinumd: ping reply\n");
|
||||
log(LOG_INFO, "vinumd: ping reply\n");
|
||||
wakeup(&vinum_finddaemon); /* wake up the caller */
|
||||
break;
|
||||
|
||||
@ -136,7 +145,7 @@ vinum_daemon(void)
|
||||
case daemonrq_revive: /* revive a subdisk */
|
||||
/* XXX */
|
||||
default:
|
||||
printf("Invalid request\n");
|
||||
log(LOG_WARNING, "Invalid request\n");
|
||||
break;
|
||||
}
|
||||
Free(request);
|
||||
@ -198,17 +207,14 @@ vinum_finddaemon()
|
||||
{
|
||||
int result;
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 2; i++) { /* try twice */
|
||||
if (daemonpid != 0) { /* we think we have a daemon, */
|
||||
queue_daemon_request(daemonrq_ping, NULL); /* queue a ping */
|
||||
do
|
||||
result = tsleep(&vinum_finddaemon, PUSER, "recolte", 20 * hz);
|
||||
while (result == ERESTART); /* let it finish */
|
||||
result = tsleep(&vinum_finddaemon, PUSER, "reap", 2 * hz);
|
||||
if (result == 0) /* yup, the daemon's up and running */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (result) /* will be EWOULDBLOCK or EINTR */
|
||||
vinum_daemon(); /* start the daemon */
|
||||
/* no daemon, or we couldn't talk to it: start it */
|
||||
vinum_daemon(); /* start the daemon */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user