svn commit: r191308 - head/sys/dev/sound/pci

Stanislav Sedov stas at FreeBSD.org
Mon Apr 20 12:43:09 UTC 2009


Author: stas
Date: Mon Apr 20 12:43:07 2009
New Revision: 191308
URL: http://svn.freebsd.org/changeset/base/191308

Log:
  - Properly unlock mutex on failure in channel_trigger. Before this
    the function just returned with the mutex held.
  
  MFC after:	1 week

Modified:
  head/sys/dev/sound/pci/envy24.c

Modified: head/sys/dev/sound/pci/envy24.c
==============================================================================
--- head/sys/dev/sound/pci/envy24.c	Mon Apr 20 12:40:28 2009	(r191307)
+++ head/sys/dev/sound/pci/envy24.c	Mon Apr 20 12:43:07 2009	(r191308)
@@ -1766,6 +1766,7 @@ envy24chan_trigger(kobj_t obj, void *dat
 	struct sc_info *sc = ch->parent;
 	u_int32_t ptr;
 	int slot;
+	int error = 0;
 #if 0
 	int i;
 
@@ -1787,8 +1788,10 @@ envy24chan_trigger(kobj_t obj, void *dat
 			sc->caps[0].minspeed = sc->caps[0].maxspeed = sc->speed;
 			sc->caps[1].minspeed = sc->caps[1].maxspeed = sc->speed;
 		}
-		else if (ch->speed != 0 && ch->speed != sc->speed)
-			return -1;
+		else if (ch->speed != 0 && ch->speed != sc->speed) {
+			error = -1;
+			goto fail;
+		}
 		if (ch->speed == 0)
 			ch->channel->speed = sc->speed;
 		/* start or enable channel */
@@ -1818,16 +1821,20 @@ envy24chan_trigger(kobj_t obj, void *dat
 #if(0)
 		device_printf(sc->dev, "envy24chan_trigger(): emldmawr\n");
 #endif
-		if (ch->run != 1)
-			return -1;
+		if (ch->run != 1) {
+			error = -1;
+			goto fail;
+		}
 		ch->emldma(ch);
 		break;
 	case PCMTRIG_EMLDMARD:
 #if(0)
 		device_printf(sc->dev, "envy24chan_trigger(): emldmard\n");
 #endif
-		if (ch->run != 1)
-			return -1;
+		if (ch->run != 1) {
+			error = -1;
+			goto fail;
+		}
 		ch->emldma(ch);
 		break;
 	case PCMTRIG_ABORT:
@@ -1859,9 +1866,9 @@ envy24chan_trigger(kobj_t obj, void *dat
 		}
 		break;
 	}
+fail:
 	snd_mtxunlock(sc->lock);
-
-	return 0;
+	return (error);
 }
 
 static int


More information about the svn-src-head mailing list