[RFC v2 0/5] md/raid1: introduce a new sync action to repair badblocks
Zheng Qixing <[email protected]>
| Newsgroups | gmane.linux.raid,gmane.linux.kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Zheng Qixing <[email protected]> Hi, This is v2 of the series. # Mechanism When rectifying badblocks, we issue a single repair write for the bad range (copy data from a good mirror to the corresponding LBA on bad mirror). Once the write completes successfully (bi_status == 0), the LBA range is cleared from the badblocks table. If the media is still bad for that LBA, a subsequent read/write will fail again and the range will be marked bad again. Doing a read-back for every repair would only prove that the data is readable at that moment, and it does not provide a stronger guarantee against future internal remapping. # Why use LBS granularity for bad-block repair? In our RAID1 bad-block repair (rectify) testing on a device reporting 512B logical blocks and 4KiB physical blocks, we issue 512B I/O directly to the md device and inject an I/O fault. Since the md badblocks table can only track failures in terms of host-visible LBA ranges, it is updated at 512B sector granularity (i.e., it records the failing sector) and does not attempt to infer or expand the entry to a 4KiB physical-block boundary. Given that the OS has no visibility into the device's internal mapping from LBAs to physical media (or the FTL), using logical block size for recording and repairing bad blocks is the most appropriate choice from a correctness standpoint. If the underlying media failure is actually larger than 512B, this is typically reflected by subsequent failures on adjacent LBAs, at which point the recorded bad range will naturally grow to cover the affected area. # Tests This feature has been tested on a RAID1 built from two 480GB system disks. It has also been tested under QEMU with a 4-disk RAID1 setup, with both memory fault injection and I/O fault injection enabled. In addition, we will add a new test (26raid1-rectify-badblocks) in mdadm/tests to verify whether `rectify` can effectively repair sectors recorded in bad_blocks. # TODO rectify currently only supports bad-block repair for the RAID1 level. We will consider extending it to RAID5/10 in follow-up work. Changes in v2: - Patch 1: Remove non-essential helpers to reduce indirection. - Patch 2: Split out a bugfix that was previously included in patch 1. - Patch 3: Rename the /proc/mdstat action from "recovery" to "recover" to match the naming used by action_store() and action_show(). - Patch 4: Add a brief comment for MAX_RAID_DISKS. - Patch 5: For rectify, reuse handle_sync_write_finished() to handle write request completion, removing duplicate completion handling. Link of v1: https://lore.kernel.org/all/[email protected]/ Zheng Qixing (5): md: add helpers for requested sync action md: serialize requested sync actions and clear stale request state md: rename mdstat action "recovery" to "recover" md: introduce MAX_RAID_DISKS macro to replace magic number md/raid1: introduce rectify action to repair badblocks drivers/md/md.c | 152 +++++++++++++++++++------ drivers/md/md.h | 21 ++++ drivers/md/raid1.c | 270 ++++++++++++++++++++++++++++++++++++++++++++- drivers/md/raid1.h | 1 + 4 files changed, 409 insertions(+), 35 deletions(-) -- 2.39.2