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/bfs | |
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/bfs')
-rw-r--r-- | fs/bfs/inode.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index c4daf0f5fc02..d2e09363dd93 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
@@ -322,9 +322,13 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
322 | int ret = -EINVAL; | 322 | int ret = -EINVAL; |
323 | unsigned long i_sblock, i_eblock, i_eoff, s_size; | 323 | unsigned long i_sblock, i_eblock, i_eoff, s_size; |
324 | 324 | ||
325 | lock_kernel(); | ||
326 | |||
325 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 327 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
326 | if (!info) | 328 | if (!info) { |
329 | unlock_kernel(); | ||
327 | return -ENOMEM; | 330 | return -ENOMEM; |
331 | } | ||
328 | mutex_init(&info->bfs_lock); | 332 | mutex_init(&info->bfs_lock); |
329 | s->s_fs_info = info; | 333 | s->s_fs_info = info; |
330 | 334 | ||
@@ -439,6 +443,7 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
439 | brelse(bh); | 443 | brelse(bh); |
440 | brelse(sbh); | 444 | brelse(sbh); |
441 | dump_imap("read_super", s); | 445 | dump_imap("read_super", s); |
446 | unlock_kernel(); | ||
442 | return 0; | 447 | return 0; |
443 | 448 | ||
444 | out3: | 449 | out3: |
@@ -452,6 +457,7 @@ out: | |||
452 | mutex_destroy(&info->bfs_lock); | 457 | mutex_destroy(&info->bfs_lock); |
453 | kfree(info); | 458 | kfree(info); |
454 | s->s_fs_info = NULL; | 459 | s->s_fs_info = NULL; |
460 | unlock_kernel(); | ||
455 | return ret; | 461 | return ret; |
456 | } | 462 | } |
457 | 463 | ||