From: sashiko-bot@kernel.org
To: "Theodore Ts'o" <tytso@mit.edu>,
"Ext4 Developers List" <linux-ext4@vger.kernel.org>
Subject: Re: [PATCH 06/27] ext4: expand KUnit tests for fs/ext4/mballoc.c
Date: Thu, 12 Nov 2026 04:26:04 +0000 [thread overview]
Message-ID: <sashiko-outbox-210334@kernel.org> (raw)
In-Reply-To: <20261112040638.1576836-7-tytso@mit.edu>
Thank you for your contribution! Sashiko AI review found 6 potential
issues to consider:
- [Medium] ext4: test_mb_good_group() and test_mb_prefetch() fail on
16K/64K PAGE_SIZE
- [Low] ext4: unpinned per-CPU locality group lookups across sleeps in
mballoc-test.c
- [Low] ext4: unaligned __u32 accesses in mb_set_bits() and
mb_test_and_clear_bits()
- [Low] ext4: test_mb_regular_allocator() step 3 skips CR_BEST_AVAIL_LEN
trimming
- [Low] ext4: missing bb_free update in
test_mb_simple_and_aligned_scan()
- [Low] ext4: unused *_test() wrapper functions in fs/ext4/mballoc.c
--
commit 72a0b9666c2cc1afd5fa22724c492669c1b39ccf
Author: Theodore Ts'o <tytso@mit.edu>
ext4: expand KUnit tests for fs/ext4/mballoc.c
This commit expands the ext4_mballoc_test KUnit suite in
fs/ext4/mballoc-test.c with 25 new parameterized tests and exports the
corresponding helper wrappers from fs/ext4/mballoc.c.
> diff --git a/fs/ext4/mballoc-test.c b/fs/ext4/mballoc-test.c
> index d31780075c21e..402f4efdf25a4 100644
> --- a/fs/ext4/mballoc-test.c
> +++ b/fs/ext4/mballoc-test.c
[ ... ]
> @@ -949,6 +1008,1747 @@ static void test_mb_mark_used_cost(struct kunit *test)
> ext4_mb_unload_buddy_test(&e4b);
> }
>
> +static void test_mb_bit_ops(struct kunit *test)
> +{
> + u8 *buf;
> + void *unaligned;
> + int bit, i;
> +
> + buf = kunit_kzalloc(test, 128, GFP_KERNEL);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
> +
> + /*
> + * Use an unaligned pointer (offset by 3 bytes) to exercise
> + * mb_correct_addr_and_bit() on 64-bit/32-bit architectures.
> + */
> + unaligned = buf + 3;
[ ... ]
> + /* Multi-word unaligned range spanning head bits, 32-bit words, and tail */
> + mb_set_bits(unaligned, 5, 75);
> + KUNIT_EXPECT_EQ(test, mb_find_next_bit_test(unaligned, 256, 0), 5);
> + KUNIT_EXPECT_EQ(test, mb_find_next_zero_bit_test(unaligned, 256, 5), 80);
> + /* Clamping when no zero bit exists before max */
> + KUNIT_EXPECT_EQ(test, mb_find_next_zero_bit_test(unaligned, 50, 5), 50);
> +
> + /* Clear a sub-range across 32-bit boundaries */
> + mb_clear_bits_test(unaligned, 13, 50);
> + for (i = 0; i < 100; i++) {
> + int expected = (i >= 5 && i < 13) || (i >= 63 && i < 80);
> +
> + KUNIT_EXPECT_EQ(test, !!mb_test_bit_test(i, unaligned), expected);
> + }
> +}
> +
> +static void test_mb_test_and_clear_bits(struct kunit *test)
> +{
> + u8 *buf;
> + void *bm;
> + int ret, i;
> +
> + buf = kunit_kzalloc(test, 128, GFP_KERNEL);
> + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
> + bm = buf + 3;
> +
> + /* Case 1: All bits in range [5, 85) are set -> returns -1 and clears all */
> + memset(buf, 0xff, 128);
> + ret = mb_test_and_clear_bits_test(bm, 5, 80);
[Severity: Low]
Does passing buf + 3 to mb_set_bits() and mb_test_and_clear_bits_test()
cause misaligned 32-bit accesses?
Unlike the single-bit helpers that align the base address via
mb_correct_addr_and_bit(), mb_set_bits() and mb_test_and_clear_bits() take
a 32-bit word fast path when (cur & 31) == 0 && (len - cur) >= 32 and
dereference __u32 *addr = bm + (cur >> 3) directly. When cur reaches 32,
addr is buf + 7, which triggers UBSAN alignment warnings under
CONFIG_UBSAN_ALIGNMENT or alignment faults on strict-alignment
architectures.
[ ... ]
> +static void test_mb_good_group(struct kunit *test)
> +{
> + struct super_block *sb = (struct super_block *)test->priv;
> + struct ext4_sb_info *sbi = EXT4_SB(sb);
> + struct ext4_buddy e4b;
> + struct ext4_allocation_context ac = {};
> + struct ext4_group_info *grp1, *grp2;
> + int ret;
> +
> + if (sb->s_blocksize > PAGE_SIZE)
> + kunit_skip(test, "blocksize exceeds pagesize");
> +
> + /* Initialize group 1 buddy cache so bb_fragments and orders are populated */
> + ret = ext4_mb_load_buddy_test(sb, TEST_GOAL_GROUP, &e4b);
> + KUNIT_ASSERT_EQ(test, ret, 0);
> + ext4_mb_unload_buddy_test(&e4b);
[ ... ]
> + /*
> + * Test ext4_mb_good_group_nolock on uninitialized group 2:
> + * At inexpensive CR_POWER2_ALIGNED, it skips initializing group 2 and returns 0.
> + * At expensive CR_GOAL_LEN_SLOW (with STRICT_CHECK), it initializes group 2
> + * and returns 1.
> + */
> + grp2 = ext4_get_group_info(sb, 2);
> + KUNIT_ASSERT_NOT_NULL(test, grp2);
> + KUNIT_EXPECT_TRUE(test, EXT4_MB_GRP_NEED_INIT(grp2));
> +
> + ac.ac_criteria = CR_POWER2_ALIGNED;\n> + ret = ext4_mb_good_group_nolock_test(&ac, 2, CR_POWER2_ALIGNED);
> + KUNIT_EXPECT_EQ(test, ret, 0);
> + KUNIT_EXPECT_TRUE(test, EXT4_MB_GRP_NEED_INIT(grp2));
[Severity: Medium]
Will test_mb_good_group() and test_mb_prefetch() fail on 16K or 64K
PAGE_SIZE kernels?
ext4_mb_init_cache() initializes groups_per_folio =
DIV_ROUND_UP(folio_size(folio) / blocksize, 2) consecutive groups at once
whenever a buddy-cache folio is populated. When blocksize is 1K on a 16K
page kernel, or 1K/4K on a 64K page kernel, groups_per_folio is at least
8, so loading group 1's buddy (or calling ext4_mb_prefetch_fini() on
groups [0, 2) in test_mb_prefetch()) also initializes group 2 on folio 0
and clears EXT4_GROUP_INFO_NEED_INIT_BIT on grp2, causing the
EXT4_MB_GRP_NEED_INIT(grp2) expectations in both tests to fail.
[ ... ]
> +static void test_mb_simple_and_aligned_scan(struct kunit *test)
> +{
> + struct super_block *sb = (struct super_block *)test->priv;
> + struct ext4_sb_info *sbi = EXT4_SB(sb);
> + struct ext4_buddy e4b;
> + struct ext4_allocation_context ac = {};
> + struct inode *inode;
> + int ret;
> +
> + if (sb->s_blocksize > PAGE_SIZE)
> + kunit_skip(test, "blocksize exceeds pagesize");
> +
> + inode = mbt_alloc_test_inode(test, sb, S_IFREG);
> +
> + /*
> + * Mark cluster 0 used in group 1 so:
> + * - order 3 buddy [8, 16) is the first order-3 buddy
> + * - first 16-cluster stripe [0, 16) is not completely free, so
> + * stripe-aligned scan must skip to cluster 16.
> + */
> + mbt_ctx_mark_used(sb, TEST_GOAL_GROUP, 0, 1);
> +
> + ret = ext4_mb_load_buddy_test(sb, TEST_GOAL_GROUP, &e4b);
> + KUNIT_ASSERT_EQ(test, ret, 0);
[Severity: Low]
Does marking cluster 0 used here without decrementing
ext4_get_group_info(sb, TEST_GOAL_GROUP)->bb_free trigger a false bitmap
corruption error?
When ext4_mb_load_buddy_test() calls ext4_mb_generate_buddy(), the bitmap
free count is 1 less than grp->bb_free, which logs an inconsistency error
via ext4_grp_locked_error() and sets EXT4_GROUP_INFO_BBITMAP_CORRUPT on
TEST_GOAL_GROUP.
[ ... ]
> +static void test_mb_regular_allocator(struct kunit *test)
> +{
[ ... ]
> + /*
> + * 3. MB_OPTIMIZE_SCAN with CR_BEST_AVAIL_LEN goal length trimming:
> + * Make group 2 the only group with free blocks, fragmented into two
> + * 8-cluster chunks [0, 8) and [16, 24) so largest_free_order = 3
> + * and avg_fragment_size = 8.
> + * Note: group 2 may have already been prefetched during step 2, so
> + * mark its blocks used via mb_mark_used_test on the loaded buddy.
> + */
[ ... ]
> + memset(&ac, 0, sizeof(ac));
> + ac.ac_sb = sb;
> + ac.ac_inode = inode;
> + ac.ac_status = AC_STATUS_CONTINUE;
> + ac.ac_flags = EXT4_MB_HINT_DATA;
> + ac.ac_g_ex.fe_group = 0;
> + ac.ac_g_ex.fe_len = 16;
> + ac.ac_orig_goal_len = 16;
> + ac.ac_o_ex.fe_len = 8;
> +
> + ret = ext4_mb_regular_allocator_test(&ac);
[Severity: Low]
Does setting ac_o_ex.fe_len = 8 prevent ext4_mb_scan_groups_best_avail()
from trimming ac_g_ex.fe_len down to 8 at CR_BEST_AVAIL_LEN?
In ext4_mb_scan_groups_best_avail(), order = fls(16) - 1 = 4 and min_order
starts at 4 - 3 = 1, but because (1 << min_order) < ac->ac_o_ex.fe_len, it
clamps min_order to fls(8) = 4:
fs/ext4/mballoc.c:ext4_mb_scan_groups_best_avail() {
...
order = fls(ac->ac_g_ex.fe_len) - 1;
...
min_order = order - sbi->s_mb_best_avail_max_trim_order;
if (min_order < 0)
min_order = 0;
if (1 << min_order < ac->ac_o_ex.fe_len)
min_order = fls(ac->ac_o_ex.fe_len);
for (i = order; i >= min_order; i--) {
...
}
As a result, the loop only checks i = 4 (fe_len = 16) and never trims to
i = 3 (fe_len = 8), so the allocation only succeeds after falling back to
CR_GOAL_LEN_SLOW and ext4_mb_try_best_found(). Setting ac_o_ex.fe_len <= 4
would allow min_order <= 3 so CR_BEST_AVAIL_LEN trims fe_len to 8.
[ ... ]
> +static void test_mb_group_pa_lifecycle(struct kunit *test)
> +{
> + struct super_block *sb = (struct super_block *)test->priv;
> + struct ext4_sb_info *sbi = EXT4_SB(sb);
> + struct inode *inode1, *inode2;
> + struct ext4_allocation_request ar = {};
> + struct ext4_group_info *grp;
> + ext4_fsblk_t blk1, blk2;
> + int err = 0, discarded;
> +
> + if (sb->s_blocksize > PAGE_SIZE)
> + kunit_skip(test, "blocksize exceeds pagesize");
> +
> + inode1 = mbt_alloc_test_inode(test, sb, S_IFREG);
> + inode2 = mbt_alloc_test_inode(test, sb, S_IFREG);
> + inode2->i_ino = 13;
> +
> + /* Small files (<= s_mb_stream_request) use locality group PA (MB_GROUP_PA) */
> + i_size_write(inode1, sb->s_blocksize);
> + i_size_write(inode2, sb->s_blocksize);
> +
> + ar.inode = inode1;
> + ar.logical = 0;
> + ar.len = 1;
> + ar.goal = ext4_group_first_block_no(sb, TEST_GOAL_GROUP);
> + ar.flags = EXT4_MB_HINT_DATA;
> +
> + blk1 = ext4_mb_new_blocks(NULL, &ar, &err);
> + KUNIT_ASSERT_EQ(test, err, 0);
> + KUNIT_EXPECT_EQ(test, blk1, ext4_group_first_block_no(sb, TEST_GOAL_GROUP));
> +
> + /* Second small file allocation reuses the locality group PA */
> + ar.inode = inode2;
> + ar.logical = 0;
> + ar.len = 1;
> + ar.goal = ext4_group_first_block_no(sb, TEST_GOAL_GROUP);
> + blk2 = ext4_mb_new_blocks(NULL, &ar, &err);
> + KUNIT_ASSERT_EQ(test, err, 0);
> + KUNIT_EXPECT_EQ(test, blk2, blk1 + EXT4_C2B(sbi, 1));
> +
> + /* Discard all group preallocations and verify free count is restored */
> + discarded = ext4_mb_discard_preallocations_test(sb, 0);
> + rcu_barrier();
> + KUNIT_EXPECT_EQ(test, discarded, (int)sbi->s_mb_group_prealloc - 2);
> +
> + grp = ext4_get_group_info(sb, TEST_GOAL_GROUP);
> + KUNIT_EXPECT_EQ(test, grp->bb_free, EXT4_CLUSTERS_PER_GROUP(sb) - 2);
> +}
> +
> +static void test_mb_lg_list_trim(struct kunit *test)
> +{
> + struct super_block *sb = (struct super_block *)test->priv;
> + struct ext4_sb_info *sbi = EXT4_SB(sb);
> + struct ext4_locality_group *lg;
> + struct inode *inode;
> + struct ext4_buddy e4b;
> + struct ext4_prealloc_space *pa;
> + int i, ret, count = 0;
> + int order = fls(15) - 1; /* pa_free = 15 -> order 3 */
> +
> + if (sb->s_blocksize > PAGE_SIZE)
> + kunit_skip(test, "blocksize exceeds pagesize");
> +
> + inode = mbt_alloc_test_inode(test, sb, S_IFREG);
> + sbi->s_mb_group_prealloc = 16;
> +
> + ret = ext4_mb_load_buddy_test(sb, TEST_GOAL_GROUP, &e4b);
> + KUNIT_ASSERT_EQ(test, ret, 0);
> +
> + /*
> + * Create 9 locality-group PAs in bucket order 3 (each of length 16 with
> + * 1 cluster used -> pa_free = 15). When the 9th PA is added via
> + * ext4_mb_release_context -> ext4_mb_add_n_trim, lg_prealloc_count > 8
> + * triggers ext4_mb_discard_lg_preallocations() to trim the list to 5!
> + */
> + for (i = 0; i < 9; i++) {
> + struct ext4_allocation_context ac = {};
> + struct ext4_free_extent ex = {
> + .fe_group = TEST_GOAL_GROUP,
> + .fe_start = i * 32,
> + .fe_len = 16,
> + };
> +
> + ac.ac_sb = sb;
> + ac.ac_inode = inode;
> + ac.ac_flags = EXT4_MB_HINT_DATA | EXT4_MB_HINT_GROUP_ALLOC;
> + ac.ac_lg = raw_cpu_ptr(sbi->s_locality_groups);
> + mutex_lock(&ac.ac_lg->lg_mutex);
> +
> + ret = ext4_mb_pa_alloc_test(&ac);
> + if (ret) {
> + mutex_unlock(&ac.ac_lg->lg_mutex);
> + ext4_mb_unload_buddy_test(&e4b);
> + KUNIT_ASSERT_EQ(test, ret, 0);
> + }
> +
> + ext4_lock_group(sb, TEST_GOAL_GROUP);
> + mb_mark_used_test(&e4b, &ex);
> + ext4_unlock_group(sb, TEST_GOAL_GROUP);
> +
> + ac.ac_status = AC_STATUS_FOUND;
> + ac.ac_o_ex.fe_len = 1;
> + ac.ac_b_ex = ex;
> + ac.ac_f_ex = ex;
> + ext4_mb_new_preallocation_test(&ac);
> + /* Release context updates pa_free to 15 and runs ext4_mb_add_n_trim */
> + ext4_mb_release_context_test(&ac);
> + }
> +
> + ext4_mb_unload_buddy_test(&e4b);
> +
> + lg = raw_cpu_ptr(sbi->s_locality_groups);
> + spin_lock(&lg->lg_prealloc_lock);
> + list_for_each_entry(pa, &lg->lg_prealloc_list[order], pa_node.lg_list)
> + count++;
> + spin_unlock(&lg->lg_prealloc_lock);
> +
> + KUNIT_EXPECT_EQ(test, count, 5);
> +}
[Severity: Low]
Can CPU migration across sleeping calls cause test_mb_group_pa_lifecycle()
and test_mb_lg_list_trim() to use different per-CPU sbi->s_locality_groups
instances?
Both tests run in a preemptible KUnit kthread and call sleeping functions
(ext4_mb_new_blocks(), mutex_lock(), and ext4_mb_pa_alloc_test()). If the
kthread migrates CPUs between the two ext4_mb_new_blocks() calls in
test_mb_group_pa_lifecycle(), the second call looks up the new CPU's
empty lg_prealloc_list instead of reusing the first PA. Similarly,
test_mb_lg_list_trim() re-evaluates raw_cpu_ptr(sbi->s_locality_groups) on
each loop iteration and again when counting lg_prealloc_list[order], so a
migration splits the 9 PAs across per-CPU lists and fails the count == 5
check.
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index 0f73fb826dbf4..46ba07e017a31 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
[ ... ]
> +void mb_regenerate_buddy_test(struct ext4_buddy *e4b)
> +{
> + mb_regenerate_buddy(e4b);
> +}
> +EXPORT_SYMBOL_FOR_EXT4_TEST(mb_regenerate_buddy_test);
[ ... ]
> +void ext4_mb_measure_extent_test(struct ext4_allocation_context *ac,
> + struct ext4_free_extent *ex,
> + struct ext4_buddy *e4b)
> +{
> + ext4_mb_measure_extent(ac, ex, e4b);
> +}
> +EXPORT_SYMBOL_FOR_EXT4_TEST(ext4_mb_measure_extent_test);
[ ... ]
> +bool ext4_mb_use_preallocated_test(struct ext4_allocation_context *ac)
> +{
> + return ext4_mb_use_preallocated(ac);
> +}
> +EXPORT_SYMBOL_FOR_EXT4_TEST(ext4_mb_use_preallocated_test);
[ ... ]
> +void ext4_mb_pa_put_free_test(struct ext4_allocation_context *ac)
> +{
> + ext4_mb_pa_put_free(ac);
> +}
> +EXPORT_SYMBOL_FOR_EXT4_TEST(ext4_mb_pa_put_free_test);
> +
> +void ext4_mb_generate_from_pa_test(struct super_block *sb, void *bitmap,
> + ext4_group_t group)
> +{
> + ext4_mb_generate_from_pa(sb, bitmap, group);
> +}
> +EXPORT_SYMBOL_FOR_EXT4_TEST(ext4_mb_generate_from_pa_test);
> +
> +int ext4_mb_discard_group_preallocations_test(struct super_block *sb,
> + ext4_group_t group, int *busy)
> +{
> + return ext4_mb_discard_group_preallocations(sb, group, busy);
> +}
> +EXPORT_SYMBOL_FOR_EXT4_TEST(ext4_mb_discard_group_preallocations_test);
[Severity: Low]
This isn't a bug, but mb_regenerate_buddy_test(),
ext4_mb_measure_extent_test(), ext4_mb_use_preallocated_test(),
ext4_mb_pa_put_free_test(), and
ext4_mb_discard_group_preallocations_test() have no callers in
fs/ext4/mballoc-test.c.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261112040638.1576836-1-tytso@mit.edu?part=6
next prev parent reply other threads:[~2026-11-12 4:26 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-12 4:06 [PATCH 00/27] ext4: add lots of KUnit tests! Theodore Ts'o
2026-11-12 4:06 ` [PATCH 01/27] ext4: add KUinit tests for fs/ext4/extents_status.c Theodore Ts'o
2026-11-12 4:18 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 02/27] ext4: add KUnit tests for fs/ext4/extents.c Theodore Ts'o
2026-11-12 4:28 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 03/27] ext4: add KUnit tests for ext4_ext_split() leaf and index splitting Theodore Ts'o
2026-11-12 4:15 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 04/27] ext4: add KUnit tests for fs/ext4/xattr.c Theodore Ts'o
2026-11-12 4:26 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 05/27] ext4: add KUnit tests for fs/ext4/namei.c Theodore Ts'o
2026-11-12 4:21 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 06/27] ext4: expand KUnit tests for fs/ext4/mballoc.c Theodore Ts'o
2026-11-12 4:26 ` sashiko-bot [this message]
2026-11-12 4:06 ` [PATCH 07/27] ext4: add KUnit tests for fs/ext4/inline.c Theodore Ts'o
2026-11-12 4:29 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 08/27] ext4: zero s_fc_replay_state in ext4_fc_replay_cleanup() Theodore Ts'o
2026-11-12 4:16 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 09/27] ext4: add KUnit tests for fs/ext4/fast_commit.c Theodore Ts'o
2026-11-12 4:28 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 10/27] ext4: expand KUnit tests for fs/ext4/inode.c Theodore Ts'o
2026-11-12 4:36 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 11/27] ext4: add KUnit tests for fs/ext4/ialloc.c Theodore Ts'o
2026-11-12 4:25 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 12/27] ext4: add KUnit tests for fs/ext4/balloc.c Theodore Ts'o
2026-11-12 4:16 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 13/27] ext4: add KUnit tests for fs/ext4/orphan.c Theodore Ts'o
2026-11-12 4:18 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 14/27] ext4: add KUnit tests for fs/ext4/block_validity.c Theodore Ts'o
2026-11-12 4:21 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 15/27] ext4: check multi-block overlap on left traversal in add_system_zone() Theodore Ts'o
2026-11-12 4:10 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 16/27] ext4: enable full feature coverage in fs/ext4/.kunitconfig Theodore Ts'o
2026-11-12 4:24 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 17/27] ext4: add KUnit tests for fs/ext4/super.c Theodore Ts'o
2026-11-12 4:27 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 18/27] ext4: add KUnit tests for fs/ext4/sysfs.c Theodore Ts'o
2026-11-12 4:32 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 19/27] ext4: add KUnit tests for fs/ext4/ioctl.c Theodore Ts'o
2026-11-12 4:35 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 20/27] ext4: add KUnit tests for fs/ext4/resize.c Theodore Ts'o
2026-11-12 4:34 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 21/27] ext4: add KUnit tests for fs/ext4/migrate.c Theodore Ts'o
2026-11-12 4:37 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 22/27] ext4: add KUnit tests for fs/ext4/indirect.c Theodore Ts'o
2026-11-12 4:46 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 23/27] ext4: expand KUnit tests in fs/ext4/extents-test.c for file range operations Theodore Ts'o
2026-11-12 4:34 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 24/27] ext4: add KUnit tests for fs/ext4/fsmap.c Theodore Ts'o
2026-11-12 4:30 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 25/27] ext4: add KUnit tests for fs/ext4/move_extent.c Theodore Ts'o
2026-11-12 4:36 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 26/27] ext4: add KUnit tests for fs/ext4/mmp.c Theodore Ts'o
2026-11-12 4:29 ` sashiko-bot
2026-11-12 4:06 ` [PATCH 27/27] ext4: add KUnit tests for fs/ext4/dir.c Theodore Ts'o
2026-11-12 4:41 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=sashiko-outbox-210334@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.