From e0e19a088b5f0e92341b30f39f56ce92c2c1fa1a Mon Sep 17 00:00:00 2001 From: Greg Lehey Date: Tue, 2 Mar 1999 06:53:15 +0000 Subject: [PATCH] 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. --- sys/dev/vinum/vinumdaemon.c | 42 +++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/sys/dev/vinum/vinumdaemon.c b/sys/dev/vinum/vinumdaemon.c index 78987b100a8..eb11b7b341c 100644 --- a/sys/dev/vinum/vinumdaemon.c +++ b/sys/dev/vinum/vinumdaemon.c @@ -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; }