vfs: don't use BKL in default_llseek
authorArnd Bergmann <arnd@arndb.de>
Wed, 7 Jul 2010 20:55:17 +0000 (22:55 +0200)
committerArnd Bergmann <arnd@arndb.de>
Fri, 15 Oct 2010 13:53:34 +0000 (15:53 +0200)
There are currently 191 users of default_llseek.
Nine of these are in device drivers that use the
big kernel lock. None of these ever touch
file->f_pos outside of llseek or file_pos_write.

Consequently, we never rely on the BKL
in the default_llseek function and can
replace that with i_mutex, which is also
used in generic_file_llseek.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
fs/read_write.c

index 74e36586e4d3076db68cae1579d0c3b50c78a3b2..fd09f6166ccfd197c3971843802a374760a3c4d5 100644 (file)
@@ -124,7 +124,7 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin)
 {
        loff_t retval;
 
-       lock_kernel();
+       mutex_lock(&file->f_dentry->d_inode->i_mutex);
        switch (origin) {
                case SEEK_END:
                        offset += i_size_read(file->f_path.dentry->d_inode);
@@ -145,7 +145,7 @@ loff_t default_llseek(struct file *file, loff_t offset, int origin)
                retval = offset;
        }
 out:
-       unlock_kernel();
+       mutex_unlock(&file->f_dentry->d_inode->i_mutex);
        return retval;
 }
 EXPORT_SYMBOL(default_llseek);