18 Oct, 2022

1 commit

  • Consumer application:
    - Adding a flag 'is_hbk', in its "struct crypto_config".

    - After fetching the keys, it is setting the above
    mentioned flag, based on the key fetched.
    -- Note: Supported for trusted keys only.

    - After allocating the tfm, and before calling
    crypto_xxx_setkey(), setting the:
    -- tfm flag 'is_hbk':
    cc->cipher_tfm.tfms[i]->base.is_hbk = cc->is_hbk;
    -- tfm hbk_info, if cc->is_hbk, is non-zero.

    Note: HBK Supported for symmetric-key ciphers only.

    Signed-off-by: Pankaj Gupta
    Reviewed-by: Gaurav Jain
    Reviewed by: Kshitiz Varshney

    Pankaj Gupta
     

27 Sep, 2022

1 commit

  • This is the 5.15.70 stable release

    * tag 'v5.15.70': (2444 commits)
    Linux 5.15.70
    ALSA: hda/sigmatel: Fix unused variable warning for beep power change
    cgroup: Add missing cpus_read_lock() to cgroup_attach_task_all()
    ...

    Signed-off-by: Jason Liu

    Conflicts:
    arch/arm/boot/dts/imx6ul.dtsi
    arch/arm/mm/mmu.c
    arch/arm64/boot/dts/freescale/imx8mp-evk.dts
    drivers/gpu/drm/imx/dcss/dcss-kms.c
    drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
    drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h
    drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
    drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
    drivers/soc/fsl/Kconfig
    drivers/soc/imx/gpcv2.c
    drivers/usb/dwc3/host.c
    net/dsa/slave.c
    sound/soc/fsl/imx-card.c

    Jason Liu
     

15 Sep, 2022

1 commit

  • [ Upstream commit 5e8daf906f890560df430d30617c692a794acb73 ]

    A race condition still exists when removing and re-creating md devices
    in test cases. However, it is only seen on some setups.

    The race condition was tracked down to a reference still being held
    to the kobject by the rdev in the md_rdev_misc_wq which will be released
    in rdev_delayed_delete().

    md_alloc() waits for previous deletions by waiting on the md_misc_wq,
    but the md_rdev_misc_wq may still be holding a reference to a recently
    removed device.

    To fix this, also flush the md_rdev_misc_wq in md_alloc().

    Signed-off-by: David Sloan
    [logang@deltatee.com: rewrote commit message]
    Signed-off-by: Logan Gunthorpe
    Signed-off-by: Song Liu
    Signed-off-by: Sasha Levin

    David Sloan
     

31 Aug, 2022

2 commits

  • commit 0dd84b319352bb8ba64752d4e45396d8b13e6018 upstream.

    From the link [1], we can see raid1d was running even after the path
    raid_dtr -> md_stop -> __md_stop.

    Let's stop write first in destructor to align with normal md-raid to
    fix the KASAN issue.

    [1]. https://lore.kernel.org/linux-raid/CAPhsuW5gc4AakdGNdF8ubpezAuDLFOYUO_sfMZcec6hQFm8nhg@mail.gmail.com/T/#m7f12bf90481c02c6d2da68c64aeed4779b7df74a

    Fixes: 48df498daf62 ("md: move bitmap_destroy to the beginning of __md_stop")
    Reported-by: Mikulas Patocka
    Signed-off-by: Guoqing Jiang
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Guoqing Jiang
     
  • commit 1d258758cf06a0734482989911d184dd5837ed4e upstream.

    This reverts commit e151db8ecfb019b7da31d076130a794574c89f6f. Because it
    obviously breaks clustered raid as noticed by Neil though it fixed KASAN
    issue for dm-raid, let's revert it and fix KASAN issue in next commit.

    [1]. https://lore.kernel.org/linux-raid/a6657e08-b6a7-358b-2d2a-0ac37d49d23a@linux.dev/T/#m95ac225cab7409f66c295772483d091084a6d470

    Fixes: e151db8ecfb0 ("md-raid: destroy the bitmap after destroying the thread")
    Signed-off-by: Guoqing Jiang
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Guoqing Jiang
     

25 Aug, 2022

2 commits

  • [ Upstream commit 104212471b1c1817b311771d817fb692af983173 ]

    In line 2884, "raid5_release_stripe(sh);" drops the reference to sh and
    may cause sh to be released. However, sh is subsequently used in lines
    2886 "if (sh->batch_head && sh != sh->batch_head)". This may result in an
    use-after-free bug.

    It can be fixed by moving "raid5_release_stripe(sh);" to the bottom of
    the function.

    Signed-off-by: Wentao_Liang
    Signed-off-by: Song Liu
    Signed-off-by: Jens Axboe
    Signed-off-by: Sasha Levin

    Wentao_Liang
     
  • [ Upstream commit 9973f0fa7d20269fe6fefe6333997fb5914449c1 ]

    The mdadm test 07layouts randomly produces a kernel hung task deadlock.
    The deadlock is caused by the suspend_lo/suspend_hi files being set by
    the mdadm background process during reshape and not being cleared
    because the process hangs. (Leaving aside the issue of the fragility of
    freezing kernel tasks by buggy userspace processes...)

    When the background mdadm process hangs it, is waiting (without a
    timeout) on a change to the sync_completed file signalling that the
    reshape has completed. The process is woken up a couple times when
    the reshape finishes but it is woken up before MD_RECOVERY_RUNNING
    is cleared so sync_completed_show() reports 0 instead of "none".

    To fix this, notify the sysfs file in md_reap_sync_thread() after
    MD_RECOVERY_RUNNING has been cleared. This wakes up mdadm and causes
    it to continue and write to suspend_lo/suspend_hi to allow IO to
    continue.

    Signed-off-by: Logan Gunthorpe
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Song Liu
    Signed-off-by: Jens Axboe
    Signed-off-by: Sasha Levin

    Logan Gunthorpe
     

