These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / fs / jffs2 / readinode.c
index dddbde4..bfebbf1 100644 (file)
@@ -660,8 +660,12 @@ static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_r
 
                err = jffs2_flash_read(c, (ref_offset(ref)) + read,
                                rd->nsize - already, &read, &fd->name[already]);
-               if (unlikely(read != rd->nsize - already) && likely(!err))
+               if (unlikely(read != rd->nsize - already) && likely(!err)) {
+                       jffs2_free_full_dirent(fd);
+                       JFFS2_ERROR("short read: wanted %d bytes, got %zd\n",
+                                   rd->nsize - already, read);
                        return -EIO;
+               }
 
                if (unlikely(err)) {
                        JFFS2_ERROR("read remainder of name: error %d\n", err);
@@ -1203,17 +1207,13 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
                JFFS2_ERROR("failed to read from flash: error %d, %zd of %zd bytes read\n",
                        ret, retlen, sizeof(*latest_node));
                /* FIXME: If this fails, there seems to be a memory leak. Find it. */
-               mutex_unlock(&f->sem);
-               jffs2_do_clear_inode(c, f);
-               return ret?ret:-EIO;
+               return ret ? ret : -EIO;
        }
 
        crc = crc32(0, latest_node, sizeof(*latest_node)-8);
        if (crc != je32_to_cpu(latest_node->node_crc)) {
                JFFS2_ERROR("CRC failed for read_inode of inode %u at physical location 0x%x\n",
                        f->inocache->ino, ref_offset(rii.latest_ref));
-               mutex_unlock(&f->sem);
-               jffs2_do_clear_inode(c, f);
                return -EIO;
        }
 
@@ -1250,16 +1250,11 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
                         * keep in RAM to facilitate quick follow symlink
                         * operation. */
                        uint32_t csize = je32_to_cpu(latest_node->csize);
-                       if (csize > JFFS2_MAX_NAME_LEN) {
-                               mutex_unlock(&f->sem);
-                               jffs2_do_clear_inode(c, f);
+                       if (csize > JFFS2_MAX_NAME_LEN)
                                return -ENAMETOOLONG;
-                       }
                        f->target = kmalloc(csize + 1, GFP_KERNEL);
                        if (!f->target) {
                                JFFS2_ERROR("can't allocate %u bytes of memory for the symlink target path cache\n", csize);
-                               mutex_unlock(&f->sem);
-                               jffs2_do_clear_inode(c, f);
                                return -ENOMEM;
                        }
 
@@ -1271,8 +1266,6 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
                                        ret = -EIO;
                                kfree(f->target);
                                f->target = NULL;
-                               mutex_unlock(&f->sem);
-                               jffs2_do_clear_inode(c, f);
                                return ret;
                        }
 
@@ -1289,15 +1282,11 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
                if (f->metadata) {
                        JFFS2_ERROR("Argh. Special inode #%u with mode 0%o had metadata node\n",
                               f->inocache->ino, jemode_to_cpu(latest_node->mode));
-                       mutex_unlock(&f->sem);
-                       jffs2_do_clear_inode(c, f);
                        return -EIO;
                }
                if (!frag_first(&f->fragtree)) {
                        JFFS2_ERROR("Argh. Special inode #%u with mode 0%o has no fragments\n",
                               f->inocache->ino, jemode_to_cpu(latest_node->mode));
-                       mutex_unlock(&f->sem);
-                       jffs2_do_clear_inode(c, f);
                        return -EIO;
                }
                /* ASSERT: f->fraglist != NULL */
@@ -1305,8 +1294,6 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
                        JFFS2_ERROR("Argh. Special inode #%u with mode 0x%x had more than one node\n",
                               f->inocache->ino, jemode_to_cpu(latest_node->mode));
                        /* FIXME: Deal with it - check crc32, check for duplicate node, check times and discard the older one */
-                       mutex_unlock(&f->sem);
-                       jffs2_do_clear_inode(c, f);
                        return -EIO;
                }
                /* OK. We're happy */
@@ -1400,10 +1387,8 @@ int jffs2_do_crccheck_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *i
        f->inocache = ic;
 
        ret = jffs2_do_read_inode_internal(c, f, &n);
-       if (!ret) {
-               mutex_unlock(&f->sem);
-               jffs2_do_clear_inode(c, f);
-       }
+       mutex_unlock(&f->sem);
+       jffs2_do_clear_inode(c, f);
        jffs2_xattr_do_crccheck_inode(c, ic);
        kfree (f);
        return ret;