PERFORCE change 85342 for review
soc-chenk
soc-chenk at FreeBSD.org
Sat Oct 15 08:46:08 PDT 2005
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
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;
More information about the p4-projects
mailing list