ext2: fix sleeping in atomic bugs on error
Subsystems (2)
PATCH v2 1/1 ext2: fix sleeping in atomic bugs on error
The ext2_error() function syncs the filesystem so it sleeps. The caller is holding a spinlock so it's not allowed to sleep.
ext2_statfs() <- disables preempt
-> ext2_count_free_blocks()
-> ext2_get_group_desc()
Fix this by using WARN() to print an error message and a stack trace instead of using ext2_error().
Signed-off-by Dan Carpenter <[email protected]>
---
v2: The first version disabled the sync in ext2_error()
fs/ext2/balloc.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
fs/ext2/balloc.c +6 -8
@@ -48,10 +48,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,struct ext2_sb_info *sbi =EXT2_SB (sb);if (block_group >= sbi->s_groups_count) { -ext2_error (sb,"ext2_get_group_desc" , -"block_group >= groups_count - " -"block_group = %d, groups_count = %lu" , - block_group, sbi->s_groups_count); +WARN (1 ,"block_group >= groups_count - " +"block_group = %d, groups_count = %lu" , + block_group, sbi->s_groups_count);return NULL ; }
@@ -59,10 +58,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, group_desc = block_group >>EXT2_DESC_PER_BLOCK_BITS (sb); offset = block_group & (EXT2_DESC_PER_BLOCK (sb) -1 );if (!sbi->s_group_desc[group_desc]) { -ext2_error (sb,"ext2_get_group_desc" , -"Group descriptor not loaded - " -"block_group = %d, group_desc = %lu, desc = %lu" , - block_group, group_desc, offset); +WARN (1 ,"Group descriptor not loaded - " +"block_group = %d, group_desc = %lu, desc = %lu" , + block_group, group_desc, offset);return NULL ; }
Signature · 1 line
2.20.1
Quoted 11 lines · Dan Carpenter
The
ext2_error()function syncs the filesystem so it sleeps. The caller is holding a spinlock so it's not allowed to sleep.ext2_statfs() <- disables preempt -> ext2_count_free_blocks() -> ext2_get_group_desc()Fix this by using
WARN()to print an error message and a stack trace instead of usingext2_error().Signed-off-by Dan Carpenter <[email protected]>
Thanks! I've added the patch to my tree.
Honza
Quoted 41 lines
---
v2: The first version disabled the sync inext2_error()fs/ext2/balloc.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)fs/ext2/balloc.c +6
-8@@ -48,10 +48,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,struct ext2_sb_info *sbi =EXT2_SB (sb);if (block_group >= sbi->s_groups_count) { -ext2_error (sb,"ext2_get_group_desc" , -"block_group >= groups_count - " -"block_group = %d, groups_count = %lu" , - block_group, sbi->s_groups_count); +WARN (1 ,"block_group >= groups_count - " +"block_group = %d, groups_count = %lu" , + block_group, sbi->s_groups_count);return NULL ; }@@ -59,10 +58,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb, group_desc = block_group >>EXT2_DESC_PER_BLOCK_BITS (sb); offset = block_group & (EXT2_DESC_PER_BLOCK (sb) -1 );if (!sbi->s_group_desc[group_desc]) { -ext2_error (sb,"ext2_get_group_desc" , -"Group descriptor not loaded - " -"block_group = %d, group_desc = %lu, desc = %lu" , - block_group, group_desc, offset); +WARN (1 ,"Group descriptor not loaded - " +"block_group = %d, group_desc = %lu, desc = %lu" , + block_group, group_desc, offset);return NULL ; }Signature · 1 line
2.20.1
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR