Merge branch 'for-linus' into for-next
[linux-2.6-block.git] / sound / core / timer.c
index 59ae21b0bb936c0757d58573b1bac3ed3defcb1a..013f0e69ff0f719fc1d090cd10a619a7bf47734a 100644 (file)
@@ -74,6 +74,9 @@ static LIST_HEAD(snd_timer_slave_list);
 /* lock for slave active lists */
 static DEFINE_SPINLOCK(slave_active_lock);
 
+#define MAX_SLAVE_INSTANCES    1000
+static int num_slaves;
+
 static DEFINE_MUTEX(register_mutex);
 
 static int snd_timer_free(struct snd_timer *timer);
@@ -252,6 +255,10 @@ int snd_timer_open(struct snd_timer_instance **ti,
                        err = -EINVAL;
                        goto unlock;
                }
+               if (num_slaves >= MAX_SLAVE_INSTANCES) {
+                       err = -EBUSY;
+                       goto unlock;
+               }
                timeri = snd_timer_instance_new(owner, NULL);
                if (!timeri) {
                        err = -ENOMEM;
@@ -261,6 +268,7 @@ int snd_timer_open(struct snd_timer_instance **ti,
                timeri->slave_id = tid->device;
                timeri->flags |= SNDRV_TIMER_IFLG_SLAVE;
                list_add_tail(&timeri->open_list, &snd_timer_slave_list);
+               num_slaves++;
                err = snd_timer_check_slave(timeri);
                if (err < 0) {
                        snd_timer_close_locked(timeri, &card_dev_to_put);
@@ -356,6 +364,8 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri,
        }
 
        list_del(&timeri->open_list);
+       if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE)
+               num_slaves--;
 
        /* force to stop the timer */
        snd_timer_stop(timeri);