svn commit: r199007 - head/sys/fs/fifofs
Attilio Rao
attilio at FreeBSD.org
Fri Nov 6 22:29:47 UTC 2009
Author: attilio
Date: Fri Nov 6 22:29:46 2009
New Revision: 199007
URL: http://svn.freebsd.org/changeset/base/199007
Log:
- Improve comments about locking of the "struct fifoinfo" which is a bit
unclear.
- Fix a memory leak [0]
[0] Diagnosed by: Dorr H. Clark <dclark at engr dot scu dot edu>
MFC: 1 week
Modified:
head/sys/fs/fifofs/fifo_vnops.c
Modified: head/sys/fs/fifofs/fifo_vnops.c
==============================================================================
--- head/sys/fs/fifofs/fifo_vnops.c Fri Nov 6 22:13:39 2009 (r199006)
+++ head/sys/fs/fifofs/fifo_vnops.c Fri Nov 6 22:29:46 2009 (r199007)
@@ -78,6 +78,10 @@ struct fileops fifo_ops_f = {
/*
* This structure is associated with the FIFO vnode and stores
* the state associated with the FIFO.
+ * Notes about locking:
+ * - fi_readsock and fi_writesock are invariant since init time.
+ * - fi_readers and fi_writers are vnode lock protected.
+ * - fi_wgen is fif_mtx lock protected.
*/
struct fifoinfo {
struct socket *fi_readsock;
@@ -223,14 +227,9 @@ fail1:
}
/*
- * General access to fi_readers and fi_writers is protected using
- * the vnode lock.
- *
- * Protect the increment of fi_readers and fi_writers and the
- * associated calls to wakeup() with the fifo mutex in addition
- * to the vnode lock. This allows the vnode lock to be dropped
- * for the msleep() calls below, and using the fifo mutex with
- * msleep() prevents the wakeup from being missed.
+ * Use the fifo_mtx lock here, in addition to the vnode lock,
+ * in order to allow vnode lock dropping before msleep() calls
+ * and still avoiding missed wakeups.
*/
mtx_lock(&fifo_mtx);
if (ap->a_mode & FREAD) {
@@ -249,6 +248,8 @@ fail1:
if (ap->a_mode & FWRITE) {
if ((ap->a_mode & O_NONBLOCK) && fip->fi_readers == 0) {
mtx_unlock(&fifo_mtx);
+ if (fip->fi_writers == 0)
+ fifo_cleanup(vp);
return (ENXIO);
}
fip->fi_writers++;
More information about the svn-src-head
mailing list