diff options
author | Jan Blunck <jblunck@suse.de> | 2010-04-14 08:38:39 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-05-21 13:30:40 -0400 |
commit | e0a5cbac029db69032758000c67465c2ed7a5736 (patch) | |
tree | 14d81b8fee8d43674acd4c63a2e994bdc3da774c /fs/ext2/super.c | |
parent | c15271f4e74cd6dbdf461335d6d1450949c4b956 (diff) |
BKL: Remove BKL from ext2 filesystem
The BKL is still used in ext2_put_super(), ext2_fill_super(), ext2_sync_fs()
ext2_remount() and ext2_write_inode(). From these calls ext2_put_super(),
ext2_fill_super() and ext2_remount() are protected against each other by
the struct super_block s_umount rw semaphore. The call in ext2_write_inode()
could only protect the modification of the ext2_sb_info through
ext2_update_dynamic_rev() against concurrent ext2_sync_fs() or ext2_remount().
ext2_fill_super() and ext2_put_super() can be left out because you need a
valid filesystem reference in all three cases, which you do not have when
you are one of these functions.
If the BKL is only protecting the modification of the ext2_sb_info it can
safely be removed since this is protected by the struct ext2_sb_info s_lock.
Signed-off-by: Jan Blunck <jblunck@suse.de>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext2/super.c')
-rw-r--r-- | fs/ext2/super.c | 13 |
1 files changed, 0 insertions, 13 deletions
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 28f65609589d..71e9eb1fa696 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/random.h> | 26 | #include <linux/random.h> |
27 | #include <linux/buffer_head.h> | 27 | #include <linux/buffer_head.h> |
28 | #include <linux/exportfs.h> | 28 | #include <linux/exportfs.h> |
29 | #include <linux/smp_lock.h> | ||
30 | #include <linux/vfs.h> | 29 | #include <linux/vfs.h> |
31 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
32 | #include <linux/mount.h> | 31 | #include <linux/mount.h> |
@@ -120,8 +119,6 @@ static void ext2_put_super (struct super_block * sb) | |||
120 | int i; | 119 | int i; |
121 | struct ext2_sb_info *sbi = EXT2_SB(sb); | 120 | struct ext2_sb_info *sbi = EXT2_SB(sb); |
122 | 121 | ||
123 | lock_kernel(); | ||
124 | |||
125 | if (sb->s_dirt) | 122 | if (sb->s_dirt) |
126 | ext2_write_super(sb); | 123 | ext2_write_super(sb); |
127 | 124 | ||
@@ -147,8 +144,6 @@ static void ext2_put_super (struct super_block * sb) | |||
147 | sb->s_fs_info = NULL; | 144 | sb->s_fs_info = NULL; |
148 | kfree(sbi->s_blockgroup_lock); | 145 | kfree(sbi->s_blockgroup_lock); |
149 | kfree(sbi); | 146 | kfree(sbi); |
150 | |||
151 | unlock_kernel(); | ||
152 | } | 147 | } |
153 | 148 | ||
154 | static struct kmem_cache * ext2_inode_cachep; | 149 | static struct kmem_cache * ext2_inode_cachep; |
@@ -1170,7 +1165,6 @@ static int ext2_sync_fs(struct super_block *sb, int wait) | |||
1170 | struct ext2_sb_info *sbi = EXT2_SB(sb); | 1165 | struct ext2_sb_info *sbi = EXT2_SB(sb); |
1171 | struct ext2_super_block *es = EXT2_SB(sb)->s_es; | 1166 | struct ext2_super_block *es = EXT2_SB(sb)->s_es; |
1172 | 1167 | ||
1173 | lock_kernel(); | ||
1174 | spin_lock(&sbi->s_lock); | 1168 | spin_lock(&sbi->s_lock); |
1175 | if (es->s_state & cpu_to_le16(EXT2_VALID_FS)) { | 1169 | if (es->s_state & cpu_to_le16(EXT2_VALID_FS)) { |
1176 | ext2_debug("setting valid to 0\n"); | 1170 | ext2_debug("setting valid to 0\n"); |
@@ -1178,8 +1172,6 @@ static int ext2_sync_fs(struct super_block *sb, int wait) | |||
1178 | } | 1172 | } |
1179 | spin_unlock(&sbi->s_lock); | 1173 | spin_unlock(&sbi->s_lock); |
1180 | ext2_sync_super(sb, es, wait); | 1174 | ext2_sync_super(sb, es, wait); |
1181 | unlock_kernel(); | ||
1182 | |||
1183 | return 0; | 1175 | return 0; |
1184 | } | 1176 | } |
1185 | 1177 | ||
@@ -1201,7 +1193,6 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1201 | unsigned long old_sb_flags; | 1193 | unsigned long old_sb_flags; |
1202 | int err; | 1194 | int err; |
1203 | 1195 | ||
1204 | lock_kernel(); | ||
1205 | spin_lock(&sbi->s_lock); | 1196 | spin_lock(&sbi->s_lock); |
1206 | 1197 | ||
1207 | /* Store the old options */ | 1198 | /* Store the old options */ |
@@ -1242,14 +1233,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1242 | } | 1233 | } |
1243 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { | 1234 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) { |
1244 | spin_unlock(&sbi->s_lock); | 1235 | spin_unlock(&sbi->s_lock); |
1245 | unlock_kernel(); | ||
1246 | return 0; | 1236 | return 0; |
1247 | } | 1237 | } |
1248 | if (*flags & MS_RDONLY) { | 1238 | if (*flags & MS_RDONLY) { |
1249 | if (le16_to_cpu(es->s_state) & EXT2_VALID_FS || | 1239 | if (le16_to_cpu(es->s_state) & EXT2_VALID_FS || |
1250 | !(sbi->s_mount_state & EXT2_VALID_FS)) { | 1240 | !(sbi->s_mount_state & EXT2_VALID_FS)) { |
1251 | spin_unlock(&sbi->s_lock); | 1241 | spin_unlock(&sbi->s_lock); |
1252 | unlock_kernel(); | ||
1253 | return 0; | 1242 | return 0; |
1254 | } | 1243 | } |
1255 | /* | 1244 | /* |
@@ -1282,7 +1271,6 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1282 | spin_unlock(&sbi->s_lock); | 1271 | spin_unlock(&sbi->s_lock); |
1283 | ext2_write_super(sb); | 1272 | ext2_write_super(sb); |
1284 | } | 1273 | } |
1285 | unlock_kernel(); | ||
1286 | return 0; | 1274 | return 0; |
1287 | restore_opts: | 1275 | restore_opts: |
1288 | sbi->s_mount_opt = old_opts.s_mount_opt; | 1276 | sbi->s_mount_opt = old_opts.s_mount_opt; |
@@ -1290,7 +1278,6 @@ restore_opts: | |||
1290 | sbi->s_resgid = old_opts.s_resgid; | 1278 | sbi->s_resgid = old_opts.s_resgid; |
1291 | sb->s_flags = old_sb_flags; | 1279 | sb->s_flags = old_sb_flags; |
1292 | spin_unlock(&sbi->s_lock); | 1280 | spin_unlock(&sbi->s_lock); |
1293 | unlock_kernel(); | ||
1294 | return err; | 1281 | return err; |
1295 | } | 1282 | } |
1296 | 1283 | ||