summaryrefslogtreecommitdiffstats
path: root/fs/qnx4/dir.c
diff options
context:
space:
mode:
authorjan Blunck <jblunck@suse.de>2010-05-26 14:44:53 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2010-05-27 09:12:56 -0700
commitca572727dbb945e443564029a495157fd2e72995 (patch)
tree10486033a428e9389e32cbc78c0da34c644640a1 /fs/qnx4/dir.c
parentb4d878e23c7f574490ee4d6fd59ebd6819781dd1 (diff)
downloadlinux-ca572727dbb945e443564029a495157fd2e72995.tar.gz
linux-ca572727dbb945e443564029a495157fd2e72995.tar.bz2
linux-ca572727dbb945e443564029a495157fd2e72995.zip
fs/: do not fallback to default_llseek() when readdir() uses BKL
Do not use the fallback default_llseek() if the readdir operation of the filesystem still uses the big kernel lock. Since llseek() modifies file->f_pos of the directory directly it may need locking to not confuse readdir which usually uses file->f_pos directly as well Since the special characteristics of the BKL (unlocked on schedule) are not necessary in this case, the inode mutex can be used for locking as provided by generic_file_llseek(). This is only possible since all filesystems, except reiserfs, either use a directory as a flat file or with disk address offsets. Reiserfs on the other hand uses a 32bit hash off the filename as the offset so generic_file_llseek() can get used as well since the hash is always smaller than sb->s_maxbytes (= (512 << 32) - blocksize). Signed-off-by: Jan Blunck <jblunck@suse.de> Acked-by: Jan Kara <jack@suse.cz> Acked-by: Anders Larsen <al@alarsen.net> Cc: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/qnx4/dir.c')
-rw-r--r--fs/qnx4/dir.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c
index 6f30c3d5bcbf..3d3fd4692133 100644
--- a/fs/qnx4/dir.c
+++ b/fs/qnx4/dir.c
@@ -77,6 +77,7 @@ out:
const struct file_operations qnx4_dir_operations =
{
+ .llseek = generic_file_llseek,
.read = generic_read_dir,
.readdir = qnx4_readdir,
.fsync = simple_fsync,