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/freevxfs | |
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/freevxfs')
-rw-r--r-- | fs/freevxfs/vxfs_super.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index dc0c041e85cb..eb2b9e09c996 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c | |||
@@ -148,7 +148,7 @@ static int vxfs_remount(struct super_block *sb, int *flags, char *data) | |||
148 | * The superblock on success, else %NULL. | 148 | * The superblock on success, else %NULL. |
149 | * | 149 | * |
150 | * Locking: | 150 | * Locking: |
151 | * We are under the bkl and @sbp->s_lock. | 151 | * We are under @sbp->s_lock. |
152 | */ | 152 | */ |
153 | static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) | 153 | static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) |
154 | { | 154 | { |
@@ -159,11 +159,14 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) | |||
159 | struct inode *root; | 159 | struct inode *root; |
160 | int ret = -EINVAL; | 160 | int ret = -EINVAL; |
161 | 161 | ||
162 | lock_kernel(); | ||
163 | |||
162 | sbp->s_flags |= MS_RDONLY; | 164 | sbp->s_flags |= MS_RDONLY; |
163 | 165 | ||
164 | infp = kzalloc(sizeof(*infp), GFP_KERNEL); | 166 | infp = kzalloc(sizeof(*infp), GFP_KERNEL); |
165 | if (!infp) { | 167 | if (!infp) { |
166 | printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n"); | 168 | printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n"); |
169 | unlock_kernel(); | ||
167 | return -ENOMEM; | 170 | return -ENOMEM; |
168 | } | 171 | } |
169 | 172 | ||
@@ -236,6 +239,7 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) | |||
236 | goto out_free_ilist; | 239 | goto out_free_ilist; |
237 | } | 240 | } |
238 | 241 | ||
242 | unlock_kernel(); | ||
239 | return 0; | 243 | return 0; |
240 | 244 | ||
241 | out_free_ilist: | 245 | out_free_ilist: |
@@ -245,6 +249,7 @@ out_free_ilist: | |||
245 | out: | 249 | out: |
246 | brelse(bp); | 250 | brelse(bp); |
247 | kfree(infp); | 251 | kfree(infp); |
252 | unlock_kernel(); | ||
248 | return ret; | 253 | return ret; |
249 | } | 254 | } |
250 | 255 | ||