All of lore.kernel.org
 help / color / mirror / Atom feed
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++) {

             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 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.