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/smbfs | |
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/smbfs')
-rw-r--r-- | fs/smbfs/inode.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c index 450c91941988..8fc5e50e142f 100644 --- a/fs/smbfs/inode.c +++ b/fs/smbfs/inode.c | |||
@@ -501,6 +501,8 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) | |||
501 | void *mem; | 501 | void *mem; |
502 | static int warn_count; | 502 | static int warn_count; |
503 | 503 | ||
504 | lock_kernel(); | ||
505 | |||
504 | if (warn_count < 5) { | 506 | if (warn_count < 5) { |
505 | warn_count++; | 507 | warn_count++; |
506 | printk(KERN_EMERG "smbfs is deprecated and will be removed" | 508 | printk(KERN_EMERG "smbfs is deprecated and will be removed" |
@@ -621,6 +623,7 @@ static int smb_fill_super(struct super_block *sb, void *raw_data, int silent) | |||
621 | 623 | ||
622 | smb_new_dentry(sb->s_root); | 624 | smb_new_dentry(sb->s_root); |
623 | 625 | ||
626 | unlock_kernel(); | ||
624 | return 0; | 627 | return 0; |
625 | 628 | ||
626 | out_no_root: | 629 | out_no_root: |
@@ -643,9 +646,11 @@ out_wrong_data: | |||
643 | out_no_data: | 646 | out_no_data: |
644 | printk(KERN_ERR "smb_fill_super: missing data argument\n"); | 647 | printk(KERN_ERR "smb_fill_super: missing data argument\n"); |
645 | out_fail: | 648 | out_fail: |
649 | unlock_kernel(); | ||
646 | return -EINVAL; | 650 | return -EINVAL; |
647 | out_no_server: | 651 | out_no_server: |
648 | printk(KERN_ERR "smb_fill_super: cannot allocate struct smb_sb_info\n"); | 652 | printk(KERN_ERR "smb_fill_super: cannot allocate struct smb_sb_info\n"); |
653 | unlock_kernel(); | ||
649 | return -ENOMEM; | 654 | return -ENOMEM; |
650 | } | 655 | } |
651 | 656 | ||