* [PATCH 0/2] ext4: align preallocation size to stripe width
@ 2025-12-08 8:32 Yu Kuai
2025-12-08 8:32 ` [PATCH 1/2] ext4: refactor size prediction into helper functions Yu Kuai
2025-12-08 8:32 ` [PATCH 2/2] ext4: align preallocation size to stripe width Yu Kuai
0 siblings, 2 replies; 5+ messages in thread
From: Yu Kuai @ 2025-12-08 8:32 UTC (permalink / raw)
To: tytso, adilger.kernel, linux-ext4; +Cc: linux-kernel, yukuai
Yu Kuai (2):
ext4: refactor size prediction into helper functions
ext4: align preallocation size to stripe width
fs/ext4/mballoc.c | 159 ++++++++++++++++++++++++++++++++++------------
1 file changed, 117 insertions(+), 42 deletions(-)
--
2.51.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] ext4: refactor size prediction into helper functions
2025-12-08 8:32 [PATCH 0/2] ext4: align preallocation size to stripe width Yu Kuai
@ 2025-12-08 8:32 ` Yu Kuai
2025-12-08 8:32 ` [PATCH 2/2] ext4: align preallocation size to stripe width Yu Kuai
1 sibling, 0 replies; 5+ messages in thread
From: Yu Kuai @ 2025-12-08 8:32 UTC (permalink / raw)
To: tytso, adilger.kernel, linux-ext4; +Cc: linux-kernel, yukuai
The ext4_mb_normalize_request() function contains a large if-else
ladder for predicting file size and uses a macro NRL_CHECK_SIZE.
Factor these out into proper helper functions to improve code
readability and maintainability.
This patch introduces:
- ext4_mb_check_size(): static inline function replacing NRL_CHECK_SIZE macro
- ext4_mb_predict_file_size(): extracts size prediction logic
No functional change.
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
---
fs/ext4/mballoc.c | 101 +++++++++++++++++++++++++++-------------------
1 file changed, 60 insertions(+), 41 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index 9087183602e4..eb46a4f5fb4f 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -4489,6 +4489,63 @@ ext4_mb_pa_adjust_overlap(struct ext4_allocation_context *ac,
*end = new_end;
}
+/*
+ * Check if request size allows for chunk-based allocation
+ */
+static inline bool ext4_mb_check_size(loff_t req, loff_t size,
+ int max, int chunk_size)
+{
+ return (req <= size) || (max <= chunk_size);
+}
+
+/*
+ * Predict file size for preallocation. Returns the predicted size
+ * in bytes and sets start_off if alignment is needed for large files.
+ */
+static loff_t ext4_mb_predict_file_size(struct ext4_sb_info *sbi,
+ struct ext4_allocation_context *ac,
+ loff_t size, loff_t *start_off)
+{
+ int bsbits = ac->ac_sb->s_blocksize_bits;
+ int max = 2 << bsbits;
+
+ *start_off = 0;
+
+ if (size <= 16 * 1024) {
+ size = 16 * 1024;
+ } else if (size <= 32 * 1024) {
+ size = 32 * 1024;
+ } else if (size <= 64 * 1024) {
+ size = 64 * 1024;
+ } else if (size <= 128 * 1024) {
+ size = 128 * 1024;
+ } else if (size <= 256 * 1024) {
+ size = 256 * 1024;
+ } else if (size <= 512 * 1024) {
+ size = 512 * 1024;
+ } else if (size <= 1024 * 1024) {
+ size = 1024 * 1024;
+ } else if (ext4_mb_check_size(size, 4 * 1024 * 1024, max, 2 * 1024)) {
+ *start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
+ (21 - bsbits)) << 21;
+ size = 2 * 1024 * 1024;
+ } else if (ext4_mb_check_size(size, 8 * 1024 * 1024, max, 4 * 1024)) {
+ *start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
+ (22 - bsbits)) << 22;
+ size = 4 * 1024 * 1024;
+ } else if (ext4_mb_check_size(EXT4_C2B(sbi, ac->ac_o_ex.fe_len),
+ (8<<20)>>bsbits, max, 8 * 1024)) {
+ *start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
+ (23 - bsbits)) << 23;
+ size = 8 * 1024 * 1024;
+ } else {
+ *start_off = (loff_t)ac->ac_o_ex.fe_logical << bsbits;
+ size = (loff_t)EXT4_C2B(sbi, ac->ac_o_ex.fe_len) << bsbits;
+ }
+
+ return size;
+}
+
/*
* Normalization means making request better in terms of
* size and alignment
@@ -4500,7 +4557,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
struct ext4_super_block *es = sbi->s_es;
int bsbits, max;
- loff_t size, start_off, end;
+ loff_t size, start_off = 0, end;
loff_t orig_size __maybe_unused;
ext4_lblk_t start;
@@ -4533,47 +4590,9 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
size = i_size_read(ac->ac_inode);
orig_size = size;
- /* max size of free chunks */
- max = 2 << bsbits;
+ /* Predict file size for preallocation */
+ size = ext4_mb_predict_file_size(sbi, ac, size, &start_off);
-#define NRL_CHECK_SIZE(req, size, max, chunk_size) \
- (req <= (size) || max <= (chunk_size))
-
- /* first, try to predict filesize */
- /* XXX: should this table be tunable? */
- start_off = 0;
- if (size <= 16 * 1024) {
- size = 16 * 1024;
- } else if (size <= 32 * 1024) {
- size = 32 * 1024;
- } else if (size <= 64 * 1024) {
- size = 64 * 1024;
- } else if (size <= 128 * 1024) {
- size = 128 * 1024;
- } else if (size <= 256 * 1024) {
- size = 256 * 1024;
- } else if (size <= 512 * 1024) {
- size = 512 * 1024;
- } else if (size <= 1024 * 1024) {
- size = 1024 * 1024;
- } else if (NRL_CHECK_SIZE(size, 4 * 1024 * 1024, max, 2 * 1024)) {
- start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
- (21 - bsbits)) << 21;
- size = 2 * 1024 * 1024;
- } else if (NRL_CHECK_SIZE(size, 8 * 1024 * 1024, max, 4 * 1024)) {
- start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
- (22 - bsbits)) << 22;
- size = 4 * 1024 * 1024;
- } else if (NRL_CHECK_SIZE(EXT4_C2B(sbi, ac->ac_o_ex.fe_len),
- (8<<20)>>bsbits, max, 8 * 1024)) {
- start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
- (23 - bsbits)) << 23;
- size = 8 * 1024 * 1024;
- } else {
- start_off = (loff_t) ac->ac_o_ex.fe_logical << bsbits;
- size = (loff_t) EXT4_C2B(sbi,
- ac->ac_o_ex.fe_len) << bsbits;
- }
size = size >> bsbits;
start = start_off >> bsbits;
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] ext4: align preallocation size to stripe width
2025-12-08 8:32 [PATCH 0/2] ext4: align preallocation size to stripe width Yu Kuai
2025-12-08 8:32 ` [PATCH 1/2] ext4: refactor size prediction into helper functions Yu Kuai
@ 2025-12-08 8:32 ` Yu Kuai
2025-12-10 15:49 ` kernel test robot
2025-12-11 23:08 ` kernel test robot
1 sibling, 2 replies; 5+ messages in thread
From: Yu Kuai @ 2025-12-08 8:32 UTC (permalink / raw)
To: tytso, adilger.kernel, linux-ext4; +Cc: linux-kernel, yukuai
When stripe width (io_opt) is configured, align the predicted
preallocation size to stripe boundaries. This ensures optimal I/O
performance on RAID and other striped storage devices by avoiding
partial stripe operations.
The current implementation uses hardcoded size predictions (16KB, 32KB,
64KB, etc.) that are not stripe-aware. This causes physical block
offsets on disk to be misaligned to stripe boundaries, leading to
read-modify-write penalties on RAID arrays and reduced performance.
This patch makes size prediction stripe-aware by using multiples of
stripe size (1x, 2x, 4x, 8x, 16x, 32x) when s_stripe is set.
Additionally, the start offset is aligned to stripe boundaries using
rounddown(), which works correctly for both power-of-2 and non-power-of-2
stripe sizes. For devices without stripe configuration, the original
behavior is preserved.
The predicted size is limited to max free chunk size (2 << bsbits) to
ensure reasonable allocation requests, with the limit rounded down to
maintain stripe alignment.
Test case:
Device: 32-disk RAID5, 64KB chunk size
Stripe: 496 blocks (31 data disks × 16 blocks/disk)
Before patch (misaligned physical offsets):
ext: logical_offset: physical_offset: length:
0: 0.. 63487: 34816.. 98303: 63488
1: 63488..126975: 100352..163839: 63488
2: 126976..190463: 165888..229375: 63488
3: 190464..253951: 231424..294911: 63488
4: 253952..262143: 296960..305151: 8192
Physical offsets: 34816 % 496 = 96 (misaligned)
100352 % 496 = 160 (misaligned)
165888 % 496 = 224 (misaligned)
→ Causes partial stripe writes on RAID
After patch (aligned physical offsets):
ext: logical_offset: physical_offset: length:
0: 0.. 17855: 9920.. 27775: 17856
1: 17856.. 42159: 34224.. 58527: 24304
2: 42160.. 73407: 65968.. 97215: 31248
3: 73408.. 97711: 99696..123999: 24304
... (all extents aligned until EOF)
Physical offsets: 9920 % 496 = 0 (aligned)
34224 % 496 = 0 (aligned)
65968 % 496 = 0 (aligned)
Extent lengths: 17856=496×36, 24304=496×49, 31248=496×63
→ Optimal RAID performance, no partial stripe writes
Benefits:
- Eliminates read-modify-write operations on RAID arrays
- Improves sequential write performance on striped devices
- Maintains proper alignment throughout file lifetime
- Works with any stripe size (power-of-2 or not)
Signed-off-by: Yu Kuai <yukuai@fnnas.com>
---
fs/ext4/mballoc.c | 60 +++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 58 insertions(+), 2 deletions(-)
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index eb46a4f5fb4f..dbd0b239cc96 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -4500,7 +4500,10 @@ static inline bool ext4_mb_check_size(loff_t req, loff_t size,
/*
* Predict file size for preallocation. Returns the predicted size
- * in bytes and sets start_off if alignment is needed for large files.
+ * in bytes. When stripe width (io_opt) is configured, returns sizes
+ * that are multiples of stripe for optimal RAID performance.
+ *
+ * Sets start_off if alignment is needed for large files.
*/
static loff_t ext4_mb_predict_file_size(struct ext4_sb_info *sbi,
struct ext4_allocation_context *ac,
@@ -4511,6 +4514,59 @@ static loff_t ext4_mb_predict_file_size(struct ext4_sb_info *sbi,
*start_off = 0;
+ /*
+ * For RAID/striped devices, align preallocation size to stripe
+ * width (io_opt) for optimal I/O performance. Use power-of-2
+ * multiples of stripe size for size prediction.
+ */
+ if (sbi->s_stripe) {
+ loff_t stripe_bytes = (loff_t)sbi->s_stripe << bsbits;
+ loff_t max_size = (loff_t)max << bsbits;
+
+ /*
+ * TODO: If stripe is larger than max chunk size, we can't
+ * do stripe-aligned allocation. Fall back to traditional
+ * size prediction. This can happen with very large stripe
+ * configurations on small block sizes.
+ */
+ if (stripe_bytes > max_size)
+ goto no_stripe;
+
+ if (size <= stripe_bytes) {
+ size = stripe_bytes;
+ } else if (size <= stripe_bytes * 2) {
+ size = stripe_bytes * 2;
+ } else if (size <= stripe_bytes * 4) {
+ size = stripe_bytes * 4;
+ } else if (size <= stripe_bytes * 8) {
+ size = stripe_bytes * 8;
+ } else if (size <= stripe_bytes * 16) {
+ size = stripe_bytes * 16;
+ } else if (size <= stripe_bytes * 32) {
+ size = stripe_bytes * 32;
+ } else {
+ size = roundup(size, stripe_bytes);
+ }
+
+ /*
+ * Limit size to max free chunk size, rounded down to
+ * stripe alignment.
+ */
+ if (size > max_size)
+ size = rounddown(max_size, stripe_bytes);
+
+ /*
+ * Align start offset to stripe boundary for large allocations
+ * to ensure both start and size are stripe-aligned.
+ */
+ *start_off = rounddown((loff_t)ac->ac_o_ex.fe_logical << bsbits,
+ stripe_bytes);
+
+ return size;
+ }
+
+no_stripe:
+ /* No stripe: use traditional hardcoded size prediction */
if (size <= 16 * 1024) {
size = 16 * 1024;
} else if (size <= 32 * 1024) {
@@ -4556,7 +4612,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
{
struct ext4_sb_info *sbi = EXT4_SB(ac->ac_sb);
struct ext4_super_block *es = sbi->s_es;
- int bsbits, max;
+ int bsbits;
loff_t size, start_off = 0, end;
loff_t orig_size __maybe_unused;
ext4_lblk_t start;
--
2.51.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] ext4: align preallocation size to stripe width
2025-12-08 8:32 ` [PATCH 2/2] ext4: align preallocation size to stripe width Yu Kuai
@ 2025-12-10 15:49 ` kernel test robot
2025-12-11 23:08 ` kernel test robot
1 sibling, 0 replies; 5+ messages in thread
From: kernel test robot @ 2025-12-10 15:49 UTC (permalink / raw)
To: Yu Kuai, tytso, adilger.kernel, linux-ext4
Cc: oe-kbuild-all, linux-kernel, yukuai
Hi Yu,
kernel test robot noticed the following build errors:
[auto build test ERROR on tytso-ext4/dev]
[also build test ERROR on linus/master v6.18 next-20251210]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Yu-Kuai/ext4-refactor-size-prediction-into-helper-functions/20251208-163553
base: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git dev
patch link: https://lore.kernel.org/r/20251208083246.320965-3-yukuai%40fnnas.com
patch subject: [PATCH 2/2] ext4: align preallocation size to stripe width
config: i386-randconfig-001-20251210 (https://download.01.org/0day-ci/archive/20251210/202512102331.yweFnVTU-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251210/202512102331.yweFnVTU-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512102331.yweFnVTU-lkp@intel.com/
All errors (new ones prefixed by >>):
ld: fs/ext4/mballoc.o: in function `ext4_mb_predict_file_size':
>> fs/ext4/mballoc.c:4570:(.text+0xc37): undefined reference to `__moddi3'
>> ld: fs/ext4/mballoc.c:4578:(.text+0xc7c): undefined reference to `__moddi3'
ld: fs/ext4/mballoc.c:4584:(.text+0xcf2): undefined reference to `__moddi3'
vim +4570 fs/ext4/mballoc.c
4522
4523 /*
4524 * Predict file size for preallocation. Returns the predicted size
4525 * in bytes. When stripe width (io_opt) is configured, returns sizes
4526 * that are multiples of stripe for optimal RAID performance.
4527 *
4528 * Sets start_off if alignment is needed for large files.
4529 */
4530 static loff_t ext4_mb_predict_file_size(struct ext4_sb_info *sbi,
4531 struct ext4_allocation_context *ac,
4532 loff_t size, loff_t *start_off)
4533 {
4534 int bsbits = ac->ac_sb->s_blocksize_bits;
4535 int max = 2 << bsbits;
4536
4537 *start_off = 0;
4538
4539 /*
4540 * For RAID/striped devices, align preallocation size to stripe
4541 * width (io_opt) for optimal I/O performance. Use power-of-2
4542 * multiples of stripe size for size prediction.
4543 */
4544 if (sbi->s_stripe) {
4545 loff_t stripe_bytes = (loff_t)sbi->s_stripe << bsbits;
4546 loff_t max_size = (loff_t)max << bsbits;
4547
4548 /*
4549 * TODO: If stripe is larger than max chunk size, we can't
4550 * do stripe-aligned allocation. Fall back to traditional
4551 * size prediction. This can happen with very large stripe
4552 * configurations on small block sizes.
4553 */
4554 if (stripe_bytes > max_size)
4555 goto no_stripe;
4556
4557 if (size <= stripe_bytes) {
4558 size = stripe_bytes;
4559 } else if (size <= stripe_bytes * 2) {
4560 size = stripe_bytes * 2;
4561 } else if (size <= stripe_bytes * 4) {
4562 size = stripe_bytes * 4;
4563 } else if (size <= stripe_bytes * 8) {
4564 size = stripe_bytes * 8;
4565 } else if (size <= stripe_bytes * 16) {
4566 size = stripe_bytes * 16;
4567 } else if (size <= stripe_bytes * 32) {
4568 size = stripe_bytes * 32;
4569 } else {
> 4570 size = roundup(size, stripe_bytes);
4571 }
4572
4573 /*
4574 * Limit size to max free chunk size, rounded down to
4575 * stripe alignment.
4576 */
4577 if (size > max_size)
> 4578 size = rounddown(max_size, stripe_bytes);
4579
4580 /*
4581 * Align start offset to stripe boundary for large allocations
4582 * to ensure both start and size are stripe-aligned.
4583 */
4584 *start_off = rounddown((loff_t)ac->ac_o_ex.fe_logical << bsbits,
4585 stripe_bytes);
4586
4587 return size;
4588 }
4589
4590 no_stripe:
4591 /* No stripe: use traditional hardcoded size prediction */
4592 if (size <= 16 * 1024) {
4593 size = 16 * 1024;
4594 } else if (size <= 32 * 1024) {
4595 size = 32 * 1024;
4596 } else if (size <= 64 * 1024) {
4597 size = 64 * 1024;
4598 } else if (size <= 128 * 1024) {
4599 size = 128 * 1024;
4600 } else if (size <= 256 * 1024) {
4601 size = 256 * 1024;
4602 } else if (size <= 512 * 1024) {
4603 size = 512 * 1024;
4604 } else if (size <= 1024 * 1024) {
4605 size = 1024 * 1024;
4606 } else if (ext4_mb_check_size(size, 4 * 1024 * 1024, max, 2 * 1024)) {
4607 *start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
4608 (21 - bsbits)) << 21;
4609 size = 2 * 1024 * 1024;
4610 } else if (ext4_mb_check_size(size, 8 * 1024 * 1024, max, 4 * 1024)) {
4611 *start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
4612 (22 - bsbits)) << 22;
4613 size = 4 * 1024 * 1024;
4614 } else if (ext4_mb_check_size(EXT4_C2B(sbi, ac->ac_o_ex.fe_len),
4615 (8<<20)>>bsbits, max, 8 * 1024)) {
4616 *start_off = ((loff_t)ac->ac_o_ex.fe_logical >>
4617 (23 - bsbits)) << 23;
4618 size = 8 * 1024 * 1024;
4619 } else {
4620 *start_off = (loff_t)ac->ac_o_ex.fe_logical << bsbits;
4621 size = (loff_t)EXT4_C2B(sbi, ac->ac_o_ex.fe_len) << bsbits;
4622 }
4623
4624 return size;
4625 }
4626
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] ext4: align preallocation size to stripe width
2025-12-08 8:32 ` [PATCH 2/2] ext4: align preallocation size to stripe width Yu Kuai
2025-12-10 15:49 ` kernel test robot
@ 2025-12-11 23:08 ` kernel test robot
1 sibling, 0 replies; 5+ messages in thread
From: kernel test robot @ 2025-12-11 23:08 UTC (permalink / raw)
To: Yu Kuai, tytso, adilger.kernel, linux-ext4
Cc: oe-kbuild-all, linux-kernel, yukuai
Hi Yu,
kernel test robot noticed the following build errors:
[auto build test ERROR on tytso-ext4/dev]
[also build test ERROR on linus/master v6.18 next-20251211]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Yu-Kuai/ext4-refactor-size-prediction-into-helper-functions/20251208-163553
base: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git dev
patch link: https://lore.kernel.org/r/20251208083246.320965-3-yukuai%40fnnas.com
patch subject: [PATCH 2/2] ext4: align preallocation size to stripe width
config: arm-randconfig-r072-20251210 (https://download.01.org/0day-ci/archive/20251212/202512120613.mM5COVWV-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 12.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251212/202512120613.mM5COVWV-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202512120613.mM5COVWV-lkp@intel.com/
All errors (new ones prefixed by >>):
arm-linux-gnueabi-ld: fs/ext4/mballoc.o: in function `ext4_mb_predict_file_size':
>> mballoc.c:(.text+0x242): undefined reference to `__aeabi_ldivmod'
arm-linux-gnueabi-ld: (__aeabi_ldivmod): Unknown destination type (ARM/Thumb) in fs/ext4/mballoc.o
>> mballoc.c:(.text+0x242): dangerous relocation: unsupported relocation
>> arm-linux-gnueabi-ld: mballoc.c:(.text+0x268): undefined reference to `__aeabi_ldivmod'
arm-linux-gnueabi-ld: (__aeabi_ldivmod): Unknown destination type (ARM/Thumb) in fs/ext4/mballoc.o
mballoc.c:(.text+0x268): dangerous relocation: unsupported relocation
arm-linux-gnueabi-ld: mballoc.c:(.text+0x29c): undefined reference to `__aeabi_ldivmod'
arm-linux-gnueabi-ld: (__aeabi_ldivmod): Unknown destination type (ARM/Thumb) in fs/ext4/mballoc.o
mballoc.c:(.text+0x29c): dangerous relocation: unsupported relocation
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-12-11 23:08 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-08 8:32 [PATCH 0/2] ext4: align preallocation size to stripe width Yu Kuai
2025-12-08 8:32 ` [PATCH 1/2] ext4: refactor size prediction into helper functions Yu Kuai
2025-12-08 8:32 ` [PATCH 2/2] ext4: align preallocation size to stripe width Yu Kuai
2025-12-10 15:49 ` kernel test robot
2025-12-11 23:08 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox