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/udf | |
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/udf')
-rw-r--r-- | fs/udf/super.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/udf/super.c b/fs/udf/super.c index 65412d84a45d..76f3d6d97b40 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -1880,6 +1880,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1880 | struct kernel_lb_addr rootdir, fileset; | 1880 | struct kernel_lb_addr rootdir, fileset; |
1881 | struct udf_sb_info *sbi; | 1881 | struct udf_sb_info *sbi; |
1882 | 1882 | ||
1883 | lock_kernel(); | ||
1884 | |||
1883 | uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); | 1885 | uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT); |
1884 | uopt.uid = -1; | 1886 | uopt.uid = -1; |
1885 | uopt.gid = -1; | 1887 | uopt.gid = -1; |
@@ -1888,8 +1890,10 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
1888 | uopt.dmode = UDF_INVALID_MODE; | 1890 | uopt.dmode = UDF_INVALID_MODE; |
1889 | 1891 | ||
1890 | sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); | 1892 | sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL); |
1891 | if (!sbi) | 1893 | if (!sbi) { |
1894 | unlock_kernel(); | ||
1892 | return -ENOMEM; | 1895 | return -ENOMEM; |
1896 | } | ||
1893 | 1897 | ||
1894 | sb->s_fs_info = sbi; | 1898 | sb->s_fs_info = sbi; |
1895 | 1899 | ||
@@ -2035,6 +2039,7 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
2035 | goto error_out; | 2039 | goto error_out; |
2036 | } | 2040 | } |
2037 | sb->s_maxbytes = MAX_LFS_FILESIZE; | 2041 | sb->s_maxbytes = MAX_LFS_FILESIZE; |
2042 | unlock_kernel(); | ||
2038 | return 0; | 2043 | return 0; |
2039 | 2044 | ||
2040 | error_out: | 2045 | error_out: |
@@ -2055,6 +2060,7 @@ error_out: | |||
2055 | kfree(sbi); | 2060 | kfree(sbi); |
2056 | sb->s_fs_info = NULL; | 2061 | sb->s_fs_info = NULL; |
2057 | 2062 | ||
2063 | unlock_kernel(); | ||
2058 | return -EINVAL; | 2064 | return -EINVAL; |
2059 | } | 2065 | } |
2060 | 2066 | ||