Ensure that misbehaving or aborted userspace programs do not accidentally keep the lock.
Signed-off-by: Clemens Ladisch clemens@ladisch.de --- sound/firewire/dice.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/sound/firewire/dice.c b/sound/firewire/dice.c index 7225878..ef04089 100644 --- a/sound/firewire/dice.c +++ b/sound/firewire/dice.c @@ -966,6 +966,18 @@ static int dice_hwdep_unlock(struct dice *dice) return err; }
+static int dice_hwdep_release(struct snd_hwdep *hwdep, struct file *file) +{ + struct dice *dice = hwdep->private_data; + + spin_lock_irq(&dice->lock); + if (dice->dev_lock_count == -1) + dice->dev_lock_count = 0; + spin_unlock_irq(&dice->lock); + + return 0; +} + static int dice_hwdep_ioctl(struct snd_hwdep *hwdep, struct file *file, unsigned int cmd, unsigned long arg) { @@ -998,6 +1010,7 @@ static int dice_create_hwdep(struct dice *dice) { static const struct snd_hwdep_ops ops = { .read = dice_hwdep_read, + .release = dice_hwdep_release, .poll = dice_hwdep_poll, .ioctl = dice_hwdep_ioctl, .ioctl_compat = dice_hwdep_compat_ioctl,