From: zhouminqiang <zhouminqiang2@huawei.com>
To: <dwmw2@infradead.org>, <richard@nod.at>
Cc: <linux-mtd@lists.infradead.org>, <linux-kernel@vger.kernel.org>,
<chengzhihao1@huawei.com>, <yangerkun@huawei.com>,
<yi.zhang@huawei.com>
Subject: [PATCH 2/6] jffs2: write verify: replace memcmp with byte-by-byte comparison
Date: Thu, 20 Aug 2026 18:49:58 +0800 [thread overview]
Message-ID: <20260820105003.2525647-3-zhouminqiang2@huawei.com> (raw)
In-Reply-To: <20260820105003.2525647-1-zhouminqiang2@huawei.com>
jffs2_verify_write() uses memcmp() to compare the write buffer
against data read back from flash. While memcmp() compares byte
by byte internally, it only reports equal or not-equal without
identifying the mismatch offset.
To pinpoint the exact mismatch offset, replace this with the
approach used by UBI's self_check_write(): compare byte by byte
and, on mismatch, report the first differing offset and dump up
to 128 bytes of both the source and read-back data.
Signed-off-by: zhouminqiang <zhouminqiang2@huawei.com>
---
fs/jffs2/wbuf.c | 53 +++++++++++++++++++++++++++++--------------------
1 file changed, 31 insertions(+), 22 deletions(-)
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 7e4608b43a4e..da6da813a4ef 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -231,8 +231,8 @@ static struct jffs2_raw_node_ref **jffs2_incore_replace_raw(struct jffs2_sb_info
static int jffs2_verify_write(struct jffs2_sb_info *c, unsigned char *buf,
uint32_t ofs)
{
- int ret;
- size_t retlen;
+ int ret = 0;
+ size_t retlen, i;
char *eccstr;
void *verify_buf;
@@ -246,37 +246,46 @@ static int jffs2_verify_write(struct jffs2_sb_info *c, unsigned char *buf,
ret = mtd_read(c->mtd, ofs, c->wbuf_pagesize, &retlen, verify_buf);
if (ret && ret != -EUCLEAN && ret != -EBADMSG) {
pr_warn("%s(): Read back of page at %08x failed: %d\n",
- __func__, c->wbuf_ofs, ret);
+ __func__, ofs, ret);
goto out_free;
} else if (retlen != c->wbuf_pagesize) {
- pr_warn("%s(): Read back of page at %08x gave short read: %zd not %d\n",
+ pr_warn("%s(): Read back of page at %08x gave short read: %zu not %d\n",
__func__, ofs, retlen, c->wbuf_pagesize);
ret = -EIO;
goto out_free;
}
- if (!memcmp(buf, verify_buf, c->wbuf_pagesize)) {
- ret = 0;
- goto out_free;
- }
- if (ret == -EUCLEAN)
- eccstr = "corrected";
- else if (ret == -EBADMSG)
- eccstr = "correction failed";
- else
- eccstr = "OK or unused";
+ for (i = 0; i < c->wbuf_pagesize; i++) {
+ uint8_t c1 = ((uint8_t *)buf)[i];
+ uint8_t c2 = ((uint8_t *)verify_buf)[i];
+ int dump_len;
- pr_warn("Write verify error (ECC %s) at %08x. Wrote:\n",
- eccstr, c->wbuf_ofs);
- print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
- c->wbuf, c->wbuf_pagesize, 0);
+ if (c1 == c2)
+ continue;
- pr_warn("Read back:\n");
- print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
- verify_buf, c->wbuf_pagesize, 0);
+ if (ret == -EUCLEAN)
+ eccstr = "corrected";
+ else if (ret == -EBADMSG)
+ eccstr = "correction failed";
+ else
+ eccstr = "OK or unused";
+
+ dump_len = min_t(int, 128, c->wbuf_pagesize - i);
+ pr_warn("Write verify error (ECC %s) at %08x (+%zu/%d). Wrote:\n",
+ eccstr, ofs, i, c->wbuf_pagesize);
+ print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
+ buf + i, dump_len, 0);
+
+ pr_warn("Read back:\n");
+ print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
+ verify_buf + i, dump_len, 0);
+
+ ret = -EIO;
+ goto out_free;
+ }
vfree(verify_buf);
- return -EIO;
+ return 0;
out_free:
vfree(verify_buf);
--
2.52.0
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
WARNING: multiple messages have this Message-ID (diff)
From: zhouminqiang <zhouminqiang2@huawei.com>
To: <dwmw2@infradead.org>, <richard@nod.at>
Cc: <linux-mtd@lists.infradead.org>, <linux-kernel@vger.kernel.org>,
<chengzhihao1@huawei.com>, <yangerkun@huawei.com>,
<yi.zhang@huawei.com>
Subject: [PATCH 2/6] jffs2: write verify: replace memcmp with byte-by-byte comparison
Date: Thu, 20 Aug 2026 18:49:58 +0800 [thread overview]
Message-ID: <20260820105003.2525647-3-zhouminqiang2@huawei.com> (raw)
In-Reply-To: <20260820105003.2525647-1-zhouminqiang2@huawei.com>
jffs2_verify_write() uses memcmp() to compare the write buffer
against data read back from flash. While memcmp() compares byte
by byte internally, it only reports equal or not-equal without
identifying the mismatch offset.
To pinpoint the exact mismatch offset, replace this with the
approach used by UBI's self_check_write(): compare byte by byte
and, on mismatch, report the first differing offset and dump up
to 128 bytes of both the source and read-back data.
Signed-off-by: zhouminqiang <zhouminqiang2@huawei.com>
---
fs/jffs2/wbuf.c | 53 +++++++++++++++++++++++++++++--------------------
1 file changed, 31 insertions(+), 22 deletions(-)
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
index 7e4608b43a4e..da6da813a4ef 100644
--- a/fs/jffs2/wbuf.c
+++ b/fs/jffs2/wbuf.c
@@ -231,8 +231,8 @@ static struct jffs2_raw_node_ref **jffs2_incore_replace_raw(struct jffs2_sb_info
static int jffs2_verify_write(struct jffs2_sb_info *c, unsigned char *buf,
uint32_t ofs)
{
- int ret;
- size_t retlen;
+ int ret = 0;
+ size_t retlen, i;
char *eccstr;
void *verify_buf;
@@ -246,37 +246,46 @@ static int jffs2_verify_write(struct jffs2_sb_info *c, unsigned char *buf,
ret = mtd_read(c->mtd, ofs, c->wbuf_pagesize, &retlen, verify_buf);
if (ret && ret != -EUCLEAN && ret != -EBADMSG) {
pr_warn("%s(): Read back of page at %08x failed: %d\n",
- __func__, c->wbuf_ofs, ret);
+ __func__, ofs, ret);
goto out_free;
} else if (retlen != c->wbuf_pagesize) {
- pr_warn("%s(): Read back of page at %08x gave short read: %zd not %d\n",
+ pr_warn("%s(): Read back of page at %08x gave short read: %zu not %d\n",
__func__, ofs, retlen, c->wbuf_pagesize);
ret = -EIO;
goto out_free;
}
- if (!memcmp(buf, verify_buf, c->wbuf_pagesize)) {
- ret = 0;
- goto out_free;
- }
- if (ret == -EUCLEAN)
- eccstr = "corrected";
- else if (ret == -EBADMSG)
- eccstr = "correction failed";
- else
- eccstr = "OK or unused";
+ for (i = 0; i < c->wbuf_pagesize; i++) {
+ uint8_t c1 = ((uint8_t *)buf)[i];
+ uint8_t c2 = ((uint8_t *)verify_buf)[i];
+ int dump_len;
- pr_warn("Write verify error (ECC %s) at %08x. Wrote:\n",
- eccstr, c->wbuf_ofs);
- print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
- c->wbuf, c->wbuf_pagesize, 0);
+ if (c1 == c2)
+ continue;
- pr_warn("Read back:\n");
- print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
- verify_buf, c->wbuf_pagesize, 0);
+ if (ret == -EUCLEAN)
+ eccstr = "corrected";
+ else if (ret == -EBADMSG)
+ eccstr = "correction failed";
+ else
+ eccstr = "OK or unused";
+
+ dump_len = min_t(int, 128, c->wbuf_pagesize - i);
+ pr_warn("Write verify error (ECC %s) at %08x (+%zu/%d). Wrote:\n",
+ eccstr, ofs, i, c->wbuf_pagesize);
+ print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
+ buf + i, dump_len, 0);
+
+ pr_warn("Read back:\n");
+ print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1,
+ verify_buf + i, dump_len, 0);
+
+ ret = -EIO;
+ goto out_free;
+ }
vfree(verify_buf);
- return -EIO;
+ return 0;
out_free:
vfree(verify_buf);
--
2.52.0
next prev parent reply other threads:[~2026-08-20 10:57 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-20 10:49 [PATCH 0/6] jffs2: extend write verification to all write paths zhouminqiang
2026-08-20 10:49 ` zhouminqiang
2026-08-20 10:49 ` [PATCH 1/6] jffs2: replace per-superblock verify buffer with per-write buffer zhouminqiang
2026-08-20 10:49 ` zhouminqiang
2026-08-20 10:49 ` zhouminqiang [this message]
2026-08-20 10:49 ` [PATCH 2/6] jffs2: write verify: replace memcmp with byte-by-byte comparison zhouminqiang
2026-08-20 10:49 ` [PATCH 3/6] jffs2: add write verification to direct page writes in flash_writev zhouminqiang
2026-08-20 10:49 ` zhouminqiang
2026-08-20 10:50 ` [PATCH 4/6] jffs2: add write verification to NOR direct write paths zhouminqiang
2026-08-20 10:50 ` zhouminqiang
2026-08-20 10:50 ` [PATCH 5/6] jffs2: rename CONFIG_JFFS2_FS_WBUF_VERIFY to CONFIG_JFFS2_FS_WRITE_VERIFY zhouminqiang
2026-08-20 10:50 ` zhouminqiang
2026-08-20 10:50 ` [PATCH 6/6] jffs2: add runtime toggle for write verification zhouminqiang
2026-08-20 10:50 ` zhouminqiang
2026-08-20 18:58 ` [PATCH 0/6] jffs2: extend write verification to all write paths Richard Weinberger
2026-08-20 18:58 ` Richard Weinberger
2026-08-20 20:46 ` David Woodhouse
2026-08-20 20:46 ` David Woodhouse
2026-08-21 3:37 ` zhouminqiang
2026-08-21 3:37 ` zhouminqiang
2026-08-21 6:31 ` Richard Weinberger
2026-08-21 6:31 ` Richard Weinberger
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=20260820105003.2525647-3-zhouminqiang2@huawei.com \
--to=zhouminqiang2@huawei.com \
--cc=chengzhihao1@huawei.com \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=richard@nod.at \
--cc=yangerkun@huawei.com \
--cc=yi.zhang@huawei.com \
/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.