17 Aug, 2022

11 commits

  • [ Upstream commit 7dad24db59d2d2803576f2e3645728866a056dab ]

    There is a KASAN warning in raid_resume when running the lvm test
    lvconvert-raid.sh. The reason for the warning is that mddev->raid_disks
    is greater than rs->raid_disks, so the loop touches one entry beyond
    the allocated length.

    Cc: stable@vger.kernel.org
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • [ Upstream commit 1fbeea217d8f297fe0e0956a1516d14ba97d0396 ]

    There is this warning when using a kernel with the address sanitizer
    and running this testsuite:
    https://gitlab.com/cki-project/kernel-tests/-/tree/main/storage/swraid/scsi_raid

    ==================================================================
    BUG: KASAN: slab-out-of-bounds in raid_status+0x1747/0x2820 [dm_raid]
    Read of size 4 at addr ffff888079d2c7e8 by task lvcreate/13319
    CPU: 0 PID: 13319 Comm: lvcreate Not tainted 5.18.0-0.rc3. #1
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    Call Trace:

    dump_stack_lvl+0x6a/0x9c
    print_address_description.constprop.0+0x1f/0x1e0
    print_report.cold+0x55/0x244
    kasan_report+0xc9/0x100
    raid_status+0x1747/0x2820 [dm_raid]
    dm_ima_measure_on_table_load+0x4b8/0xca0 [dm_mod]
    table_load+0x35c/0x630 [dm_mod]
    ctl_ioctl+0x411/0x630 [dm_mod]
    dm_ctl_ioctl+0xa/0x10 [dm_mod]
    __x64_sys_ioctl+0x12a/0x1a0
    do_syscall_64+0x5b/0x80

    The warning is caused by reading conf->max_nr_stripes in raid_status. The
    code in raid_status reads mddev->private, casts it to struct r5conf and
    reads the entry max_nr_stripes.

    However, if we have different raid type than 4/5/6, mddev->private
    doesn't point to struct r5conf; it may point to struct r0conf, struct
    r1conf, struct r10conf or struct mpconf. If we cast a pointer to one
    of these structs to struct r5conf, we will be reading invalid memory
    and KASAN warns about it.

    Fix this bug by reading struct r5conf only if raid type is 4, 5 or 6.

    Cc: stable@vger.kernel.org
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • [ Upstream commit 3534e5a5ed2997ca1b00f44a0378a075bd05e8a3 ]

    Fault inject on pool metadata device reports:
    BUG: KASAN: use-after-free in dm_pool_register_metadata_threshold+0x40/0x80
    Read of size 8 at addr ffff8881b9d50068 by task dmsetup/950

    CPU: 7 PID: 950 Comm: dmsetup Tainted: G W 5.19.0-rc6 #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-1.fc33 04/01/2014
    Call Trace:

    dump_stack_lvl+0x34/0x44
    print_address_description.constprop.0.cold+0xeb/0x3f4
    kasan_report.cold+0xe6/0x147
    dm_pool_register_metadata_threshold+0x40/0x80
    pool_ctr+0xa0a/0x1150
    dm_table_add_target+0x2c8/0x640
    table_load+0x1fd/0x430
    ctl_ioctl+0x2c4/0x5a0
    dm_ctl_ioctl+0xa/0x10
    __x64_sys_ioctl+0xb3/0xd0
    do_syscall_64+0x35/0x80
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    This can be easily reproduced using:
    echo offline > /sys/block/sda/device/state
    dd if=/dev/zero of=/dev/mapper/thin bs=4k count=10
    dmsetup load pool --table "0 20971520 thin-pool /dev/sda /dev/sdb 128 0 0"

    If a metadata commit fails, the transaction will be aborted and the
    metadata space maps will be destroyed. If a DM table reload then
    happens for this failed thin-pool, a use-after-free will occur in
    dm_sm_register_threshold_callback (called from
    dm_pool_register_metadata_threshold).

    Fix this by in dm_pool_register_metadata_threshold() by returning the
    -EINVAL error if the thin-pool is in fail mode. Also fail pool_ctr()
    with a new error message: "Error registering metadata threshold".

    Fixes: ac8c3f3df65e4 ("dm thin: generate event when metadata threshold passed")
    Cc: stable@vger.kernel.org
    Reported-by: Hulk Robot
    Signed-off-by: Luo Meng
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Luo Meng
     
  • [ Upstream commit ca7dc242e358e46d963b32f9d9dd829785a9e957 ]

    dm-writecache has the capability to limit the number of writeback jobs
    in progress. However, this feature was off by default. As such there
    were some out-of-memory crashes observed when lowering the low
    watermark while the cache is full.

    This commit enables writeback limit by default. It is set to 256MiB or
    1/16 of total system memory, whichever is smaller.

    Cc: stable@vger.kernel.org
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • [ Upstream commit e120a5f1e78fab6223544e425015f393d90d6f0d ]

    Otherwise PR ops may be issued while the broader DM device is being
    reconfigured, etc.

    Fixes: 9c72bad1f31a ("dm: call PR reserve/unreserve on each underlying device")
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mike Snitzer
     
  • [ Upstream commit 2ee73ef60db4d79b9f9b8cd501e8188b5179449f ]

    Change dm-writecache, so that it counts the number of blocks discarded
    instead of the number of discard bios. Make it consistent with the
    read and write statistics counters that were changed to count the
    number of blocks instead of bios.

    Fixes: e3a35d03407c ("dm writecache: add event counters")
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • [ Upstream commit b2676e1482af89714af6988ce5d31a84692e2530 ]

    Change dm-writecache, so that it counts the number of blocks written
    instead of the number of write bios. Bios can be split and requeued
    using the dm_accept_partial_bio function, so counting bios caused
    inaccurate results.

    Fixes: e3a35d03407c ("dm writecache: add event counters")
    Reported-by: Yu Kuai
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • [ Upstream commit 2c6e755b49d273243431f5f1184654e71221fc78 ]

    Change dm-writecache, so that it counts the number of blocks read
    instead of the number of read bios. Bios can be split and requeued
    using the dm_accept_partial_bio function, so counting bios caused
    inaccurate results.

    Fixes: e3a35d03407c ("dm writecache: add event counters")
    Reported-by: Yu Kuai
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • [ Upstream commit 9bc0c92e4b82adb017026dbb2aa816b1ac2bef31 ]

    The functions writecache_map_remap_origin and writecache_bio_copy_ssd
    only return a single value, thus they can be made to return void.

    This helps simplify the following IO accounting changes.

    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Sasha Levin

    Mikulas Patocka
     
  • commit d17f744e883b2f8d13cca252d71cfe8ace346f7d upstream.

    There's a KASAN warning in raid10_remove_disk when running the lvm
    test lvconvert-raid-reshape.sh. We fix this warning by verifying that the
    value "number" is valid.

    BUG: KASAN: slab-out-of-bounds in raid10_remove_disk+0x61/0x2a0 [raid10]
    Read of size 8 at addr ffff889108f3d300 by task mdX_raid10/124682

    CPU: 3 PID: 124682 Comm: mdX_raid10 Not tainted 5.19.0-rc6 #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
    Call Trace:

    dump_stack_lvl+0x34/0x44
    print_report.cold+0x45/0x57a
    ? __lock_text_start+0x18/0x18
    ? raid10_remove_disk+0x61/0x2a0 [raid10]
    kasan_report+0xa8/0xe0
    ? raid10_remove_disk+0x61/0x2a0 [raid10]
    raid10_remove_disk+0x61/0x2a0 [raid10]
    Buffer I/O error on dev dm-76, logical block 15344, async page read
    ? __mutex_unlock_slowpath.constprop.0+0x1e0/0x1e0
    remove_and_add_spares+0x367/0x8a0 [md_mod]
    ? super_written+0x1c0/0x1c0 [md_mod]
    ? mutex_trylock+0xac/0x120
    ? _raw_spin_lock+0x72/0xc0
    ? _raw_spin_lock_bh+0xc0/0xc0
    md_check_recovery+0x848/0x960 [md_mod]
    raid10d+0xcf/0x3360 [raid10]
    ? sched_clock_cpu+0x185/0x1a0
    ? rb_erase+0x4d4/0x620
    ? var_wake_function+0xe0/0xe0
    ? psi_group_change+0x411/0x500
    ? preempt_count_sub+0xf/0xc0
    ? _raw_spin_lock_irqsave+0x78/0xc0
    ? __lock_text_start+0x18/0x18
    ? raid10_sync_request+0x36c0/0x36c0 [raid10]
    ? preempt_count_sub+0xf/0xc0
    ? _raw_spin_unlock_irqrestore+0x19/0x40
    ? del_timer_sync+0xa9/0x100
    ? try_to_del_timer_sync+0xc0/0xc0
    ? _raw_spin_lock_irqsave+0x78/0xc0
    ? __lock_text_start+0x18/0x18
    ? _raw_spin_unlock_irq+0x11/0x24
    ? __list_del_entry_valid+0x68/0xa0
    ? finish_wait+0xa3/0x100
    md_thread+0x161/0x260 [md_mod]
    ? unregister_md_personality+0xa0/0xa0 [md_mod]
    ? _raw_spin_lock_irqsave+0x78/0xc0
    ? prepare_to_wait_event+0x2c0/0x2c0
    ? unregister_md_personality+0xa0/0xa0 [md_mod]
    kthread+0x148/0x180
    ? kthread_complete_and_exit+0x20/0x20
    ret_from_fork+0x1f/0x30

    Allocated by task 124495:
    kasan_save_stack+0x1e/0x40
    __kasan_kmalloc+0x80/0xa0
    setup_conf+0x140/0x5c0 [raid10]
    raid10_run+0x4cd/0x740 [raid10]
    md_run+0x6f9/0x1300 [md_mod]
    raid_ctr+0x2531/0x4ac0 [dm_raid]
    dm_table_add_target+0x2b0/0x620 [dm_mod]
    table_load+0x1c8/0x400 [dm_mod]
    ctl_ioctl+0x29e/0x560 [dm_mod]
    dm_compat_ctl_ioctl+0x7/0x20 [dm_mod]
    __do_compat_sys_ioctl+0xfa/0x160
    do_syscall_64+0x90/0xc0
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    Last potentially related work creation:
    kasan_save_stack+0x1e/0x40
    __kasan_record_aux_stack+0x9e/0xc0
    kvfree_call_rcu+0x84/0x480
    timerfd_release+0x82/0x140
    L __fput+0xfa/0x400
    task_work_run+0x80/0xc0
    exit_to_user_mode_prepare+0x155/0x160
    syscall_exit_to_user_mode+0x12/0x40
    do_syscall_64+0x42/0xc0
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    Second to last potentially related work creation:
    kasan_save_stack+0x1e/0x40
    __kasan_record_aux_stack+0x9e/0xc0
    kvfree_call_rcu+0x84/0x480
    timerfd_release+0x82/0x140
    __fput+0xfa/0x400
    task_work_run+0x80/0xc0
    exit_to_user_mode_prepare+0x155/0x160
    syscall_exit_to_user_mode+0x12/0x40
    do_syscall_64+0x42/0xc0
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    The buggy address belongs to the object at ffff889108f3d200
    which belongs to the cache kmalloc-256 of size 256
    The buggy address is located 0 bytes to the right of
    256-byte region [ffff889108f3d200, ffff889108f3d300)

    The buggy address belongs to the physical page:
    page:000000007ef2a34c refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1108f3c
    head:000000007ef2a34c order:2 compound_mapcount:0 compound_pincount:0
    flags: 0x4000000000010200(slab|head|zone=2)
    raw: 4000000000010200 0000000000000000 dead000000000001 ffff889100042b40
    raw: 0000000000000000 0000000080200020 00000001ffffffff 0000000000000000
    page dumped because: kasan: bad access detected

    Memory state around the buggy address:
    ffff889108f3d200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    ffff889108f3d280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    >ffff889108f3d300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ^
    ffff889108f3d380: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
    ffff889108f3d400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Signed-off-by: Mikulas Patocka
    Cc: stable@vger.kernel.org
    Signed-off-by: Song Liu
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Mikulas Patocka
     
  • commit e151db8ecfb019b7da31d076130a794574c89f6f upstream.

    When we ran the lvm test "shell/integrity-blocksize-3.sh" on a kernel with
    kasan, we got failure in write_page.

    The reason for the failure is that md_bitmap_destroy is called before
    destroying the thread and the thread may be waiting in the function
    write_page for the bio to complete. When the thread finishes waiting, it
    executes "if (test_bit(BITMAP_WRITE_ERROR, &bitmap->flags))", which
    triggers the kasan warning.

    Note that the commit 48df498daf62 that caused this bug claims that it is
    neede for md-cluster, you should check md-cluster and possibly find
    another bugfix for it.

    BUG: KASAN: use-after-free in write_page+0x18d/0x680 [md_mod]
    Read of size 8 at addr ffff889162030c78 by task mdX_raid1/5539

    CPU: 10 PID: 5539 Comm: mdX_raid1 Not tainted 5.19.0-rc2 #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
    Call Trace:

    dump_stack_lvl+0x34/0x44
    print_report.cold+0x45/0x57a
    ? __lock_text_start+0x18/0x18
    ? write_page+0x18d/0x680 [md_mod]
    kasan_report+0xa8/0xe0
    ? write_page+0x18d/0x680 [md_mod]
    kasan_check_range+0x13f/0x180
    write_page+0x18d/0x680 [md_mod]
    ? super_sync+0x4d5/0x560 [dm_raid]
    ? md_bitmap_file_kick+0xa0/0xa0 [md_mod]
    ? rs_set_dev_and_array_sectors+0x2e0/0x2e0 [dm_raid]
    ? mutex_trylock+0x120/0x120
    ? preempt_count_add+0x6b/0xc0
    ? preempt_count_sub+0xf/0xc0
    md_update_sb+0x707/0xe40 [md_mod]
    md_reap_sync_thread+0x1b2/0x4a0 [md_mod]
    md_check_recovery+0x533/0x960 [md_mod]
    raid1d+0xc8/0x2a20 [raid1]
    ? var_wake_function+0xe0/0xe0
    ? psi_group_change+0x411/0x500
    ? preempt_count_sub+0xf/0xc0
    ? _raw_spin_lock_irqsave+0x78/0xc0
    ? __lock_text_start+0x18/0x18
    ? raid1_end_read_request+0x2a0/0x2a0 [raid1]
    ? preempt_count_sub+0xf/0xc0
    ? _raw_spin_unlock_irqrestore+0x19/0x40
    ? del_timer_sync+0xa9/0x100
    ? try_to_del_timer_sync+0xc0/0xc0
    ? _raw_spin_lock_irqsave+0x78/0xc0
    ? __lock_text_start+0x18/0x18
    ? __list_del_entry_valid+0x68/0xa0
    ? finish_wait+0xa3/0x100
    md_thread+0x161/0x260 [md_mod]
    ? unregister_md_personality+0xa0/0xa0 [md_mod]
    ? _raw_spin_lock_irqsave+0x78/0xc0
    ? prepare_to_wait_event+0x2c0/0x2c0
    ? unregister_md_personality+0xa0/0xa0 [md_mod]
    kthread+0x148/0x180
    ? kthread_complete_and_exit+0x20/0x20
    ret_from_fork+0x1f/0x30

    Allocated by task 5522:
    kasan_save_stack+0x1e/0x40
    __kasan_kmalloc+0x80/0xa0
    md_bitmap_create+0xa8/0xe80 [md_mod]
    md_run+0x777/0x1300 [md_mod]
    raid_ctr+0x249c/0x4a30 [dm_raid]
    dm_table_add_target+0x2b0/0x620 [dm_mod]
    table_load+0x1c8/0x400 [dm_mod]
    ctl_ioctl+0x29e/0x560 [dm_mod]
    dm_compat_ctl_ioctl+0x7/0x20 [dm_mod]
    __do_compat_sys_ioctl+0xfa/0x160
    do_syscall_64+0x90/0xc0
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    Freed by task 5680:
    kasan_save_stack+0x1e/0x40
    kasan_set_track+0x21/0x40
    kasan_set_free_info+0x20/0x40
    __kasan_slab_free+0xf7/0x140
    kfree+0x80/0x240
    md_bitmap_free+0x1c3/0x280 [md_mod]
    __md_stop+0x21/0x120 [md_mod]
    md_stop+0x9/0x40 [md_mod]
    raid_dtr+0x1b/0x40 [dm_raid]
    dm_table_destroy+0x98/0x1e0 [dm_mod]
    __dm_destroy+0x199/0x360 [dm_mod]
    dev_remove+0x10c/0x160 [dm_mod]
    ctl_ioctl+0x29e/0x560 [dm_mod]
    dm_compat_ctl_ioctl+0x7/0x20 [dm_mod]
    __do_compat_sys_ioctl+0xfa/0x160
    do_syscall_64+0x90/0xc0
    entry_SYSCALL_64_after_hwframe+0x46/0xb0

    Signed-off-by: Mikulas Patocka
    Cc: stable@vger.kernel.org
    Fixes: 48df498daf62 ("md: move bitmap_destroy to the beginning of __md_stop")
    Signed-off-by: Song Liu
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Mikulas Patocka
     

