diff options
author | jan Blunck <jblunck@suse.de> | 2010-05-26 17:44:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-27 12:12:56 -0400 |
commit | ca572727dbb945e443564029a495157fd2e72995 (patch) | |
tree | 10486033a428e9389e32cbc78c0da34c644640a1 /fs/autofs | |
parent | b4d878e23c7f574490ee4d6fd59ebd6819781dd1 (diff) |
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/autofs')
-rw-r--r-- | fs/autofs/root.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/autofs/root.c b/fs/autofs/root.c index 8713c7cfbc79..9a0520b50663 100644 --- a/fs/autofs/root.c +++ b/fs/autofs/root.c | |||
@@ -28,6 +28,7 @@ static int autofs_root_mkdir(struct inode *,struct dentry *,int); | |||
28 | static int autofs_root_ioctl(struct inode *, struct file *,unsigned int,unsigned long); | 28 | static int autofs_root_ioctl(struct inode *, struct file *,unsigned int,unsigned long); |
29 | 29 | ||
30 | const struct file_operations autofs_root_operations = { | 30 | const struct file_operations autofs_root_operations = { |
31 | .llseek = generic_file_llseek, | ||
31 | .read = generic_read_dir, | 32 | .read = generic_read_dir, |
32 | .readdir = autofs_root_readdir, | 33 | .readdir = autofs_root_readdir, |
33 | .ioctl = autofs_root_ioctl, | 34 | .ioctl = autofs_root_ioctl, |