[dahdi-commits] sruffell: branch linux/sruffell/chan_list_refactoring r9288 - /linux/team/sru...

SVN commits to the DAHDI project dahdi-commits at lists.digium.com
Thu Sep 2 12:41:34 CDT 2010


Author: sruffell
Date: Thu Sep  2 12:41:23 2010
New Revision: 9288

URL: http://svnview.digium.com/svn/dahdi?view=rev&rev=9288
Log:
dahdi: put chans access behind accessors (part 1: the easy ones)

VALID_CHANNEL macro is no longer used.  This represents all the easy places.
The chans array is still accessed directly by the registration and
unregistration functions, and in the "hot" path of process_masterspan,
__dahdi_process_getaudio_chunk, and __dahdi_process_putaudio_chunk.

Modified:
    linux/team/sruffell/chan_list_refactoring/drivers/dahdi/dahdi-base.c

Modified: linux/team/sruffell/chan_list_refactoring/drivers/dahdi/dahdi-base.c
URL: http://svnview.digium.com/svn/dahdi/linux/team/sruffell/chan_list_refactoring/drivers/dahdi/dahdi-base.c?view=diff&rev=9288&r1=9287&r2=9288
==============================================================================
--- linux/team/sruffell/chan_list_refactoring/drivers/dahdi/dahdi-base.c (original)
+++ linux/team/sruffell/chan_list_refactoring/drivers/dahdi/dahdi-base.c Thu Sep  2 12:41:23 2010
@@ -416,23 +416,21 @@
 			false : true;
 }
 
-#define VALID_CHANNEL(j) do { \
-	if (!valid_channo(j)) \
-		return -EINVAL; \
-	if (!chans[j]) \
-		return -ENXIO; \
-} while(0)
-
 /* Protected by chan_lock. */
 static struct dahdi_span *spans[DAHDI_MAX_SPANS];
 static struct dahdi_chan *chans[DAHDI_MAX_CHANNELS];
 
 static int maxspans = 0;
 