07 Jul, 2022

2 commits

  • commit 617b365872a247480e9dcd50a32c8d1806b21861 upstream.

    There's a KASAN warning in raid5_add_disk when running the LVM testsuite.
    The warning happens in the test
    lvconvert-raid-reshape-linear_to_raid6-single-type.sh. We fix the warning
    by verifying that rdev->saved_raid_disk is within limits.

    Cc: stable@vger.kernel.org
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Greg Kroah-Hartman

    Mikulas Patocka
     
  • commit 332bd0778775d0cf105c4b9e03e460b590749916 upstream.

    On dm-raid table load (using raid_ctr), dm-raid allocates an array
    rs->devs[rs->raid_disks] for the raid device members. rs->raid_disks
    is defined by the number of raid metadata and image tupples passed
    into the target's constructor.

    In the case of RAID layout changes being requested, that number can be
    different from the current number of members for existing raid sets as
    defined in their superblocks. Example RAID layout changes include:
    - raid1 legs being added/removed
    - raid4/5/6/10 number of stripes changed (stripe reshaping)
    - takeover to higher raid level (e.g. raid5 -> raid6)

    When accessing array members, rs->raid_disks must be used in control
    loops instead of the potentially larger value in rs->md.raid_disks.
    Otherwise it will cause memory access beyond the end of the rs->devs
    array.

    Fix this by changing code that is prone to out-of-bounds access.
    Also fix validate_raid_redundancy() to validate all devices that are
    added. Also, use braces to help clean up raid_iterate_devices().

    The out-of-bounds memory accesses was discovered using KASAN.

    This commit was verified to pass all LVM2 RAID tests (with KASAN
    enabled).

    Cc: stable@vger.kernel.org
    Signed-off-by: Heinz Mauelshagen
    Signed-off-by: Mike Snitzer
    Signed-off-by: Greg Kroah-Hartman

    Heinz Mauelshagen
     

