From: Robin Dong <[email protected]>
The kernel will crash on
ext4_mb_mark_diskspace_used:
BUG_ON(ac->ac_b_ex.fe_len <= 0);
after we set /sys/fs/ext4/sda/mb_group_prealloc to zero and create new files in an ext4 filesystem.
The reason is: ac_b_ex.fe_len also set to zero(mb_group_prealloc) in ext4_mb_normalize_group_request
because the ac_flags contains EXT4_MB_HINT_GROUP_ALLOC.
I think when someone set mb_group_prealloc to zero, it means DO NOT USE GROUP PREALLOCATION,
so we should set alloc-strategy to STREAM in this case.
Signed-off-by: Robin Dong <[email protected]>
---
fs/ext4/mballoc.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 17a5a57..6b58247 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -3969,6 +3969,11 @@ static void ext4_mb_group_or_file(struct ext4_allocation_context *ac)
return;
}
+ if (sbi->s_mb_group_prealloc <= 0) {
+ ac->ac_flags |= EXT4_MB_STREAM_ALLOC;
+ return;
+ }
+
/* don't use group allocation for large files */
size = max(size, isize);
if (size > sbi->s_mb_stream_request) {
--
1.7.4.1
From: Robin Dong <[email protected]>
The argument 'count' in function ext4_mb_generate_from_pa looks useless,
so clean it.
Signed-off-by: Robin Dong <[email protected]>
---
fs/ext4/mballoc.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 6b58247..d0fc76e 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -3312,7 +3312,6 @@ void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
ext4_group_t groupnr;
ext4_grpblk_t start;
int preallocated = 0;
- int count = 0;
int len;
/* all form of preallocation discards first load group,
@@ -3335,7 +3334,6 @@ void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
BUG_ON(groupnr != group);
ext4_set_bits(bitmap, start, len);
preallocated += len;
- count++;
}
mb_debug(1, "prellocated %u for group %u\n", preallocated, group);
}
--
1.7.4.1
From: Robin Dong <[email protected]>
The argument 'ord' in function mb_find_extent is redundant,
so remove it.
Signed-off-by: Robin Dong <[email protected]>
---
fs/ext4/mballoc.c | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index d0fc76e..99d123a 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -1390,7 +1390,6 @@ static int mb_find_extent(struct ext4_buddy *e4b, int order, int block,
{
int next = block;
int max;
- int ord;
void *buddy;
assert_spin_locked(ext4_group_lock_ptr(e4b->bd_sb, e4b->bd_group));
@@ -1432,9 +1431,8 @@ static int mb_find_extent(struct ext4_buddy *e4b, int order, int block,
if (mb_test_bit(next, EXT4_MB_BITMAP(e4b)))
break;
- ord = mb_find_order_for_block(e4b, next);
+ order = mb_find_order_for_block(e4b, next);
- order = ord;
block = next >> order;
ex->fe_len += 1 << order;
}
--
1.7.4.1
From: Robin Dong <[email protected]>
The comment says the bit should be 0, but the after code assert the bit to be 1.
This makes people confused, so fix it.
Signed-off-by: Robin Dong <[email protected]>
---
fs/ext4/mballoc.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 99d123a..0b3d0ee 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -580,7 +580,7 @@ static int __mb_check_buddy(struct ext4_buddy *e4b, char *file,
continue;
}
- /* both bits in buddy2 must be 0 */
+ /* both bits in buddy2 must be 1 */
MB_CHECK_ASSERT(mb_test_bit(i << 1, buddy2));
MB_CHECK_ASSERT(mb_test_bit((i << 1) + 1, buddy2));
--
1.7.4.1
On Thu, Sep 15, 2011 at 03:09:37PM +0800, Robin Dong wrote:
> From: Robin Dong <[email protected]>
>
> The kernel will crash on
>
> ext4_mb_mark_diskspace_used:
> BUG_ON(ac->ac_b_ex.fe_len <= 0);
>
> after we set /sys/fs/ext4/sda/mb_group_prealloc to zero and create new files in an ext4 filesystem.
>
> The reason is: ac_b_ex.fe_len also set to zero(mb_group_prealloc) in ext4_mb_normalize_group_request
> because the ac_flags contains EXT4_MB_HINT_GROUP_ALLOC.
>
> I think when someone set mb_group_prealloc to zero, it means DO NOT USE GROUP PREALLOCATION,
> so we should set alloc-strategy to STREAM in this case.
>
> Signed-off-by: Robin Dong <[email protected]>
Thanks, applied.
- Ted
On Thu, Sep 15, 2011 at 03:09:38PM +0800, Robin Dong wrote:
> From: Robin Dong <[email protected]>
>
> The argument 'count' in function ext4_mb_generate_from_pa looks useless,
> so clean it.
>
> Signed-off-by: Robin Dong <[email protected]>
Thanks, applied.
- Ted
On Thu, Sep 15, 2011 at 03:09:39PM +0800, Robin Dong wrote:
> From: Robin Dong <[email protected]>
>
> The argument 'ord' in function mb_find_extent is redundant,
> so remove it.
>
> Signed-off-by: Robin Dong <[email protected]>
Thanks, applied.
In both this and the previous patch, I changed "argument" to
"variable" for clarity/correctness in the git commit log.
- Ted
On Thu, Sep 15, 2011 at 03:09:40PM +0800, Robin Dong wrote:
> From: Robin Dong <[email protected]>
>
> The comment says the bit should be 0, but the after code assert the bit to be 1.
> This makes people confused, so fix it.
>
> Signed-off-by: Robin Dong <[email protected]>
Thanks, applied.
- Ted