diff options
author | Jan Blunck <jblunck@infradead.org> | 2010-08-15 16:51:10 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2010-10-04 15:10:10 -0400 |
commit | db71922217a214e5c9268448e537b54fc1f301ea (patch) | |
tree | 9c9afbf29411547891f6968e5ade29ce59d66c07 /fs/affs | |
parent | 899611ee7d373e5eeda08e9a8632684e1ebbbf00 (diff) |
BKL: Explicitly add BKL around get_sb/fill_super
This patch is a preparation necessary to remove the BKL from do_new_mount().
It explicitly adds calls to lock_kernel()/unlock_kernel() around
get_sb/fill_super operations for filesystems that still uses the BKL.
I've read through all the code formerly covered by the BKL inside
do_kern_mount() and have satisfied myself that it doesn't need the BKL
any more.
do_kern_mount() is already called without the BKL when mounting the rootfs
and in nfsctl. do_kern_mount() calls vfs_kern_mount(), which is called
from various places without BKL: simple_pin_fs(), nfs_do_clone_mount()
through nfs_follow_mountpoint(), afs_mntpt_do_automount() through
afs_mntpt_follow_link(). Both later functions are actually the filesystems
follow_link inode operation. vfs_kern_mount() is calling the specified
get_sb function and lets the filesystem do its job by calling the given
fill_super function.
Therefore I think it is safe to push down the BKL from the VFS to the
low-level filesystems get_sb/fill_super operation.
[arnd: do not add the BKL to those file systems that already
don't use it elsewhere]
Signed-off-by: Jan Blunck <jblunck@infradead.org>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Matthew Wilcox <matthew@wil.cx>
Cc: Christoph Hellwig <hch@infradead.org>
Diffstat (limited to 'fs/affs')
-rw-r--r-- | fs/affs/super.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/affs/super.c b/fs/affs/super.c index 33c4e7eef470..3a6d1dee4a51 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c | |||
@@ -291,6 +291,8 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) | |||
291 | u8 sig[4]; | 291 | u8 sig[4]; |
292 | int ret = -EINVAL; | 292 | int ret = -EINVAL; |
293 | 293 | ||
294 | lock_kernel(); | ||
295 | |||
294 | save_mount_options(sb, data); | 296 | save_mount_options(sb, data); |
295 | 297 | ||
296 | pr_debug("AFFS: read_super(%s)\n",data ? (const char *)data : "no options"); | 298 | pr_debug("AFFS: read_super(%s)\n",data ? (const char *)data : "no options"); |
@@ -300,8 +302,10 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) | |||
300 | sb->s_flags |= MS_NODIRATIME; | 302 | sb->s_flags |= MS_NODIRATIME; |
301 | 303 | ||
302 | sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL); | 304 | sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL); |
303 | if (!sbi) | 305 | if (!sbi) { |
306 | unlock_kernel(); | ||
304 | return -ENOMEM; | 307 | return -ENOMEM; |
308 | } | ||
305 | sb->s_fs_info = sbi; | 309 | sb->s_fs_info = sbi; |
306 | mutex_init(&sbi->s_bmlock); | 310 | mutex_init(&sbi->s_bmlock); |
307 | spin_lock_init(&sbi->symlink_lock); | 311 | spin_lock_init(&sbi->symlink_lock); |
@@ -312,6 +316,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) | |||
312 | printk(KERN_ERR "AFFS: Error parsing options\n"); | 316 | printk(KERN_ERR "AFFS: Error parsing options\n"); |
313 | kfree(sbi->s_prefix); | 317 | kfree(sbi->s_prefix); |
314 | kfree(sbi); | 318 | kfree(sbi); |
319 | unlock_kernel(); | ||
315 | return -EINVAL; | 320 | return -EINVAL; |
316 | } | 321 | } |
317 | /* N.B. after this point s_prefix must be released */ | 322 | /* N.B. after this point s_prefix must be released */ |
@@ -482,6 +487,7 @@ got_root: | |||
482 | sb->s_root->d_op = &affs_dentry_operations; | 487 | sb->s_root->d_op = &affs_dentry_operations; |
483 | 488 | ||
484 | pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); | 489 | pr_debug("AFFS: s_flags=%lX\n",sb->s_flags); |
490 | unlock_kernel(); | ||
485 | return 0; | 491 | return 0; |
486 | 492 | ||
487 | /* | 493 | /* |
@@ -496,6 +502,7 @@ out_error_noinode: | |||
496 | kfree(sbi->s_prefix); | 502 | kfree(sbi->s_prefix); |
497 | kfree(sbi); | 503 | kfree(sbi); |
498 | sb->s_fs_info = NULL; | 504 | sb->s_fs_info = NULL; |
505 | unlock_kernel(); | ||
499 | return ret; | 506 | return ret; |
500 | } | 507 | } |
501 | 508 | ||