-static struct dahdi_chan *chan_from_file(struct file *file)
-{
-	return (file->private_data) ? file->private_data :
-			((valid_channo(UNIT(file))) ? chans[UNIT(file)] : NULL);
+static inline struct dahdi_chan *chan_from_num(unsigned int channo)
+{
+	return valid_channo(channo) ? chans[channo] : NULL;
+}
+
+static inline struct dahdi_chan *chan_from_file(struct file *file)
+{
+	return (file->private_data) ?
+			file->private_data : chan_from_num(UNIT(file));
 }
 
 static struct dahdi_span *find_span(int spanno)
@@ -942,7 +940,7 @@
 		return;
 
 	for (y = 0; y < maxchans; y++) {
-		struct dahdi_chan *const chan = chans[y];
+		struct dahdi_chan *const chan = chan_from_num(y);
 		const int confmode = chan->confmode & DAHDI_CONF_MODE_MASK;
 		if (chan && (chan->confna == x) &&
 		    (confmode == DAHDI_CONF_CONF ||
@@ -2090,7 +2088,7 @@
 #endif
 	maxchans = 0;
 	for (x = 1; x < DAHDI_MAX_CHANNELS; x++) {
-		struct dahdi_chan *const pos = chans[x];
+		struct dahdi_chan *const pos = chan_from_num(x);
 		if (!pos)
 			continue;
 		maxchans = x + 1;
@@ -3692,14 +3690,8 @@
 		res = -EFAULT;
 		goto cleanup;
 	}
-	if (!gain->chan) {
-		chan = chan_from_file(file);
-	} else {
-		if (valid_channo(gain->chan))
-			chan = chans[gain->chan];
-		else
-			chan = NULL;
-	}
+	chan = (!gain->chan) ? chan_from_file(file) :
+			       chan_from_num(gain->chan);
 	if (chan) {
 		res = -EINVAL;
 		goto cleanup;
@@ -3744,15 +3736,8 @@
 		goto cleanup;
 	}
 
-	if (!gain->chan) {
-		chan = chan_from_file(file);
-	} else {
-		if (valid_channo(gain->chan))
-			chan = chans[gain->chan];
-		else
-			chan = NULL;
-	}
-
+	chan = (!gain->chan) ? chan_from_file(file) :
+			       chan_from_num(gain->chan);
 	if (!chan) {
 		res = -EINVAL;
 		goto cleanup;
@@ -3822,8 +3807,7 @@
 	/* get channel number from user */
 	get_user(channo, (int __user *)data);
 
-	VALID_CHANNEL(channo);
-	chan = chans[channo];
+	chan = chan_from_num(channo);
 	if (!chan)
 		return -EINVAL;
 
@@ -3898,13 +3882,9 @@
 
 	/* Pick the right channo's */
 	chan = chan_from_file(file);
-	if (!param.channo || chan) {
-		param.channo = chan->channo;
-	} else {
-		/* Check validity of channel */
-		VALID_CHANNEL(param.channo);
-		chan = chans[param.channo];
-	}
+	if (!chan)
+		chan = chan_from_num(param.channo);
+
 	if (!chan)
 		return -EINVAL;
 
@@ -3998,13 +3978,8 @@
 
 	/* Pick the right channo's */
 	chan = chan_from_file(file);
-	if (!param.channo || chan) {
-		param.channo = chan->channo;
-	} else {
-		/* Check validity of channel */
-		VALID_CHANNEL(param.channo);
-		chan = chans[param.channo];
-	}
+	if (!chan)
+		chan = chan_from_num(param.channo);
 
 	if (!chan)
 		return -EINVAL;
@@ -4295,25 +4270,23 @@
 
 	if (copy_from_user(&ch, (void __user *)data, sizeof(ch)))
 		return -EFAULT;
-	VALID_CHANNEL(ch.chan);
+
+	chan = chan_from_num(ch.chan);
+	if (!chan)
+		return -EINVAL;
+
 	if (ch.sigtype == DAHDI_SIG_SLAVE) {
-		/* We have to use the master's sigtype */
-		if ((ch.master < 1) || (ch.master >= DAHDI_MAX_CHANNELS))
+		newmaster = chan_from_num(ch.master);
+		if (!newmaster)
 			return -EINVAL;
-		if (!chans[ch.master])
-			return -EINVAL;
-		ch.sigtype = chans[ch.master]->sig;
-		newmaster = chans[ch.master];
+		ch.sigtype = newmaster->sig;
 	} else if ((ch.sigtype & __DAHDI_SIG_DACS) == __DAHDI_SIG_DACS) {
-		newmaster = chans[ch.chan];
-		if ((ch.idlebits < 1) || (ch.idlebits >= DAHDI_MAX_CHANNELS))
-			return -EINVAL;
-		if (!chans[ch.idlebits])
+		newmaster = chan;
+		if (!chan_from_num(ch.idlebits))
 			return -EINVAL;
 	} else {
-		newmaster = chans[ch.chan];
-	}
-	chan = chans[ch.chan];
+		newmaster = chan;
+	}
 	spin_lock_irqsave(&chan->lock, flags);
 #ifdef CONFIG_DAHDI_NET
 	if (chan->flags & DAHDI_FLAG_NETDEV) {
@@ -4389,8 +4362,7 @@
 			/* Setup conference properly */
 			chan->confmode = DAHDI_CONF_DIGITALMON;
 			chan->confna = ch.idlebits;
-			res = dahdi_chan_dacs(chan,
-					      chans[ch.idlebits]);
+			res = dahdi_chan_dacs(chan, chan_from_num(ch.idlebits));
 		} else {
 			dahdi_disable_dacs(chan);
 		}
@@ -4573,8 +4545,9 @@
 		if (copy_from_user(&ae, (void __user *)data, sizeof(ae)))
 			return -EFAULT;
 
-		VALID_CHANNEL(ae.chan);
-		chan = chans[ae.chan];
+		chan = chan_from_num(ae.chan);
+		if (!chan)
+			return -EINVAL;
 
 		ae.echocan[sizeof(ae.echocan) - 1] = 0;
 		if (ae.echocan[0]) {
@@ -4603,8 +4576,10 @@
 
 		if (copy_from_user(&sf, (void __user *)data, sizeof(sf)))
 			return -EFAULT;
-		VALID_CHANNEL(sf.chan);
-		chan = chans[sf.chan];
+		chan = chan_from_num(sf.chan);
+		if (!chan)
+			return -EINVAL;
+
 		if (chan->sig != DAHDI_SIG_SF) return -EINVAL;
 		spin_lock_irqsave(&chan->lock, flags);
 		chan->rxp1 = sf.rxp1;
@@ -4897,24 +4872,16 @@
 
 	confmode = conf.confmode & DAHDI_CONF_MODE_MASK;
 
-	if (conf.chan) {
-		VALID_CHANNEL(conf.chan);
-		chan = chans[conf.chan];
-	} else {
-		if (file->private_data) {
-			chan = file->private_data;
-		} else {
-			VALID_CHANNEL(UNIT(file));
-			chan = chans[UNIT(file)];
-		}
-	}
+	chan = (conf.chan) ? chan_from_num(conf.chan) :
+			     chan_from_file(file);
+	if (!chan)
+		return -EINVAL;
 
 	if (!(chan->flags & DAHDI_FLAG_AUDIO))
 		return -EINVAL;
 
 	if (is_monitor_mode(conf.confmode)) {
-		VALID_CHANNEL(conf.confno);
-		conf_chan = chans[conf.confno];
+		conf_chan = chan_from_num(conf.confno);
 		if (!conf_chan)
 			return -EINVAL;
 	} else {
@@ -5002,13 +4969,9 @@
 	int res = 0;
 	int i;
 
-	if (file->private_data) {
-		chan = file->private_data;
-	} else {
-		VALID_CHANNEL(UNIT(file));
-		chan = chans[UNIT(file)];
-	}
-
+	chan = chan_from_file(file);
+	if (!chan)
+		return -EINVAL;
 	if (!(chan->flags & DAHDI_FLAG_AUDIO))
 		return -EINVAL;
 	if (copy_from_user(&conf, (void __user *)data, sizeof(conf)))
@@ -5091,12 +5054,9 @@
 	int c;
 	int k;
 
-	if (file->private_data) {
-		chan = file->private_data;
-	} else {
-		VALID_CHANNEL(UNIT(file));
-		chan = chans[UNIT(file)];
-	}
+	chan = chan_from_file(file);
+	if (!chan)
+		return -EINVAL;
 
 	if (!(chan->flags & DAHDI_FLAG_AUDIO))
 		return -EINVAL;
@@ -5107,7 +5067,7 @@
 	for (i = ((j) ? j : 1); i <= ((j) ? j : DAHDI_MAX_CONF); i++) {
 		c = 0;
 		for (k = 1; k < DAHDI_MAX_CHANNELS; k++) {
-			struct dahdi_chan *const pos = chans[k];
+			struct dahdi_chan *const pos = chan_from_num(k);
 			/* skip if no pointer */
 			if (!pos)
 				continue;
@@ -5153,18 +5113,8 @@
 	if (copy_from_user(&conf, (void __user *)data, sizeof(conf)))
 		return -EFAULT;
 
-	if (!conf.chan) {
-		/* If 0, use the current channel. */
-		if (file->private_data) {
-			chan = file->private_data;
-		} else {
-			VALID_CHANNEL(UNIT(file));
-			chan = chans[UNIT(file)];
-		}
-	} else {
-		VALID_CHANNEL(conf.chan);
-		chan = chans[conf.chan];
-	}
+	chan = (!conf.chan) ? chan_from_file(file) :
+			      chan_from_num(conf.chan);
 	if (!chan)
 		return -EINVAL;
 
@@ -6085,11 +6035,9 @@
 	switch(cmd) {
 	case DAHDI_SPECIFY:
 		get_user(channo, (int __user *)data);
-		if (channo < 1)
+		file->private_data = chan_from_num(channo);
+		if (!file->private_data)
 			return -EINVAL;
-		if (channo > DAHDI_MAX_CHANNELS)
-			return -EINVAL;
-		file->private_data = chans[channo];
 		res = dahdi_specchan_open(file);
 		if (res)
 			file->private_data = NULL;




More information about the dahdi-commits mailing list