From: "Pierre.Ricadat@UTBM.fr" <Pierre.Ricadat@utbm.fr>
To: linux-mtd@lists.infradead.org
Subject: [PATCH] separate routine to check jffs2_flash_read
Date: Wed, 26 Oct 2005 09:32:44 +0200 [thread overview]
Message-ID: <1130311964.435f311cf30e9@webmail2.utbm.fr> (raw)
[-- Attachment #1: Type: text/plain, Size: 473 bytes --]
Hi all'
here i attach a small patch for that 'todo' in nodelist.c:
/* TODO: this is very frequent pattern, make it a separate
* routine */
err = jffs2_flash_read(c, ofs, len, &retlen, buffer);
...
about the checking of jffs2_flash_read().
I made a new function : jffs2_check_flash_read to
- check that jffs2_flash_read returns success
- check that it read all
and in a case of failure, print error, free the buffer and return error code.
--
Pierre Ricadat
[-- Attachment #2: jffs2_check_flash_read.patch --]
[-- Type: text/plain, Size: 11064 bytes --]
diff -u ./mtd/fs/jffs2/debug.c ./mtd_pierre/fs/jffs2/debug.c
--- ./mtd/fs/jffs2/debug.c 2005-09-21 22:28:35.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/debug.c 2005-10-24 17:03:25.000000000 +0900
@@ -131,12 +131,8 @@
return;
ret = jffs2_flash_read(c, ofs, len, &retlen, buf);
- if (ret || (retlen != len)) {
- JFFS2_WARNING("read %d bytes failed or short. ret %d, retlen %zd.\n",
- len, ret, retlen);
- kfree(buf);
+ if (!jffs2_check_flash_read(ret, ofs, len, retlen, &buf))
return;
- }
ret = 0;
for (i = 0; i < len; i++)
@@ -620,11 +616,8 @@
printk(JFFS2_DBG_MSG_PREFIX " dump node at offset %#08x.\n", ofs);
ret = jffs2_flash_read(c, ofs, len, &retlen, (unsigned char *)&node);
- if (ret || (retlen != len)) {
- JFFS2_ERROR("read %d bytes failed or short. ret %d, retlen %zd.\n",
- len, ret, retlen);
+ if (!jffs2_check_flash_read(ret, ofs, len, retlen, (unsigned char *)&node))
return;
- }
printk(JFFS2_DBG "magic:\t%#04x\n", je16_to_cpu(node.u.magic));
printk(JFFS2_DBG "nodetype:\t%#04x\n", je16_to_cpu(node.u.nodetype));
diff -u ./mtd/fs/jffs2/erase.c ./mtd_pierre/fs/jffs2/erase.c
--- ./mtd/fs/jffs2/erase.c 2005-09-20 23:53:15.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/erase.c 2005-10-24 17:12:57.000000000 +0900
@@ -323,14 +323,8 @@
*bad_offset = ofs;
ret = jffs2_flash_read(c, ofs, readlen, &retlen, ebuf);
- if (ret) {
- printk(KERN_WARNING "Read of newly-erased block at 0x%08x failed: %d. Putting on bad_list\n", ofs, ret);
- goto fail;
- }
- if (retlen != readlen) {
- printk(KERN_WARNING "Short read from newly-erased block at 0x%08x. Wanted %d, got %zd\n", ofs, readlen, retlen);
- goto fail;
- }
+ if (!jffs2_check_flash_read(ret, ofs, readlen, retlen, (void *)&ebuf))
+ return ret;
for (i=0; i<readlen; i += sizeof(unsigned long)) {
/* It's OK. We know it's properly aligned */
unsigned long *datum = ebuf + i;
diff -u ./mtd/fs/jffs2/gc.c ./mtd_pierre/fs/jffs2/gc.c
--- ./mtd/fs/jffs2/gc.c 2005-09-07 17:34:54.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/gc.c 2005-10-25 14:42:04.000000000 +0900
@@ -531,10 +531,8 @@
return -ENOMEM;
ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)node);
- if (!ret && retlen != rawlen)
- ret = -EIO;
- if (ret)
- goto out_node;
+ if (!jffs2_check_flash_read(ret, ref_offset(raw), rawlen, retlen, (char *)&node))
+ return ret;
crc = crc32(0, node, sizeof(struct jffs2_unknown_node)-4);
if (je32_to_cpu(node->u.hdr_crc) != crc) {
@@ -853,16 +851,9 @@
/* This is an obsolete node belonging to the same directory, and it's of the right
length. We need to take a closer look...*/
ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)rd);
- if (ret) {
- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Read error (%d) reading obsolete node at %08x\n", ret, ref_offset(raw));
+ if (!jffs2_check_flash_read(ret, ref_offset(raw), rawlen, retlen, (char *)rd))
/* If we can't read it, we don't need to continue to obsolete it. Continue */
continue;
- }
- if (retlen != rawlen) {
- printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Short read (%zd not %u) reading header from obsolete node at %08x\n",
- retlen, rawlen, ref_offset(raw));
- continue;
- }
if (je16_to_cpu(rd->nodetype) != JFFS2_NODETYPE_DIRENT)
continue;
diff -u ./mtd/fs/jffs2/nodelist.c ./mtd_pierre/fs/jffs2/nodelist.c
--- ./mtd/fs/jffs2/nodelist.c 2005-09-21 22:28:35.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/nodelist.c 2005-10-24 17:17:24.000000000 +0900
@@ -451,19 +451,9 @@
if (unlikely(!buffer))
return -ENOMEM;
- /* TODO: this is very frequent pattern, make it a separate
- * routine */
err = jffs2_flash_read(c, ofs, len, &retlen, buffer);
- if (err) {
- JFFS2_ERROR("can not read %d bytes from 0x%08x, error code: %d.\n", len, ofs, err);
- goto free_out;
- }
-
- if (retlen != len) {
- JFFS2_ERROR("short read at %#08x: %d instead of %d.\n", ofs, retlen, len);
- err = -EIO;
- goto free_out;
- }
+ if (!jffs2_check_flash_read(err, ofs, len, retlen, (unsigned char*)&buffer))
+ return err;
}
/* Continue calculating CRC */
@@ -498,14 +488,6 @@
return 0;
-free_out:
- if(!pointed)
- kfree(buffer);
-#ifndef __ECOS
- else
- c->mtd->unpoint(c->mtd, buffer, ofs, len);
-#endif
- return err;
}
diff -u ./mtd/fs/jffs2/os-linux.h ./mtd_pierre/fs/jffs2/os-linux.h
--- ./mtd/fs/jffs2/os-linux.h 2005-09-30 22:59:13.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/os-linux.h 2005-10-24 19:03:35.000000000 +0900
@@ -122,6 +122,7 @@
int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *vecs, unsigned long count, loff_t to, size_t *retlen, uint32_t ino);
int jffs2_flash_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, const u_char *buf);
int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, u_char *buf);
+int jffs2_check_flash_read(int err, uint32_t ofs, int len, size_t retlen, u_char *buf);
int jffs2_check_oob_empty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,int mode);
int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
diff -u ./mtd/fs/jffs2/read.c ./mtd_pierre/fs/jffs2/read.c
--- ./mtd/fs/jffs2/read.c 2005-07-22 19:32:08.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/read.c 2005-10-24 17:14:45.000000000 +0900
@@ -114,10 +114,8 @@
ret = jffs2_flash_read(c, (ref_offset(fd->raw)) + sizeof(*ri),
je32_to_cpu(ri->csize), &readlen, readbuf);
- if (!ret && readlen != je32_to_cpu(ri->csize))
- ret = -EIO;
- if (ret)
- goto out_decomprbuf;
+ if (!jffs2_check_flash_read(ret, (ref_offset(fd->raw)) + sizeof(*ri), je32_to_cpu(ri->csize), readlen, (unsigned char*)&readbuf))
+ return ret;
crc = crc32(0, readbuf, je32_to_cpu(ri->csize));
if (crc != je32_to_cpu(ri->data_crc)) {
diff -u ./mtd/fs/jffs2/readinode.c ./mtd_pierre/fs/jffs2/readinode.c
--- ./mtd/fs/jffs2/readinode.c 2005-09-20 23:27:34.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/readinode.c 2005-10-24 17:15:11.000000000 +0900
@@ -427,17 +427,8 @@
dbg_readinode("read more %d bytes\n", len);
err = jffs2_flash_read(c, offs, len, &retlen, bufstart);
- if (err) {
- JFFS2_ERROR("can not read %d bytes from 0x%08x, "
- "error code: %d.\n", len, offs, err);
+ if (!jffs2_check_flash_read(err, offs, len, retlen, (unsigned char*)&bufstart))
return err;
- }
-
- if (retlen < len) {
- JFFS2_ERROR("short read at %#08x: %d instead of %d.\n",
- offs, retlen, len);
- return -EIO;
- }
*rdlen = right_len;
diff -u ./mtd/fs/jffs2/scan.c ./mtd_pierre/fs/jffs2/scan.c
--- ./mtd/fs/jffs2/scan.c 2005-09-30 22:59:13.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/scan.c 2005-10-24 17:15:30.000000000 +0900
@@ -276,14 +276,8 @@
size_t retlen;
ret = jffs2_flash_read(c, ofs, len, &retlen, buf);
- if (ret) {
- D1(printk(KERN_WARNING "mtd->read(0x%x bytes from 0x%x) returned %d\n", len, ofs, ret));
+ if (!jffs2_check_flash_read(ret, ofs, len, retlen, (void *)&buf))
return ret;
- }
- if (retlen < len) {
- D1(printk(KERN_WARNING "Read at 0x%x gave only 0x%zx bytes\n", ofs, retlen));
- return -EIO;
- }
D2(printk(KERN_DEBUG "Read 0x%x bytes from 0x%08x into buf\n", len, ofs));
D2(printk(KERN_DEBUG "000: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]));
diff -u ./mtd/fs/jffs2/wbuf.c ./mtd_pierre/fs/jffs2/wbuf.c
--- ./mtd/fs/jffs2/wbuf.c 2005-09-30 22:59:13.000000000 +0900
+++ ./mtd_pierre/fs/jffs2/wbuf.c 2005-10-24 19:03:02.000000000 +0900
@@ -923,6 +923,28 @@
}
/*
+ * Check if jffs2_flash_read was successful
+ */
+int jffs2_check_flash_read(int err, uint32_t ofs, int len, size_t retlen, u_char *buf)
+{
+ int ret = 1;
+
+ /* did the read succeed? */
+ if (err) {
+ JFFS2_ERROR("can not read %d bytes from 0x%08x, error code: %d.\n", len, ofs, err);
+ kfree(buf);
+ ret = 0;
+ }
+ /* did we read all? */
+ if (retlen != len) {
+ JFFS2_ERROR("short read at 0x%08x: %d instead of %d.\n", ofs, retlen, len);
+ kfree(buf);
+ ret = 0;
+ }
+ return ret;
+}
+
+/*
* Check, if the out of band area is empty
*/
int jffs2_check_oob_empty( struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, int mode)
@@ -946,17 +968,8 @@
* to take care of the cleanmarker in the first page of the block
*/
ret = jffs2_flash_read_oob(c, jeb->offset, len , &retlen, buf);
- if (ret) {
- D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB failed %d for block at %08x\n", ret, jeb->offset));
- goto out;
- }
-
- if (retlen < len) {
- D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB return short read "
- "(%zd bytes not %d) for block at %08x\n", retlen, len, jeb->offset));
- ret = -EIO;
- goto out;
- }
+ if (!jffs2_check_flash_read(ret, jeb->offset, len, retlen, (unsigned char*)&buf))
+ return ret;
/* Special check for first page */
for(i = 0; i < oob_size ; i++) {
next reply other threads:[~2005-10-26 7:32 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-10-26 7:32 Pierre.Ricadat@UTBM.fr [this message]
2005-10-28 14:27 ` [PATCH] separate routine to check jffs2_flash_read Jörn Engel
2005-10-31 10:12 ` pierre.ricadat@utbm.fr
2005-10-31 14:33 ` Jörn Engel
2005-10-31 15:16 ` pierre.ricadat@utbm.fr
2005-10-31 15:24 ` Jörn Engel
2005-11-11 9:44 ` Pierre.Ricadat@UTBM.fr
2005-11-11 10:08 ` Jörn Engel
[not found] ` <1131707642.43747cfa9454b@webmail2.utbm.fr>
2005-11-11 12:13 ` Jörn Engel
2005-11-11 12:25 ` Pierre.Ricadat@UTBM.fr
2005-11-13 20:36 ` Thomas Gleixner
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=1130311964.435f311cf30e9@webmail2.utbm.fr \
--to=pierre.ricadat@utbm.fr \
--cc=linux-mtd@lists.infradead.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox