PERFORCE change 85342 for review
John Baldwin
jhb at freebsd.org
Mon Oct 17 12:53:22 PDT 2005
On Saturday 15 October 2005 11:46 am, soc-chenk wrote:
> http://perforce.freebsd.org/chv.cgi?CH=85342
>
> Change 85342 by soc-chenk at soc-chenk_leavemealone on 2005/10/15 15:45:35
>
> device read converted to use msleep instead of condvar
> [this seems to prevent daemon-segfaults-in-readdir panics]
> Submitted by: soc-chenk
Considering that cv_foo and msleep are both just slim wrappers around
sleepq_*(), I can't see how this diff would make any difference, unless
adding the 'goto again;' is what fixed the bug, in which case you could have
kept the cv(9) usage.
>
> Affected files ...
>
> .. //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.c#18 edit
> .. //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.h#9 edit
>
> Differences ...
>
> ==== //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.c#18 (text+ko)
> ====
>
> @@ -478,7 +478,6 @@
>
> /* Setting up fields of mine */
> mtx_init(&data->msg_mtx, "mutex for fuse message list", NULL, MTX_DEF);
> - cv_init(&data->msg_cv, "cv to wake up fusedev_read");
> STAILQ_INIT(&data->fmsg_head);
> mtx_init(&data->ticket_mtx, "mutex for the fuse ticketer", NULL,
> MTX_DEF);
> @@ -503,7 +502,6 @@
>
> /* Driving off stage all that stuff thrown at device... */
> mtx_destroy(&data->msg_mtx);
> - cv_destroy(&data->msg_cv);
> mtx_destroy(&data->callback_mtx);
> mtx_destroy(&data->ticket_mtx);
>
> @@ -526,7 +524,7 @@
> DEBUG2G("banning daemon\n");
> mtx_lock(&data->msg_mtx);
> data->dataflag |= FDAT_KICK;
> - cv_signal(&data->msg_cv);
> + wakeup_one(data);
> mtx_unlock(&data->msg_mtx);
> }
>
> @@ -693,7 +691,7 @@
> mtx_lock(&tick->data->msg_mtx);
> fuse_msgn_push(&tick->msgn);
> DEBUG("ring the bell\n");
> - cv_signal(&tick->data->msg_cv);
> + wakeup_one(tick->data);
> mtx_unlock(&tick->data->msg_mtx);
> }
>
> @@ -1077,6 +1075,7 @@
> fuprintf("fuse device being read on thread %d\n", uio->uio_td->td_tid);
>
> mtx_lock(&data->msg_mtx);
> +again:
> if (fdata_kick_get(data)) {
> DEBUG("we know early on that reader should be kicked so we don't wait
> for news\n"); mtx_unlock(&data->msg_mtx);
> @@ -1084,13 +1083,23 @@
> }
>
> if ( ! (fmsgn = fdata_pop_msg(data))) {
> - err = cv_wait_sig(&data->msg_cv, &data->msg_mtx);
> + err = msleep(data, &data->msg_mtx, PCATCH, "fu msg", 0);
> if (err != 0) {
> mtx_unlock(&data->msg_mtx);
> return (fdata_kick_get(data) ? ENODEV : err);
> }
> fmsgn = fdata_pop_msg(data);
> }
> + if (! fmsgn) {
> + /*
> + * We can get here if fuse daemon suddenly terminates,
> + * eg, by being hit by a SIGKILL
> + * -- and some other cases, too, tho not totally clear, when
> + * (cv_signal/wakeup_one signals the whole process ?)
> + */
> + DEBUG("no message on thread #%d\n", uio->uio_td->td_tid);
> + goto again;
> + }
> mtx_unlock(&data->msg_mtx);
>
> if (fdata_kick_get(data)) {
> @@ -1105,16 +1114,6 @@
> }
> return (ENODEV); /* This should make the daemon get off of us */
> }
> - if (! fmsgn) {
> - /*
> - * We can get here if fuse daemon suddenly terminates,
> - * eg, by being hit by a SIGKILL
> - * -- and some other cases, too, tho not totally clear, when
> - * (cv_signal signals the whole process ?)
> - */
> - DEBUG("no message on thread #%d\n", uio->uio_td->td_tid);
> - return (EINTR);
> - }
> DEBUG("message got on thread #%d\n", uio->uio_td->td_tid);
>
> KASSERT(fmsgn->msg_bufdata || fmsgn->msg_bufsize == 0,
>
> ==== //depot/projects/soc2005/fuse4bsd2/fuse_module/fuse.h#9 (text+ko) ====
>
> @@ -90,7 +90,6 @@
>
> struct fuse_data {
> struct mtx msg_mtx;
> - struct cv msg_cv;
> STAILQ_HEAD(, fuse_msg_node) fmsg_head;
>
> struct mtx callback_mtx;
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the p4-projects
mailing list