From eda2c7c523d858d25fe25052254a7f393767310b Mon Sep 17 00:00:00 2001 From: "Jason M. Bills" Date: Tue, 5 May 2020 15:31:17 -0700 Subject: Update to internal 0.53 Signed-off-by: Jason M. Bills --- ...Fix-for-dirty-node-in-jffs2-summary-entry.patch | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0102-Fix-for-dirty-node-in-jffs2-summary-entry.patch (limited to 'meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0102-Fix-for-dirty-node-in-jffs2-summary-entry.patch') diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0102-Fix-for-dirty-node-in-jffs2-summary-entry.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0102-Fix-for-dirty-node-in-jffs2-summary-entry.patch new file mode 100644 index 000000000..f3bb26a8a --- /dev/null +++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0102-Fix-for-dirty-node-in-jffs2-summary-entry.patch @@ -0,0 +1,94 @@ +From 9d4191d2702ad5a368ca79eb253de26ce94b91c7 Mon Sep 17 00:00:00 2001 +From: AppaRao Puli +Date: Mon, 30 Mar 2020 11:00:16 +0530 +Subject: [PATCH] From: Thomas Betker + +jffs2_flash_direct_writev() always invokes jffs2_sum_add_kvec(), even +if mtd_writev() fails. Usually, this results in an extra summary entry +pointing to dirty node space, which should be ignored -- it is a bit of +a waste, but harmless. + +When mtd_writev() returns *retlen == 0, though, the node space is not +reserved as dirty, but re-used; the extra summary entry then points +into the space of the next node. After the erase block has been closed, +we get the following messages on remount: + + jffs2: error: (79) jffs2_link_node_ref: + Adding new ref c3048d18 at (0x00ec5b88-0x00ec6bcc) + not immediately after previous (0x00ec5b88-0x00ec5b88) + ... + jffs2: Checked all inodes but still 0x2088 bytes of unchecked space? + jffs2: No space for garbage collection. Aborting GC thread + +The extra summary entries amount to "unchecked space", so that +jffs2_garbage_collect_pass() returns -ENOSPC. And without garbage +collection, the filesystem becomes unuseable over time as the erase +blocks fill up. + +Fix this by skipping jffs2_sum_add_kvec() when the MTD write fails. We +don't need the summary entry anyway, and the behaviour matches that of +jffs2_flash_writev() in wbuf.c (with write buffering enabled). + +Signed-off-by: Thomas Betker +--- + fs/jffs2/writev.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/fs/jffs2/writev.c b/fs/jffs2/writev.c +index a1bda9d..eec4197 100644 +--- a/fs/jffs2/writev.c ++++ b/fs/jffs2/writev.c +@@ -16,9 +16,18 @@ + int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs, + unsigned long count, loff_t to, size_t *retlen) + { ++ int ret; ++ ++ ret = mtd_writev(c->mtd, vecs, count, to, retlen); ++ + if (!jffs2_is_writebuffered(c)) { + if (jffs2_sum_active()) { + int res; ++ ++ if (ret || ++ *retlen != iov_length((struct iovec *) vecs, count)) ++ return ret; ++ + res = jffs2_sum_add_kvec(c, vecs, count, (uint32_t) to); + if (res) { + return res; +@@ -26,19 +35,23 @@ int jffs2_flash_direct_writev(struct jffs2_sb_info *c, const struct kvec *vecs, + } + } + +- return mtd_writev(c->mtd, vecs, count, to, retlen); ++ return ret; + } + + int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, + size_t *retlen, const u_char *buf) + { + int ret; ++ + ret = mtd_write(c->mtd, ofs, len, retlen, buf); + + if (jffs2_sum_active()) { + struct kvec vecs[1]; + int res; + ++ if (ret || *retlen != len) ++ return ret; ++ + vecs[0].iov_base = (unsigned char *) buf; + vecs[0].iov_len = len; + +@@ -47,5 +60,6 @@ int jffs2_flash_direct_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, + return res; + } + } ++ + return ret; + } +-- +2.7.4 + -- cgit v1.2.3