05 Jul, 2022

1 commit

  • This is the 5.15.52 stable release

    * tag 'v5.15.52': (28 commits)
    Linux 5.15.52
    io_uring: fix not locked access to fixed buf table
    net: mscc: ocelot: allow unregistered IP multicast flooding to CPU
    ...

    Signed-off-by: Jason Liu

    Jason Liu
     

02 Jul, 2022

1 commit

  • commit 7d6b902ea0e02b2a25c480edf471cbaa4ebe6b3c upstream.

    The local variables check_state (in bch_btree_check()) and state (in
    bch_sectors_dirty_init()) should be fully filled by 0, because before
    allocating them on stack, they were dynamically allocated by kzalloc().

    Signed-off-by: Coly Li
    Link: https://lore.kernel.org/r/20220527152818.27545-2-colyli@suse.de
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Coly Li
     

30 Jun, 2022

3 commits

  • This is the 5.15.51 stable release

    * tag 'v5.15.51': (136 commits)
    Linux 5.15.51
    powerpc/pseries: wire up rng during setup_arch()
    kbuild: link vmlinux only once for CONFIG_TRIM_UNUSED_KSYMS (2nd attempt)
    ...

    Signed-off-by: Jason Liu

    Jason Liu
     
  • This is the 5.15.50 stable release

    * tag 'v5.15.50': (1395 commits)
    Linux 5.15.50
    arm64: mm: Don't invalidate FROM_DEVICE buffers at start of DMA transfer
    serial: core: Initialize rs485 RTS polarity already on probe
    ...

    Signed-off-by: Jason Liu

    Conflicts:
    drivers/bus/fsl-mc/fsl-mc-bus.c
    drivers/crypto/caam/ctrl.c
    drivers/pci/controller/dwc/pci-imx6.c
    drivers/spi/spi-fsl-qspi.c
    drivers/tty/serial/fsl_lpuart.c
    include/uapi/linux/dma-buf.h

    Jason Liu
     
  • This is the 5.15.41 stable release

    * tag 'v5.15.41': (1977 commits)
    Linux 5.15.41
    usb: gadget: uvc: allow for application to cleanly shutdown
    usb: gadget: uvc: rename function to be more consistent
    ...

    Signed-off-by: Jason Liu

    Conflicts:
    arch/arm64/boot/dts/freescale/fsl-ls1043a.dtsi
    arch/arm64/boot/dts/freescale/fsl-ls1046a.dtsi
    arch/arm64/configs/defconfig
    drivers/clk/imx/clk-imx8qxp-lpcg.c
    drivers/dma/imx-sdma.c
    drivers/gpu/drm/bridge/nwl-dsi.c
    drivers/mailbox/imx-mailbox.c
    drivers/net/phy/at803x.c
    drivers/tty/serial/fsl_lpuart.c
    security/keys/trusted-keys/trusted_core.c

    Jason Liu
     

