aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext2/super.c
diff options
context:
space:
mode:
authorJan Blunck <jblunck@suse.de>2010-04-14 08:38:39 -0400
committerJan Kara <jack@suse.cz>2010-05-21 13:30:40 -0400
commite0a5cbac029db69032758000c67465c2ed7a5736 (patch)
tree14d81b8fee8d43674acd4c63a2e994bdc3da774c /fs/ext2/super.c
parentc15271f4e74cd6dbdf461335d6d1450949c4b956 (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.c13
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
154static struct kmem_cache * ext2_inode_cachep; 149static 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;
1287restore_opts: 1275restore_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