Ye Bin (4): ext2: remove ext2_new_block() ext2: introduce flag argument for ext2_new_blocks() ext2: fix race between setxattr and write back ext2: dump current reservation window info
fs/ext2/balloc.c | 32 +++++++++++++++++--------------- fs/ext2/ext2.h | 8 ++++++-- fs/ext2/inode.c | 2 +- fs/ext2/xattr.c | 4 +++- 4 files changed, 27 insertions(+), 19 deletions(-)
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
Now, only xattr allocate block use ext2_new_block(), so just opencode it in the xattr code.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 7 ------- fs/ext2/ext2.h | 1 - fs/ext2/xattr.c | 4 +++- 3 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 33db13365c5e..e90c17f88654 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1450,13 +1450,6 @@ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, return 0; }
-ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp) -{ - unsigned long count = 1; - - return ext2_new_blocks(inode, goal, &count, errp); -} - #ifdef EXT2FS_DEBUG
unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars) diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 1ffdf80f05ff..8cbcbff6817f 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -739,7 +739,6 @@ static inline struct ext2_inode_info *EXT2_I(struct inode *inode) /* balloc.c */ extern int ext2_bg_has_super(struct super_block *sb, int group); extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group); -extern ext2_fsblk_t ext2_new_block(struct inode *, unsigned long, int *); extern ext2_fsblk_t ext2_new_blocks(struct inode *, unsigned long, unsigned long *, int *); extern int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index b1c361e24a30..30a4563f033b 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c @@ -668,7 +668,9 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, /* We need to allocate a new block */ ext2_fsblk_t goal = ext2_group_first_block_no(sb, EXT2_I(inode)->i_block_group); - int block = ext2_new_block(inode, goal, &error); + unsigned long count = 1; + int block = ext2_new_blocks(inode, goal, &count, + &error); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block);
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
This patch introduce introduce flag argument for ext2_new_blocks(), and also introduce EXT2_ALLOC_NORESERVE flags.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 3 ++- fs/ext2/ext2.h | 7 ++++++- fs/ext2/inode.c | 2 +- fs/ext2/xattr.c | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index e90c17f88654..c55f4d0f7cc1 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1222,6 +1222,7 @@ int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, * @goal: given target block(filesystem wide) * @count: target number of blocks to allocate * @errp: error code + * @flag allocate flags * * ext2_new_blocks uses a goal block to assist allocation. If the goal is * free, or there is a free block within 32 blocks of the goal, that block @@ -1231,7 +1232,7 @@ int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, * This function also updates quota and i_blocks field. */ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, - unsigned long *count, int *errp) + unsigned long *count, int *errp, unsigned int flag) { struct buffer_head *bitmap_bh = NULL; struct buffer_head *gdp_bh; diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 8cbcbff6817f..132556f72fbc 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -415,6 +415,11 @@ struct ext2_inode { #define EXT2_ERRORS_PANIC 3 /* Panic */ #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
+/* + * Behaviour if use reservation window in ext2_new_blocks() + */ +#define EXT2_ALLOC_NORESERVE 0x1 + /* * Structure of the super block */ @@ -740,7 +745,7 @@ static inline struct ext2_inode_info *EXT2_I(struct inode *inode) extern int ext2_bg_has_super(struct super_block *sb, int group); extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group); extern ext2_fsblk_t ext2_new_blocks(struct inode *, unsigned long, - unsigned long *, int *); + unsigned long *, int *, unsigned int); extern int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, unsigned int count); extern void ext2_free_blocks (struct inode *, unsigned long, diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 93881b0786ab..091d6a7ab3f0 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -418,7 +418,7 @@ static int ext2_alloc_blocks(struct inode *inode, while (1) { count = target; /* allocating blocks for indirect blocks and direct blocks */ - current_block = ext2_new_blocks(inode,goal,&count,err); + current_block = ext2_new_blocks(inode, goal, &count, err, 0); if (*err) goto failed_out;
diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index 30a4563f033b..4d66c25a62a6 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c @@ -670,7 +670,7 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, EXT2_I(inode)->i_block_group); unsigned long count = 1; int block = ext2_new_blocks(inode, goal, &count, - &error); + &error, 0); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block);
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
There's a issue as follows: Block Allocation Reservation Windows Map (ext2_try_to_allocate_with_rsv): reservation window 0x000000006f105382 start: 0, end: 0 reservation window 0x000000008fd1a555 start: 1044, end: 1059 Window map complete. kernel BUG at fs/ext2/balloc.c:1158! invalid opcode: 0000 [#1] PREEMPT SMP KASAN RIP: 0010:ext2_try_to_allocate_with_rsv.isra.0+0x15c4/0x1800 Call Trace: <TASK> ext2_new_blocks+0x935/0x1690 ext2_new_block+0x73/0xa0 ext2_xattr_set2+0x74f/0x1730 ext2_xattr_set+0x12b6/0x2260 ext2_xattr_user_set+0x9c/0x110 __vfs_setxattr+0x139/0x1d0 __vfs_setxattr_noperm+0xfc/0x370 __vfs_setxattr_locked+0x205/0x2c0 vfs_setxattr+0x19d/0x3b0 do_setxattr+0xff/0x220 setxattr+0x123/0x150 path_setxattr+0x193/0x1e0 __x64_sys_setxattr+0xc8/0x170 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
Above issue may happens as follows: setxattr write back ext2_xattr_set ext2_xattr_set2 ext2_new_block ext2_new_blocks ext2_try_to_allocate_with_rsv alloc_new_reservation --> group=0 [0, 1023] rsv [1016, 1023] do_writepages mpage_writepages write_cache_pages __mpage_writepage ext2_get_block ext2_get_blocks ext2_alloc_branch ext2_new_blocks ext2_try_to_allocate_with_rsv alloc_new_reservation -->group=1 [1024, 2047] rsv [1044, 1059] if ((my_rsv->rsv_start > group_last_block) || (my_rsv->rsv_end < group_first_block) rsv_window_dump BUG(); Now ext2 mkwrite delay allocate new blocks. So there maybe allocate blocks when do write back. However, there is no concurrent protection between ext2_xattr_set() and do_writepages(). To solve about issue don't use reservation window when allocate block for xattr.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 15 +++++++++------ fs/ext2/xattr.c | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index c55f4d0f7cc1..4e9a8e996041 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1276,13 +1276,16 @@ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, * it's a regular file, and * the desired window size is greater than 0 (One could use ioctl * command EXT2_IOC_SETRSVSZ to set the window size to 0 to turn off - * reservation on that particular file) + * reservation on that particular file), and unspecified Do not use + * reservation window. */ - block_i = EXT2_I(inode)->i_block_alloc_info; - if (block_i) { - windowsz = block_i->rsv_window_node.rsv_goal_size; - if (windowsz > 0) - my_rsv = &block_i->rsv_window_node; + if (!(flag & EXT2_ALLOC_NORESERVE)) { + block_i = EXT2_I(inode)->i_block_alloc_info; + if (block_i) { + windowsz = block_i->rsv_window_node.rsv_goal_size; + if (windowsz > 0) + my_rsv = &block_i->rsv_window_node; + } }
if (!ext2_has_free_blocks(sbi)) { diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index 4d66c25a62a6..742f7c4cc6d8 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c @@ -669,8 +669,8 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, ext2_fsblk_t goal = ext2_group_first_block_no(sb, EXT2_I(inode)->i_block_group); unsigned long count = 1; - int block = ext2_new_blocks(inode, goal, &count, - &error, 0); + int block = ext2_new_blocks(inode, goal, &count, &error, + EXT2_ALLOC_NORESERVE); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block);
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
There's report BUG in 'ext2_try_to_allocate_with_rsv()', although there's now dump of all reservation windows information. But there's unknown which window is being processed.So this is not helpful for locating the issue. To better analyze the problem, dump the information about reservation window that is being processed. And just bail with error instead of BUG here.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 4e9a8e996041..ec8df91b66b5 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1159,8 +1159,13 @@ ext2_try_to_allocate_with_rsv(struct super_block *sb, unsigned int group,
if ((my_rsv->rsv_start > group_last_block) || (my_rsv->rsv_end < group_first_block)) { + ext2_error(sb, __func__, + "Reservation out of group %u range goal %d fsb[%lu,%lu] rsv[%lu, %lu]", + group, grp_goal, group_first_block, + group_last_block, my_rsv->rsv_start, + my_rsv->rsv_end); rsv_window_dump(&EXT2_SB(sb)->s_rsv_window_root, 1); - BUG(); + return -1; } ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal, &num, &my_rsv->rsv_window);
Ye Bin (4): ext2: remove ext2_new_block() ext2: introduce flag argument for ext2_new_blocks() ext2: fix race between setxattr and write back ext2: dump current reservation window info
fs/ext2/balloc.c | 32 +++++++++++++++++--------------- fs/ext2/ext2.h | 8 ++++++-- fs/ext2/inode.c | 2 +- fs/ext2/xattr.c | 4 +++- 4 files changed, 27 insertions(+), 19 deletions(-)
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
Now, only xattr allocate block use ext2_new_block(), so just opencode it in the xattr code.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 7 ------- fs/ext2/ext2.h | 1 - fs/ext2/xattr.c | 4 +++- 3 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 33db13365c5e..e90c17f88654 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1450,13 +1450,6 @@ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, return 0; }
-ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp) -{ - unsigned long count = 1; - - return ext2_new_blocks(inode, goal, &count, errp); -} - #ifdef EXT2FS_DEBUG
unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars) diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 1ffdf80f05ff..8cbcbff6817f 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -739,7 +739,6 @@ static inline struct ext2_inode_info *EXT2_I(struct inode *inode) /* balloc.c */ extern int ext2_bg_has_super(struct super_block *sb, int group); extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group); -extern ext2_fsblk_t ext2_new_block(struct inode *, unsigned long, int *); extern ext2_fsblk_t ext2_new_blocks(struct inode *, unsigned long, unsigned long *, int *); extern int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index b1c361e24a30..30a4563f033b 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c @@ -668,7 +668,9 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, /* We need to allocate a new block */ ext2_fsblk_t goal = ext2_group_first_block_no(sb, EXT2_I(inode)->i_block_group); - int block = ext2_new_block(inode, goal, &error); + unsigned long count = 1; + int block = ext2_new_blocks(inode, goal, &count, + &error); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block);
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
This patch introduce introduce flag argument for ext2_new_blocks(), and also introduce EXT2_ALLOC_NORESERVE flags.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 3 ++- fs/ext2/ext2.h | 7 ++++++- fs/ext2/inode.c | 2 +- fs/ext2/xattr.c | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index e90c17f88654..c55f4d0f7cc1 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1222,6 +1222,7 @@ int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, * @goal: given target block(filesystem wide) * @count: target number of blocks to allocate * @errp: error code + * @flag allocate flags * * ext2_new_blocks uses a goal block to assist allocation. If the goal is * free, or there is a free block within 32 blocks of the goal, that block @@ -1231,7 +1232,7 @@ int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, * This function also updates quota and i_blocks field. */ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, - unsigned long *count, int *errp) + unsigned long *count, int *errp, unsigned int flag) { struct buffer_head *bitmap_bh = NULL; struct buffer_head *gdp_bh; diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 8cbcbff6817f..132556f72fbc 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -415,6 +415,11 @@ struct ext2_inode { #define EXT2_ERRORS_PANIC 3 /* Panic */ #define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
+/* + * Behaviour if use reservation window in ext2_new_blocks() + */ +#define EXT2_ALLOC_NORESERVE 0x1 + /* * Structure of the super block */ @@ -740,7 +745,7 @@ static inline struct ext2_inode_info *EXT2_I(struct inode *inode) extern int ext2_bg_has_super(struct super_block *sb, int group); extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group); extern ext2_fsblk_t ext2_new_blocks(struct inode *, unsigned long, - unsigned long *, int *); + unsigned long *, int *, unsigned int); extern int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk, unsigned int count); extern void ext2_free_blocks (struct inode *, unsigned long, diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 93881b0786ab..091d6a7ab3f0 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -418,7 +418,7 @@ static int ext2_alloc_blocks(struct inode *inode, while (1) { count = target; /* allocating blocks for indirect blocks and direct blocks */ - current_block = ext2_new_blocks(inode,goal,&count,err); + current_block = ext2_new_blocks(inode, goal, &count, err, 0); if (*err) goto failed_out;
diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index 30a4563f033b..4d66c25a62a6 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c @@ -670,7 +670,7 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, EXT2_I(inode)->i_block_group); unsigned long count = 1; int block = ext2_new_blocks(inode, goal, &count, - &error); + &error, 0); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block);
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
There's a issue as follows: Block Allocation Reservation Windows Map (ext2_try_to_allocate_with_rsv): reservation window 0x000000006f105382 start: 0, end: 0 reservation window 0x000000008fd1a555 start: 1044, end: 1059 Window map complete. kernel BUG at fs/ext2/balloc.c:1158! invalid opcode: 0000 [#1] PREEMPT SMP KASAN RIP: 0010:ext2_try_to_allocate_with_rsv.isra.0+0x15c4/0x1800 Call Trace: <TASK> ext2_new_blocks+0x935/0x1690 ext2_new_block+0x73/0xa0 ext2_xattr_set2+0x74f/0x1730 ext2_xattr_set+0x12b6/0x2260 ext2_xattr_user_set+0x9c/0x110 __vfs_setxattr+0x139/0x1d0 __vfs_setxattr_noperm+0xfc/0x370 __vfs_setxattr_locked+0x205/0x2c0 vfs_setxattr+0x19d/0x3b0 do_setxattr+0xff/0x220 setxattr+0x123/0x150 path_setxattr+0x193/0x1e0 __x64_sys_setxattr+0xc8/0x170 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x63/0xcd
Above issue may happens as follows: setxattr write back ext2_xattr_set ext2_xattr_set2 ext2_new_block ext2_new_blocks ext2_try_to_allocate_with_rsv alloc_new_reservation --> group=0 [0, 1023] rsv [1016, 1023] do_writepages mpage_writepages write_cache_pages __mpage_writepage ext2_get_block ext2_get_blocks ext2_alloc_branch ext2_new_blocks ext2_try_to_allocate_with_rsv alloc_new_reservation -->group=1 [1024, 2047] rsv [1044, 1059] if ((my_rsv->rsv_start > group_last_block) || (my_rsv->rsv_end < group_first_block) rsv_window_dump BUG(); Now ext2 mkwrite delay allocate new blocks. So there maybe allocate blocks when do write back. However, there is no concurrent protection between ext2_xattr_set() and do_writepages(). To solve about issue don't use reservation window when allocate block for xattr.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 15 +++++++++------ fs/ext2/xattr.c | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index c55f4d0f7cc1..4e9a8e996041 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1276,13 +1276,16 @@ ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal, * it's a regular file, and * the desired window size is greater than 0 (One could use ioctl * command EXT2_IOC_SETRSVSZ to set the window size to 0 to turn off - * reservation on that particular file) + * reservation on that particular file), and unspecified Do not use + * reservation window. */ - block_i = EXT2_I(inode)->i_block_alloc_info; - if (block_i) { - windowsz = block_i->rsv_window_node.rsv_goal_size; - if (windowsz > 0) - my_rsv = &block_i->rsv_window_node; + if (!(flag & EXT2_ALLOC_NORESERVE)) { + block_i = EXT2_I(inode)->i_block_alloc_info; + if (block_i) { + windowsz = block_i->rsv_window_node.rsv_goal_size; + if (windowsz > 0) + my_rsv = &block_i->rsv_window_node; + } }
if (!ext2_has_free_blocks(sbi)) { diff --git a/fs/ext2/xattr.c b/fs/ext2/xattr.c index 4d66c25a62a6..742f7c4cc6d8 100644 --- a/fs/ext2/xattr.c +++ b/fs/ext2/xattr.c @@ -669,8 +669,8 @@ ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, ext2_fsblk_t goal = ext2_group_first_block_no(sb, EXT2_I(inode)->i_block_group); unsigned long count = 1; - int block = ext2_new_blocks(inode, goal, &count, - &error, 0); + int block = ext2_new_blocks(inode, goal, &count, &error, + EXT2_ALLOC_NORESERVE); if (error) goto cleanup; ea_idebug(inode, "creating block %d", block);
hulk inclusion category: feature bugzilla: 189105, https://gitee.com/openeuler/kernel/issues/I7TN3J
--------------------------------
There's report BUG in 'ext2_try_to_allocate_with_rsv()', although there's now dump of all reservation windows information. But there's unknown which window is being processed.So this is not helpful for locating the issue. To better analyze the problem, dump the information about reservation window that is being processed. And just bail with error instead of BUG here.
Signed-off-by: Ye Bin yebin10@huawei.com --- fs/ext2/balloc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 4e9a8e996041..ec8df91b66b5 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -1159,8 +1159,13 @@ ext2_try_to_allocate_with_rsv(struct super_block *sb, unsigned int group,
if ((my_rsv->rsv_start > group_last_block) || (my_rsv->rsv_end < group_first_block)) { + ext2_error(sb, __func__, + "Reservation out of group %u range goal %d fsb[%lu,%lu] rsv[%lu, %lu]", + group, grp_goal, group_first_block, + group_last_block, my_rsv->rsv_start, + my_rsv->rsv_end); rsv_window_dump(&EXT2_SB(sb)->s_rsv_window_root, 1); - BUG(); + return -1; } ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal, &num, &my_rsv->rsv_window);
反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://gitee.com/openeuler/kernel/pulls/1976 邮件列表地址:https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/U...
FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://gitee.com/openeuler/kernel/pulls/1976 Mailing list address: https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/U...