[PATCH v2 0/7] jffs2: extend write verification to all write paths
From: zhouminqiang
Date: Sat Aug 29 2026 - 02:25:43 EST
When JFFS2 writes data to flash, corruption can occur during the
write transfer (RAM failures, bus errors) or after commit to the
medium (bit flips). To distinguish whether the corruption happened
before or after the data reached the flash, commit a6bc432e296d
("[JFFS2] Add support for write-buffer verification.") introduced
CONFIG_JFFS2_FS_WBUF_VERIFY: reading the data back immediately
after a successful write and comparing it with the in-memory
source buffer provides the missing observation point for that
diagnosis.
However, the current implementation only performs read-back
verification on write-buffer flush paths. NOR flash devices write
directly through jffs2_flash_direct_write() and
jffs2_flash_direct_writev(), with no equivalent check. Data
corruption incidents have been observed on NOR-based devices in
production environments, yet there is no quick diagnostic tool to
isolate whether the corruption occurred during the write transfer
or after commit to the medium. A significant number of deployed
devices rely on JFFS2 on NOR flash, making this gap a practical
concern.
During the investigation of the NOR flash gap, code inspection also
revealed that when the write data length exceeds wbuf_pagesize in
jffs2_flash_writev(), the excess data bypasses the write buffer and
is written directly to flash via mtd_write(), with no verification.
Additionally, jffs2_wbuf_recover() does not clear c->wbuf_len on
recovery failure, which can lead to BUG_ON in jffs2_link_node_ref()
or deadlock in jffs2_flush_wbuf_pad() on a subsequent write.
This series closes these gaps with the following changes:
- Patch 1: fix wbuf recovery failure exit paths to clear
c->wbuf_len, preventing BUG_ON and deadlock
- Patch 2: replace pre-allocated per-superblock wbuf_verify
buffer with on-demand allocation inside jffs2_verify_write()
- Patch 3: add byte-by-byte comparison after memcmp() mismatch
to pinpoint the exact mismatch offset
- Patch 4: add verification in jffs2_flash_writev() for the
mtd_write() path that bypasses the write buffer
- Patch 5: add verification calls in jffs2_flash_direct_write() and
jffs2_flash_direct_writev() for NOR flash devices
- Patch 6: rename CONFIG_JFFS2_FS_WBUF_VERIFY to
CONFIG_JFFS2_FS_WRITE_VERIFY and remove the Kconfig
dependency on CONFIG_JFFS2_FS_WRITEBUFFER
- Patch 7: add module parameter write_verify for runtime
enable/disable of write verification
This series extends the existing write verification mechanism to
cover all write paths. It remains off by default and does not
alter JFFS2's node CRC integrity checks.
Changes in v2:
- Add patch to fix wbuf recovery failure exit paths not clearing
c->wbuf_len, preventing BUG_ON and deadlock on subsequent writes
- Use kmalloc() instead of vmalloc() for verify buffer allocation
- Keep memcmp() on the hotpath and add byte-by-byte comparison
only after a mismatch, rather than replacing memcmp() entirely
- In jffs2_flash_direct_write() and jffs2_flash_direct_writev(),
call mtd_write() before jffs2_sum_add_kvec() to prevent
retlen from being uninitialized if jffs2_sum_add_kvec() causes
an early return
- Update defconfig files to rename CONFIG_JFFS2_FS_WBUF_VERIFY to
CONFIG_JFFS2_FS_WRITE_VERIFY
- Link to v1: https://lore.kernel.org/linux-mtd/20260820105003.2525647-1-zhouminqiang2@xxxxxxxxxx/T/#t
zhouminqiang (7):
jffs2: wbuf: clear wbuf on recovery failure paths
jffs2: replace per-superblock verify buffer with per-write buffer
jffs2: write verify: add byte-by-byte comparison on mismatch
jffs2: add write verification to direct page writes in flash_writev
jffs2: add write verification to NOR direct write paths
jffs2: rename CONFIG_JFFS2_FS_WBUF_VERIFY to
CONFIG_JFFS2_FS_WRITE_VERIFY
jffs2: add runtime toggle for write verification
arch/arm/configs/keystone_defconfig | 2 +-
arch/arm/configs/lpc32xx_defconfig | 2 +-
arch/arm/configs/pxa3xx_defconfig | 2 +-
arch/arm/configs/pxa_defconfig | 2 +-
arch/powerpc/configs/44x/fsp2_defconfig | 2 +-
fs/jffs2/Kconfig | 31 ++++-
fs/jffs2/jffs2_fs_sb.h | 3 -
fs/jffs2/os-linux.h | 11 ++
fs/jffs2/wbuf.c | 91 +++------------
fs/jffs2/writev.c | 144 +++++++++++++++++++++++-
10 files changed, 198 insertions(+), 92 deletions(-)
--
2.52.0