svn commit: r199682 - stable/7/sys/fs/fifofs
Attilio Rao
attilio at FreeBSD.org
Sun Nov 22 23:46:44 UTC 2009
Author: attilio
Date: Sun Nov 22 23:46:44 2009
New Revision: 199682
URL: http://svn.freebsd.org/changeset/base/199682
Log:
MFC r199007:
Fix a memory leak.
Modified:
stable/7/sys/fs/fifofs/fifo_vnops.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/fs/fifofs/fifo_vnops.c
==============================================================================
--- stable/7/sys/fs/fifofs/fifo_vnops.c Sun Nov 22 21:58:06 2009 (r199681)
+++ stable/7/sys/fs/fifofs/fifo_vnops.c Sun Nov 22 23:46:44 2009 (r199682)
@@ -76,6 +76,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;
@@ -210,14 +214,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) {
@@ -235,6 +234,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-all
mailing list