ALSA: us122l: fix missing unlock in usb_stream_hwdep_vm_fault()
authorLi Zefan <lizf@cn.fujitsu.com>
Wed, 15 Oct 2008 02:07:23 +0000 (10:07 +0800)
committerTakashi Iwai <tiwai@suse.de>
Wed, 15 Oct 2008 09:41:04 +0000 (11:41 +0200)
Should unlock us122l->mutex before returning VM_FAULT_SIGBUS.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/usx2y/us122l.c

index b441fe2..c2515b6 100644 (file)
@@ -118,12 +118,11 @@ static int usb_stream_hwdep_vm_fault(struct vm_area_struct *area,
        void *vaddr;
        struct us122l *us122l = area->vm_private_data;
        struct usb_stream *s;
-       int vm_f = VM_FAULT_SIGBUS;
 
        mutex_lock(&us122l->mutex);
        s = us122l->sk.s;
        if (!s)
-               goto out;
+               goto unlock;
 
        offset = vmf->pgoff << PAGE_SHIFT;
        if (offset < PAGE_ALIGN(s->read_size))
@@ -131,7 +130,7 @@ static int usb_stream_hwdep_vm_fault(struct vm_area_struct *area,
        else {
                offset -= PAGE_ALIGN(s->read_size);
                if (offset >= PAGE_ALIGN(s->write_size))
-                       goto out;
+                       goto unlock;
 
                vaddr = us122l->sk.write_page + offset;
        }
@@ -141,9 +140,11 @@ static int usb_stream_hwdep_vm_fault(struct vm_area_struct *area,
        mutex_unlock(&us122l->mutex);
 
        vmf->page = page;
-       vm_f = 0;
-out:
-       return vm_f;
+
+       return 0;
+unlock:
+       mutex_unlock(&us122l->mutex);
+       return VM_FAULT_SIGBUS;
 }
 
 static void usb_stream_hwdep_vm_close(struct vm_area_struct *area)