aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2/super.c
diff options
context:
space:
mode:
authorJan Blunck <jblunck@infradead.org>2010-08-15 16:51:10 -0400
committerArnd Bergmann <arnd@arndb.de>2010-10-04 15:10:10 -0400
commitdb71922217a214e5c9268448e537b54fc1f301ea (patch)
tree9c9afbf29411547891f6968e5ade29ce59d66c07 /fs/ext2/super.c
parent899611ee7d373e5eeda08e9a8632684e1ebbbf00 (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/ext2/super.c')
-rw-r--r--fs/ext2/super.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c
index 1ec602673ea..f98c390caf1 100644
--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -747,15 +747,18 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
747 __le32 features; 747 __le32 features;
748 int err; 748 int err;
749 749
750 lock_kernel();
751
752 err = -ENOMEM;
750 sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); 753 sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
751 if (!sbi) 754 if (!sbi)
752 return -ENOMEM; 755 goto failed_unlock;
753 756
754 sbi->s_blockgroup_lock = 757 sbi->s_blockgroup_lock =
755 kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); 758 kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
756 if (!sbi->s_blockgroup_lock) { 759 if (!sbi->s_blockgroup_lock) {
757 kfree(sbi); 760 kfree(sbi);
758 return -ENOMEM; 761 goto failed_unlock;
759 } 762 }
760 sb->s_fs_info = sbi; 763 sb->s_fs_info = sbi;
761 sbi->s_sb_block = sb_block; 764 sbi->s_sb_block = sb_block;
@@ -1083,6 +1086,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
1083 if (ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY)) 1086 if (ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY))
1084 sb->s_flags |= MS_RDONLY; 1087 sb->s_flags |= MS_RDONLY;
1085 ext2_write_super(sb); 1088 ext2_write_super(sb);
1089 unlock_kernel();
1086 return 0; 1090 return 0;
1087 1091
1088cantfind_ext2: 1092cantfind_ext2:
@@ -1107,6 +1111,8 @@ failed_sbi:
1107 sb->s_fs_info = NULL; 1111 sb->s_fs_info = NULL;
1108 kfree(sbi->s_blockgroup_lock); 1112 kfree(sbi->s_blockgroup_lock);
1109 kfree(sbi); 1113 kfree(sbi);
1114failed_unlock:
1115 unlock_kernel();
1110 return ret; 1116 return ret;
1111} 1117}
1112 1118