]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'bkl-removal' of git://git.lwn.net/linux-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 30 Mar 2009 18:31:47 +0000 (11:31 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 30 Mar 2009 18:31:47 +0000 (11:31 -0700)
* 'bkl-removal' of git://git.lwn.net/linux-2.6:
  Fix a lockdep warning in fasync_helper()
  Add a missing unlock_kernel() in raw_open()

drivers/char/raw.c
fs/fcntl.c
include/linux/fs.h

index 96adf28a17e43b309d8af6858d695015c84cc6d1..20d90e6a6e50fb41dfdd2601b1ae6617c40a6070 100644 (file)
@@ -90,6 +90,7 @@ out1:
        blkdev_put(bdev, filp->f_mode);
 out:
        mutex_unlock(&raw_mutex);
+       unlock_kernel();
        return err;
 }
 
index d865ca66ccba1a6fb331150a75c7d50b5545e87c..cc8e4de2fee5f0caefa6c5e00ea4e1abf33359b8 100644 (file)
@@ -531,6 +531,12 @@ int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fap
                if (!new)
                        return -ENOMEM;
        }
+
+       /*
+        * We need to take f_lock first since it's not an IRQ-safe
+        * lock.
+        */
+       spin_lock(&filp->f_lock);
        write_lock_irq(&fasync_lock);
        for (fp = fapp; (fa = *fp) != NULL; fp = &fa->fa_next) {
                if (fa->fa_file == filp) {
@@ -555,14 +561,12 @@ int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fap
                result = 1;
        }
 out:
-       /* Fix up FASYNC bit while still holding fasync_lock */
-       spin_lock(&filp->f_lock);
        if (on)
                filp->f_flags |= FASYNC;
        else
                filp->f_flags &= ~FASYNC;
-       spin_unlock(&filp->f_lock);
        write_unlock_irq(&fasync_lock);
+       spin_unlock(&filp->f_lock);
        return result;
 }
 
index 42436ae42f7022468fd3fc8f4a947b69f704a7ed..87e7bfc5ebd7f5e198b324f4b7d6877f664856a7 100644 (file)
@@ -849,7 +849,7 @@ struct file {
 #define f_dentry       f_path.dentry
 #define f_vfsmnt       f_path.mnt
        const struct file_operations    *f_op;
-       spinlock_t              f_lock;  /* f_ep_links, f_flags */
+       spinlock_t              f_lock;  /* f_ep_links, f_flags, no IRQ */
        atomic_long_t           f_count;
        unsigned int            f_flags;
        fmode_t                 f_mode;