29 Jun, 2022

2 commits

  • commit 90736eb3232d208ee048493f371075e4272e0944 upstream.

    Commit 85e123c27d5c ("dm mirror log: round up region bitmap size to
    BITS_PER_LONG") introduced a regression on 64-bit architectures in the
    lvm testsuite tests: lvcreate-mirror, mirror-names and vgsplit-operation.

    If the device is shrunk, we need to clear log bits beyond the end of the
    device. The code clears bits up to a 32-bit boundary and then calculates
    lc->sync_count by summing set bits up to a 64-bit boundary (the commit
    changed that; previously, this boundary was 32-bit too). So, it was using
    some non-zeroed bits in the calculation and this caused misbehavior.

    Fix this regression by clearing bits up to BITS_PER_LONG boundary.

    Fixes: 85e123c27d5c ("dm mirror log: round up region bitmap size to BITS_PER_LONG")
    Cc: stable@vger.kernel.org
    Reported-by: Benjamin Marzinski
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Greg Kroah-Hartman

    Mikulas Patocka
     
  • commit 9ae6e8b1c9bbf6874163d1243e393137313762b7 upstream.

    During postsuspend dm-era does the following:

    1. Archives the current era
    2. Commits the metadata, as part of the RPC call for archiving the
    current era
    3. Stops the worker

    Until the worker stops, it might write to the metadata again. Moreover,
    these writes are not flushed to disk immediately, but are cached by the
    dm-bufio client, which writes them back asynchronously.

    As a result, the committed metadata of a suspended dm-era device might
    not be consistent with the in-core metadata.

    In some cases, this can result in the corruption of the on-disk
    metadata. Suppose the following sequence of events:

    1. Load a new table, e.g. a snapshot-origin table, to a device with a
    dm-era table
    2. Suspend the device
    3. dm-era commits its metadata, but the worker does a few more metadata
    writes until it stops, as part of digesting an archived writeset
    4. These writes are cached by the dm-bufio client
    5. Load the dm-era table to another device.
    6. The new instance of the dm-era target loads the committed, on-disk
    metadata, which don't include the extra writes done by the worker
    after the metadata commit.
    7. Resume the new device
    8. The new dm-era target instance starts using the metadata
    9. Resume the original device
    10. The destructor of the old dm-era target instance is called and
    destroys the dm-bufio client, which results in flushing the cached
    writes to disk
    11. These writes might overwrite the writes done by the new dm-era
    instance, hence corrupting its metadata.

    Fix this by committing the metadata after the worker stops running.

    stop_worker uses flush_workqueue to flush the current work. However, the
    work item may re-queue itself and flush_workqueue doesn't wait for
    re-queued works to finish.

    This could result in the worker changing the metadata after they have
    been committed, or writing to the metadata concurrently with the commit
    in the postsuspend thread.

    Use drain_workqueue instead, which waits until the work and all
    re-queued works finish.

    Fixes: eec40579d8487 ("dm: add era target")
    Cc: stable@vger.kernel.org # v3.15+
    Signed-off-by: Nikos Tsironis
    Signed-off-by: Mike Snitzer
    Signed-off-by: Greg Kroah-Hartman

    Nikos Tsironis
     

22 Jun, 2022

1 commit

  • commit 85e123c27d5cbc22cfdc01de1e2ca1d9003a02d0 upstream.

    The code in dm-log rounds up bitset_size to 32 bits. It then uses
    find_next_zero_bit_le on the allocated region. find_next_zero_bit_le
    accesses the bitmap using unsigned long pointers. So, on 64-bit
    architectures, it may access 4 bytes beyond the allocated size.

    Fix this bug by rounding up bitset_size to BITS_PER_LONG.

    This bug was found by running the lvm2 testsuite with kasan.

    Fixes: 29121bd0b00e ("[PATCH] dm mirror log: bitset_size fix")
    Cc: stable@vger.kernel.org
    Signed-off-by: Mikulas Patocka
    Signed-off-by: Mike Snitzer
    Signed-off-by: Greg Kroah-Hartman

    Mikulas Patocka
     

15 Jun, 2022

2 commits

  • commit ea23994edc4169bd90d7a9b5908c6ccefd82fa40 upstream.

    The RAID0 layout is irrelevant if all members have the same size so the
    array has only one zone. It is *also* irrelevant if the array has two
    zones and the second zone has only one device, for example if the array
    has two members of different sizes.

    So in that case it makes sense to allow assembly even when the layout is
    undefined, like what is done when the array has only one zone.

    Reviewed-by: NeilBrown
    Signed-off-by: Pascal Hambourg
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Pascal Hambourg
     
  • [ Upstream commit 1e267742283a4b5a8ca65755c44166be27e9aa0f ]

    Generally, the md_unregister_thread is called with reconfig_mutex, but
    raid_message in dm-raid doesn't hold reconfig_mutex to unregister thread,
    so md_unregister_thread can be called simulitaneously from two call sites
    in theory.

    Then after previous commit which remove the protection of reconfig_mutex
    for md_unregister_thread completely, the potential issue could be worse
    than before.

    Let's take pers_lock at the beginning of function to ensure reentrancy.

    Reported-by: Donald Buczek
    Signed-off-by: Guoqing Jiang
    Signed-off-by: Song Liu
    Signed-off-by: Sasha Levin

    Guoqing Jiang
     

09 Jun, 2022

10 commits

  • commit 40f567bbb3b0639d2ec7d1c6ad4b1b018f80cf19 upstream.

    The function kzalloc() in detached_dev_do_request() can fail, so its
    return value should be checked.

    Fixes: bc082a55d25c ("bcache: fix inaccurate io state for detached bcache devices")
    Reported-by: TOTE Robot
    Signed-off-by: Jia-Ju Bai
    Signed-off-by: Coly Li
    Link: https://lore.kernel.org/r/20220527152818.27545-4-colyli@suse.de
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Jia-Ju Bai
     
  • commit 42b805af102471f53e3c7867b8c2b502ea4eef7e upstream.

    Now io_acct_set is alloc and free in personality. Remove the codes that
    free io_acct_set in md_free and md_stop.

    Fixes: 0c031fd37f69 (md: Move alloc/free acct bioset in to personality)
    Signed-off-by: Xiao Ni
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Xiao Ni
     
  • commit 0f2571ad7a30ff6b33cde142439f9378669f8b4f upstream.

    In normal stop process, it does like this:
    do_md_stop
    |
    __md_stop (pers->free(); mddev->private=NULL)
    |
    md_free (free mddev)
    __md_stop sets mddev->private to NULL after pers->free. The raid device
    will be stopped and mddev memory is free. But in reshape, it doesn't
    free the mddev and mddev will still be used in new raid.

    In reshape, it first sets mddev->private to new_pers and then runs
    old_pers->free(). Now raid0 sets mddev->private to NULL in raid0_free.
    The new raid can't work anymore. It will panic when dereference
    mddev->private because of NULL pointer dereference.

    It can panic like this:
    [63010.814972] kernel BUG at drivers/md/raid10.c:928!
    [63010.819778] invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
    [63010.825011] CPU: 3 PID: 44437 Comm: md0_resync Kdump: loaded Not tainted 5.14.0-86.el9.x86_64 #1
    [63010.833789] Hardware name: Dell Inc. PowerEdge R6415/07YXFK, BIOS 1.15.0 09/11/2020
    [63010.841440] RIP: 0010:raise_barrier+0x161/0x170 [raid10]
    [63010.865508] RSP: 0018:ffffc312408bbc10 EFLAGS: 00010246
    [63010.870734] RAX: 0000000000000000 RBX: ffffa00bf7d39800 RCX: 0000000000000000
    [63010.877866] RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffffa00bf7d39800
    [63010.884999] RBP: 0000000000000000 R08: fffffa4945e74400 R09: 0000000000000000
    [63010.892132] R10: ffffa00eed02f798 R11: 0000000000000000 R12: ffffa00bbc435200
    [63010.899266] R13: ffffa00bf7d39800 R14: 0000000000000400 R15: 0000000000000003
    [63010.906399] FS: 0000000000000000(0000) GS:ffffa00eed000000(0000) knlGS:0000000000000000
    [63010.914485] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [63010.920229] CR2: 00007f5cfbe99828 CR3: 0000000105efe000 CR4: 00000000003506e0
    [63010.927363] Call Trace:
    [63010.929822] ? bio_reset+0xe/0x40
    [63010.933144] ? raid10_alloc_init_r10buf+0x60/0xa0 [raid10]
    [63010.938629] raid10_sync_request+0x756/0x1610 [raid10]
    [63010.943770] md_do_sync.cold+0x3e4/0x94c
    [63010.947698] md_thread+0xab/0x160
    [63010.951024] ? md_write_inc+0x50/0x50
    [63010.954688] kthread+0x149/0x170
    [63010.957923] ? set_kthread_struct+0x40/0x40
    [63010.962107] ret_from_fork+0x22/0x30

    Removing the code that sets mddev->private to NULL in raid0 can fix
    problem.

    Fixes: 0c031fd37f69 (md: Move alloc/free acct bioset in to personality)
    Reported-by: Fine Fan
    Signed-off-by: Xiao Ni
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Xiao Ni
     
  • commit 32feee36c30ea06e38ccb8ae6e5c44c6eec790a6 upstream.

    The journal no-space deadlock was reported time to time. Such deadlock
    can happen in the following situation.

    When all journal buckets are fully filled by active jset with heavy
    write I/O load, the cache set registration (after a reboot) will load
    all active jsets and inserting them into the btree again (which is
    called journal replay). If a journaled bkey is inserted into a btree
    node and results btree node split, new journal request might be
    triggered. For example, the btree grows one more level after the node
    split, then the root node record in cache device super block will be
    upgrade by bch_journal_meta() from bch_btree_set_root(). But there is no
    space in journal buckets, the journal replay has to wait for new journal
    bucket to be reclaimed after at least one journal bucket replayed. This
    is one example that how the journal no-space deadlock happens.

    The solution to avoid the deadlock is to reserve 1 journal bucket in
    run time, and only permit the reserved journal bucket to be used during
    cache set registration procedure for things like journal replay. Then
    the journal space will never be fully filled, there is no chance for
    journal no-space deadlock to happen anymore.

    This patch adds a new member "bool do_reserve" in struct journal, it is
    inititalized to 0 (false) when struct journal is allocated, and set to
    1 (true) by bch_journal_space_reserve() when all initialization done in
    run_cache_set(). In the run time when journal_reclaim() tries to
    allocate a new journal bucket, free_journal_buckets() is called to check
    whether there are enough free journal buckets to use. If there is only
    1 free journal bucket and journal->do_reserve is 1 (true), the last
    bucket is reserved and free_journal_buckets() will return 0 to indicate
    no free journal bucket. Then journal_reclaim() will give up, and try
    next time to see whetheer there is free journal bucket to allocate. By
    this method, there is always 1 jouranl bucket reserved in run time.

    During the cache set registration, journal->do_reserve is 0 (false), so
    the reserved journal bucket can be used to avoid the no-space deadlock.

    Reported-by: Nikhil Kshirsagar
    Signed-off-by: Coly Li
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220524102336.10684-5-colyli@suse.de
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Coly Li
     
  • commit 80db4e4707e78cb22287da7d058d7274bd4cb370 upstream.

    After making bch_sectors_dirty_init() being multithreaded, the existing
    incremental dirty sector counting in bch_root_node_dirty_init() doesn't
    release btree occupation after iterating 500000 (INIT_KEYS_EACH_TIME)
    bkeys. Because a read lock is added on btree root node to prevent the
    btree to be split during the dirty sectors counting, other I/O requester
    has no chance to gain the write lock even restart bcache_btree().

    That is to say, the incremental dirty sectors counting is incompatible
    to the multhreaded bch_sectors_dirty_init(). We have to choose one and
    drop another one.

    In my testing, with 512 bytes random writes, I generate 1.2T dirty data
    and a btree with 400K nodes. With single thread and incremental dirty
    sectors counting, it takes 30+ minites to register the backing device.
    And with multithreaded dirty sectors counting, the backing device
    registration can be accomplished within 2 minutes.

    The 30+ minutes V.S. 2- minutes difference makes me decide to keep
    multithreaded bch_sectors_dirty_init() and drop the incremental dirty
    sectors counting. This is what this patch does.

    But INIT_KEYS_EACH_TIME is kept, in sectors_dirty_init_fn() the CPU
    will be released by cond_resched() after every INIT_KEYS_EACH_TIME keys
    iterated. This is to avoid the watchdog reports a bogus soft lockup
    warning.

    Fixes: b144e45fc576 ("bcache: make bch_sectors_dirty_init() to be multithreaded")
    Signed-off-by: Coly Li
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220524102336.10684-4-colyli@suse.de
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Coly Li
     
  • commit 4dc34ae1b45fe26e772a44379f936c72623dd407 upstream.

    Commit b144e45fc576 ("bcache: make bch_sectors_dirty_init() to be
    multithreaded") makes bch_sectors_dirty_init() to be much faster
    when counting dirty sectors by iterating all dirty keys in the btree.
    But it isn't in ideal shape yet, still can be improved.

    This patch does the following changes to improve current parallel dirty
    keys iteration on the btree,
    - Add read lock to root node when multiple threads iterating the btree,
    to prevent the root node gets split by I/Os from other registered
    bcache devices.
    - Remove local variable "char name[32]" and generate kernel thread name
    string directly when calling kthread_run().
    - Allocate "struct bch_dirty_init_state state" directly on stack and
    avoid the unnecessary dynamic memory allocation for it.
    - Decrease BCH_DIRTY_INIT_THRD_MAX from 64 to 12 which is enough indeed.
    - Increase &state->started to count created kernel thread after it
    succeeds to create.
    - When wait for all dirty key counting threads to finish, use
    wait_event() to replace wait_event_interruptible().

    With the above changes, the code is more clear, and some potential error
    conditions are avoided.

    Fixes: b144e45fc576 ("bcache: make bch_sectors_dirty_init() to be multithreaded")
    Signed-off-by: Coly Li
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220524102336.10684-3-colyli@suse.de
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Coly Li
     
  • commit 622536443b6731ec82c563aae7807165adbe9178 upstream.

    Commit 8e7102273f59 ("bcache: make bch_btree_check() to be
    multithreaded") makes bch_btree_check() to be much faster when checking
    all btree nodes during cache device registration. But it isn't in ideal
    shap yet, still can be improved.

    This patch does the following thing to improve current parallel btree
    nodes check by multiple threads in bch_btree_check(),
    - Add read lock to root node while checking all the btree nodes with
    multiple threads. Although currently it is not mandatory but it is
    good to have a read lock in code logic.
    - Remove local variable 'char name[32]', and generate kernel thread name
    string directly when calling kthread_run().
    - Allocate local variable "struct btree_check_state check_state" on the
    stack and avoid unnecessary dynamic memory allocation for it.
    - Reduce BCH_BTR_CHKTHREAD_MAX from 64 to 12 which is enough indeed.
    - Increase check_state->started to count created kernel thread after it
    succeeds to create.
    - When wait for all checking kernel threads to finish, use wait_event()
    to replace wait_event_interruptible().

    With this change, the code is more clear, and some potential error
    conditions are avoided.

    Fixes: 8e7102273f59 ("bcache: make bch_btree_check() to be multithreaded")
    Signed-off-by: Coly Li
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20220524102336.10684-2-colyli@suse.de
    Signed-off-by: Jens Axboe
    Signed-off-by: Greg Kroah-Hartman

    Coly Li
     
  • commit 64c54d9244a4efe9bc6e9c98e13c4bbb8bb39083 upstream.

    The bug is here:
    if (!rdev || rdev->desc_nr != nr) {

    The list iterator value 'rdev' will *always* be set and non-NULL
    by rdev_for_each_rcu(), so it is incorrect to assume that the
    iterator value will be NULL if the list is empty or no element
    found (In fact, it will be a bogus pointer to an invalid struct
    object containing the HEAD). Otherwise it will bypass the check
    and lead to invalid memory access passing the check.

    To fix the bug, use a new variable 'iter' as the list iterator,
    while using the original variable 'pdev' as a dedicated pointer to
    point to the found element.

    Cc: stable@vger.kernel.org
    Fixes: 70bcecdb1534 ("md-cluster: Improve md_reload_sb to be less error prone")
    Signed-off-by: Xiaomeng Tong
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Xiaomeng Tong
     
  • commit fc8738343eefc4ea8afb6122826dea48eacde514 upstream.

    The bug is here:
    if (!rdev)

    The list iterator value 'rdev' will *always* be set and non-NULL
    by rdev_for_each(), so it is incorrect to assume that the iterator
    value will be NULL if the list is empty or no element found.
    Otherwise it will bypass the NULL check and lead to invalid memory
    access passing the check.

    To fix the bug, use a new variable 'iter' as the list iterator,
    while using the original variable 'rdev' as a dedicated pointer to
    point to the found element.

    Cc: stable@vger.kernel.org
    Fixes: 2aa82191ac36 ("md-cluster: Perform a lazy update")
    Acked-by: Guoqing Jiang
    Signed-off-by: Xiaomeng Tong
    Acked-by: Goldwyn Rodrigues
    Signed-off-by: Song Liu
    Signed-off-by: Greg Kroah-Hartman

    Xiaomeng Tong
     
  • [ Upstream commit e68cb83a57a458b01c9739e2ad9cb70b04d1e6d2 ]

    If bitmap area contains invalid data, kernel will crash then mdadm
    triggers "Segmentation fault".
    This is cluster-md speical bug. In non-clustered env, mdadm will
    handle broken metadata case. In clustered array, only kernel space
    handles bitmap slot info. But even this bug only happened in clustered
    env, current sanity check is wrong, the code should be changed.

    How to trigger: (faulty injection)

    dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sda
    dd if=/dev/zero bs=1M count=1 oflag=direct of=/dev/sdb
    mdadm -C /dev/md0 -b clustered -e 1.2 -n 2 -l mirror /dev/sda /dev/sdb
    mdadm -Ss
    echo aaa > magic.txt
    == below modifying slot 2 bitmap data ==
    dd if=magic.txt of=/dev/sda seek=16384 bs=1 count=3
    Reported-by: Dan Carpenter
    Acked-by: Guoqing Jiang
    Signed-off-by: Heming Zhao
    Signed-off-by: Song Liu
    Signed-off-by: Sasha Levin

    Heming Zhao