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/jfs | |
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/jfs')
-rw-r--r-- | fs/jfs/super.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index ec8c3e4baca3..eb31f677347d 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -438,14 +438,20 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
438 | s64 newLVSize = 0; | 438 | s64 newLVSize = 0; |
439 | int flag, ret = -EINVAL; | 439 | int flag, ret = -EINVAL; |
440 | 440 | ||
441 | lock_kernel(); | ||
442 | |||
441 | jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags); | 443 | jfs_info("In jfs_read_super: s_flags=0x%lx", sb->s_flags); |
442 | 444 | ||
443 | if (!new_valid_dev(sb->s_bdev->bd_dev)) | 445 | if (!new_valid_dev(sb->s_bdev->bd_dev)) { |
446 | unlock_kernel(); | ||
444 | return -EOVERFLOW; | 447 | return -EOVERFLOW; |
448 | } | ||
445 | 449 | ||
446 | sbi = kzalloc(sizeof (struct jfs_sb_info), GFP_KERNEL); | 450 | sbi = kzalloc(sizeof (struct jfs_sb_info), GFP_KERNEL); |
447 | if (!sbi) | 451 | if (!sbi) { |
452 | unlock_kernel(); | ||
448 | return -ENOMEM; | 453 | return -ENOMEM; |
454 | } | ||
449 | sb->s_fs_info = sbi; | 455 | sb->s_fs_info = sbi; |
450 | sbi->sb = sb; | 456 | sbi->sb = sb; |
451 | sbi->uid = sbi->gid = sbi->umask = -1; | 457 | sbi->uid = sbi->gid = sbi->umask = -1; |
@@ -542,6 +548,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
542 | sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, (u64)sb->s_maxbytes); | 548 | sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, (u64)sb->s_maxbytes); |
543 | #endif | 549 | #endif |
544 | sb->s_time_gran = 1; | 550 | sb->s_time_gran = 1; |
551 | unlock_kernel(); | ||
545 | return 0; | 552 | return 0; |
546 | 553 | ||
547 | out_no_root: | 554 | out_no_root: |
@@ -564,6 +571,7 @@ out_unload: | |||
564 | unload_nls(sbi->nls_tab); | 571 | unload_nls(sbi->nls_tab); |
565 | out_kfree: | 572 | out_kfree: |
566 | kfree(sbi); | 573 | kfree(sbi); |
574 | unlock_kernel(); | ||
567 | return ret; | 575 | return ret; |
568 | } | 576 | } |
569 | 577 | ||