^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * JFFS2 -- Journalling Flash File System, Version 2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Zoltan Sogor <weth@inf.u-szeged.hu>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Patrik Kluba <pajko@halom.u-szeged.hu>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * University of Szeged, Hungary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * 2006 KaiGai Kohei <kaigai@ak.jp.nec.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * For licensing information, see the file 'LICENCE' in this directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/mtd/mtd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/crc32.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/vmalloc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "nodelist.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) int jffs2_sum_init(struct jffs2_sb_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) uint32_t sum_size = min_t(uint32_t, c->sector_size, MAX_SUMMARY_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) c->summary = kzalloc(sizeof(struct jffs2_summary), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) if (!c->summary) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) JFFS2_WARNING("Can't allocate memory for summary information!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) c->summary->sum_buf = kmalloc(sum_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) if (!c->summary->sum_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) JFFS2_WARNING("Can't allocate buffer for writing out summary information!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) kfree(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) dbg_summary("returned successfully\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) void jffs2_sum_exit(struct jffs2_sb_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) dbg_summary("called\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) jffs2_sum_disable_collecting(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) kfree(c->summary->sum_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) c->summary->sum_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) kfree(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) c->summary = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) static int jffs2_sum_add_mem(struct jffs2_summary *s, union jffs2_sum_mem *item)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if (!s->sum_list_head)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) s->sum_list_head = (union jffs2_sum_mem *) item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (s->sum_list_tail)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) s->sum_list_tail->u.next = (union jffs2_sum_mem *) item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) s->sum_list_tail = (union jffs2_sum_mem *) item;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) switch (je16_to_cpu(item->u.nodetype)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) case JFFS2_NODETYPE_INODE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) s->sum_size += JFFS2_SUMMARY_INODE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) s->sum_num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) dbg_summary("inode (%u) added to summary\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) je32_to_cpu(item->i.inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) case JFFS2_NODETYPE_DIRENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) s->sum_size += JFFS2_SUMMARY_DIRENT_SIZE(item->d.nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) s->sum_num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) dbg_summary("dirent (%u) added to summary\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) je32_to_cpu(item->d.ino));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #ifdef CONFIG_JFFS2_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) case JFFS2_NODETYPE_XATTR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) s->sum_size += JFFS2_SUMMARY_XATTR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) s->sum_num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) dbg_summary("xattr (xid=%u, version=%u) added to summary\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) je32_to_cpu(item->x.xid), je32_to_cpu(item->x.version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) case JFFS2_NODETYPE_XREF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) s->sum_size += JFFS2_SUMMARY_XREF_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) s->sum_num++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) dbg_summary("xref added to summary\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) JFFS2_WARNING("UNKNOWN node type %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) je16_to_cpu(item->u.nodetype));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* The following 3 functions are called from scan.c to collect summary info for not closed jeb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) dbg_summary("called with %u\n", size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) s->sum_padded += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) uint32_t ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct jffs2_sum_inode_mem *temp = kmalloc(sizeof(struct jffs2_sum_inode_mem), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) temp->nodetype = ri->nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) temp->inode = ri->ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) temp->version = ri->version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) temp->offset = cpu_to_je32(ofs); /* relative offset from the beginning of the jeb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) temp->totlen = ri->totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) uint32_t ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) struct jffs2_sum_dirent_mem *temp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) kmalloc(sizeof(struct jffs2_sum_dirent_mem) + rd->nsize, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) temp->nodetype = rd->nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) temp->totlen = rd->totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) temp->offset = cpu_to_je32(ofs); /* relative from the beginning of the jeb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) temp->pino = rd->pino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) temp->version = rd->version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) temp->ino = rd->ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) temp->nsize = rd->nsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) temp->type = rd->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) memcpy(temp->name, rd->name, rd->nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #ifdef CONFIG_JFFS2_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) int jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) struct jffs2_sum_xattr_mem *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) temp = kmalloc(sizeof(struct jffs2_sum_xattr_mem), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) temp->nodetype = rx->nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) temp->xid = rx->xid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) temp->version = rx->version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) temp->offset = cpu_to_je32(ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) temp->totlen = rx->totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) int jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) struct jffs2_sum_xref_mem *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) temp = kmalloc(sizeof(struct jffs2_sum_xref_mem), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) temp->nodetype = rr->nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) temp->offset = cpu_to_je32(ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) return jffs2_sum_add_mem(s, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /* Cleanup every collected summary information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) static void jffs2_sum_clean_collected(struct jffs2_summary *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) union jffs2_sum_mem *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (!s->sum_list_head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) dbg_summary("already empty\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) while (s->sum_list_head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) temp = s->sum_list_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) s->sum_list_head = s->sum_list_head->u.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) kfree(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) s->sum_list_tail = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) s->sum_padded = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) s->sum_num = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) void jffs2_sum_reset_collected(struct jffs2_summary *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) dbg_summary("called\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) jffs2_sum_clean_collected(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) s->sum_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) void jffs2_sum_disable_collecting(struct jffs2_summary *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) dbg_summary("called\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) jffs2_sum_clean_collected(s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) s->sum_size = JFFS2_SUMMARY_NOSUM_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) int jffs2_sum_is_disabled(struct jffs2_summary *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) return (s->sum_size == JFFS2_SUMMARY_NOSUM_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) /* Move the collected summary information into sb (called from scan.c) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) void jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) dbg_summary("oldsize=0x%x oldnum=%u => newsize=0x%x newnum=%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) c->summary->sum_size, c->summary->sum_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) s->sum_size, s->sum_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) c->summary->sum_size = s->sum_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) c->summary->sum_num = s->sum_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) c->summary->sum_padded = s->sum_padded;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) c->summary->sum_list_head = s->sum_list_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) c->summary->sum_list_tail = s->sum_list_tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) s->sum_list_head = s->sum_list_tail = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) /* Called from wbuf.c to collect writed node info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) unsigned long count, uint32_t ofs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) union jffs2_node_union *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) struct jffs2_eraseblock *jeb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (c->summary->sum_size == JFFS2_SUMMARY_NOSUM_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) dbg_summary("Summary is disabled for this jeb! Skipping summary info!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) node = invecs[0].iov_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) jeb = &c->blocks[ofs / c->sector_size];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ofs -= jeb->offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) switch (je16_to_cpu(node->u.nodetype)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) case JFFS2_NODETYPE_INODE: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) struct jffs2_sum_inode_mem *temp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) kmalloc(sizeof(struct jffs2_sum_inode_mem), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) goto no_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) temp->nodetype = node->i.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) temp->inode = node->i.ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) temp->version = node->i.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) temp->offset = cpu_to_je32(ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) temp->totlen = node->i.totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) case JFFS2_NODETYPE_DIRENT: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct jffs2_sum_dirent_mem *temp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) kmalloc(sizeof(struct jffs2_sum_dirent_mem) + node->d.nsize, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) goto no_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) temp->nodetype = node->d.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) temp->totlen = node->d.totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) temp->offset = cpu_to_je32(ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) temp->pino = node->d.pino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) temp->version = node->d.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) temp->ino = node->d.ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) temp->nsize = node->d.nsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) temp->type = node->d.type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) switch (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) case 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) memcpy(temp->name,node->d.name,node->d.nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) case 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) memcpy(temp->name,invecs[1].iov_base,node->d.nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) BUG(); /* impossible count value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #ifdef CONFIG_JFFS2_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) case JFFS2_NODETYPE_XATTR: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct jffs2_sum_xattr_mem *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) temp = kmalloc(sizeof(struct jffs2_sum_xattr_mem), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) goto no_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) temp->nodetype = node->x.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) temp->xid = node->x.xid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) temp->version = node->x.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) temp->totlen = node->x.totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) temp->offset = cpu_to_je32(ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) case JFFS2_NODETYPE_XREF: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) struct jffs2_sum_xref_mem *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) temp = kmalloc(sizeof(struct jffs2_sum_xref_mem), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (!temp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) goto no_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) temp->nodetype = node->r.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) temp->offset = cpu_to_je32(ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) temp->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) return jffs2_sum_add_mem(c->summary, (union jffs2_sum_mem *)temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) case JFFS2_NODETYPE_PADDING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) dbg_summary("node PADDING\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) c->summary->sum_padded += je32_to_cpu(node->u.totlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) case JFFS2_NODETYPE_CLEANMARKER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) dbg_summary("node CLEANMARKER\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) case JFFS2_NODETYPE_SUMMARY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) dbg_summary("node SUMMARY\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /* If you implement a new node type you should also implement
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) summary support for it or disable summary.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) no_mem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) JFFS2_WARNING("MEMORY ALLOCATION ERROR!");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) static struct jffs2_raw_node_ref *sum_link_node_ref(struct jffs2_sb_info *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct jffs2_eraseblock *jeb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) uint32_t ofs, uint32_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) struct jffs2_inode_cache *ic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) /* If there was a gap, mark it dirty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if ((ofs & ~3) > c->sector_size - jeb->free_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) /* Ew. Summary doesn't actually tell us explicitly about dirty space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) jffs2_scan_dirty_space(c, jeb, (ofs & ~3) - (c->sector_size - jeb->free_size));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) return jffs2_link_node_ref(c, jeb, jeb->offset + ofs, len, ic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) /* Process the stored summary information - helper function for jffs2_sum_scan_sumnode() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) struct jffs2_raw_summary *summary, uint32_t *pseudo_random)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) struct jffs2_inode_cache *ic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) struct jffs2_full_dirent *fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) void *sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) int i, ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) sp = summary->sum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) for (i=0; i<je32_to_cpu(summary->sum_num); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) dbg_summary("processing summary index %d\n", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) cond_resched();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /* Make sure there's a spare ref for dirty space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) err = jffs2_prealloc_raw_node_refs(c, jeb, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) switch (je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) case JFFS2_NODETYPE_INODE: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) struct jffs2_sum_inode_flash *spi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) spi = sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ino = je32_to_cpu(spi->inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) dbg_summary("Inode at 0x%08x-0x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) jeb->offset + je32_to_cpu(spi->offset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) jeb->offset + je32_to_cpu(spi->offset) + je32_to_cpu(spi->totlen));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) ic = jffs2_scan_make_ino_cache(c, ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (!ic) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) JFFS2_NOTICE("scan_make_ino_cache failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) sum_link_node_ref(c, jeb, je32_to_cpu(spi->offset) | REF_UNCHECKED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) PAD(je32_to_cpu(spi->totlen)), ic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) *pseudo_random += je32_to_cpu(spi->version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) sp += JFFS2_SUMMARY_INODE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) case JFFS2_NODETYPE_DIRENT: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) struct jffs2_sum_dirent_flash *spd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) int checkedlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) spd = sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) dbg_summary("Dirent at 0x%08x-0x%08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) jeb->offset + je32_to_cpu(spd->offset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) jeb->offset + je32_to_cpu(spd->offset) + je32_to_cpu(spd->totlen));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* This should never happen, but https://dev.laptop.org/ticket/4184 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) checkedlen = strnlen(spd->name, spd->nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (!checkedlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) pr_err("Dirent at %08x has zero at start of name. Aborting mount.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) jeb->offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) je32_to_cpu(spd->offset));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) if (checkedlen < spd->nsize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) pr_err("Dirent at %08x has zeroes in name. Truncating to %d chars\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) jeb->offset +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) je32_to_cpu(spd->offset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) checkedlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) fd = jffs2_alloc_full_dirent(checkedlen+1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) if (!fd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) memcpy(&fd->name, spd->name, checkedlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) fd->name[checkedlen] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(spd->pino));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) if (!ic) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) jffs2_free_full_dirent(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) fd->raw = sum_link_node_ref(c, jeb, je32_to_cpu(spd->offset) | REF_UNCHECKED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) PAD(je32_to_cpu(spd->totlen)), ic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) fd->next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) fd->version = je32_to_cpu(spd->version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) fd->ino = je32_to_cpu(spd->ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) fd->nhash = full_name_hash(NULL, fd->name, checkedlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) fd->type = spd->type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) jffs2_add_fd_to_list(c, fd, &ic->scan_dents);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) *pseudo_random += je32_to_cpu(spd->version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) sp += JFFS2_SUMMARY_DIRENT_SIZE(spd->nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) #ifdef CONFIG_JFFS2_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) case JFFS2_NODETYPE_XATTR: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) struct jffs2_xattr_datum *xd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) struct jffs2_sum_xattr_flash *spx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) spx = (struct jffs2_sum_xattr_flash *)sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) dbg_summary("xattr at %#08x-%#08x (xid=%u, version=%u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) jeb->offset + je32_to_cpu(spx->offset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) jeb->offset + je32_to_cpu(spx->offset) + je32_to_cpu(spx->totlen),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) je32_to_cpu(spx->xid), je32_to_cpu(spx->version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) xd = jffs2_setup_xattr_datum(c, je32_to_cpu(spx->xid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) je32_to_cpu(spx->version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (IS_ERR(xd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) return PTR_ERR(xd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) if (xd->version > je32_to_cpu(spx->version)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /* node is not the newest one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) struct jffs2_raw_node_ref *raw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) = sum_link_node_ref(c, jeb, je32_to_cpu(spx->offset) | REF_UNCHECKED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) PAD(je32_to_cpu(spx->totlen)), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) raw->next_in_ino = xd->node->next_in_ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) xd->node->next_in_ino = raw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) xd->version = je32_to_cpu(spx->version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) sum_link_node_ref(c, jeb, je32_to_cpu(spx->offset) | REF_UNCHECKED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) PAD(je32_to_cpu(spx->totlen)), (void *)xd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) *pseudo_random += je32_to_cpu(spx->xid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) sp += JFFS2_SUMMARY_XATTR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) case JFFS2_NODETYPE_XREF: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) struct jffs2_xattr_ref *ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) struct jffs2_sum_xref_flash *spr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) spr = (struct jffs2_sum_xref_flash *)sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) dbg_summary("xref at %#08x-%#08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) jeb->offset + je32_to_cpu(spr->offset),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) jeb->offset + je32_to_cpu(spr->offset) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) (uint32_t)PAD(sizeof(struct jffs2_raw_xref)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) ref = jffs2_alloc_xattr_ref();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (!ref) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) JFFS2_NOTICE("allocation of xattr_datum failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) ref->next = c->xref_temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) c->xref_temp = ref;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) sum_link_node_ref(c, jeb, je32_to_cpu(spr->offset) | REF_UNCHECKED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) PAD(sizeof(struct jffs2_raw_xref)), (void *)ref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) *pseudo_random += ref->node->flash_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) sp += JFFS2_SUMMARY_XREF_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) default : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) uint16_t nodetype = je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) JFFS2_WARNING("Unsupported node type %x found in summary! Exiting...\n", nodetype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) if ((nodetype & JFFS2_COMPAT_MASK) == JFFS2_FEATURE_INCOMPAT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) /* For compatible node types, just fall back to the full scan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) c->wasted_size -= jeb->wasted_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) c->free_size += c->sector_size - jeb->free_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) c->used_size -= jeb->used_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) c->dirty_size -= jeb->dirty_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) jeb->wasted_size = jeb->used_size = jeb->dirty_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) jeb->free_size = c->sector_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) jffs2_free_jeb_node_refs(c, jeb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) return -ENOTRECOVERABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /* Process the summary node - called from jffs2_scan_eraseblock() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) struct jffs2_raw_summary *summary, uint32_t sumsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) uint32_t *pseudo_random)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) struct jffs2_unknown_node crcnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) int ret, ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) uint32_t crc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) ofs = c->sector_size - sumsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) dbg_summary("summary found for 0x%08x at 0x%08x (0x%x bytes)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) jeb->offset, jeb->offset + ofs, sumsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) /* OK, now check for node validity and CRC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) crcnode.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) crcnode.nodetype = cpu_to_je16(JFFS2_NODETYPE_SUMMARY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) crcnode.totlen = summary->totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) crc = crc32(0, &crcnode, sizeof(crcnode)-4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) if (je32_to_cpu(summary->hdr_crc) != crc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) dbg_summary("Summary node header is corrupt (bad CRC or "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) "no summary at all)\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) goto crc_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (je32_to_cpu(summary->totlen) != sumsize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) dbg_summary("Summary node is corrupt (wrong erasesize?)\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) goto crc_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) crc = crc32(0, summary, sizeof(struct jffs2_raw_summary)-8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) if (je32_to_cpu(summary->node_crc) != crc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) dbg_summary("Summary node is corrupt (bad CRC)\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) goto crc_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) crc = crc32(0, summary->sum, sumsize - sizeof(struct jffs2_raw_summary));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) if (je32_to_cpu(summary->sum_crc) != crc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) dbg_summary("Summary node data is corrupt (bad CRC)\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) goto crc_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) if ( je32_to_cpu(summary->cln_mkr) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) dbg_summary("Summary : CLEANMARKER node \n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) ret = jffs2_prealloc_raw_node_refs(c, jeb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if (je32_to_cpu(summary->cln_mkr) != c->cleanmarker_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) dbg_summary("CLEANMARKER node has totlen 0x%x != normal 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) je32_to_cpu(summary->cln_mkr), c->cleanmarker_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if ((ret = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr)))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) } else if (jeb->first_node) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) dbg_summary("CLEANMARKER node not first node in block "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) "(0x%08x)\n", jeb->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) if ((ret = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr)))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) jffs2_link_node_ref(c, jeb, jeb->offset | REF_NORMAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) je32_to_cpu(summary->cln_mkr), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) ret = jffs2_sum_process_sum_data(c, jeb, summary, pseudo_random);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) /* -ENOTRECOVERABLE isn't a fatal error -- it means we should do a full
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) scan of this eraseblock. So return zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (ret == -ENOTRECOVERABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) return ret; /* real error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) /* for PARANOIA_CHECK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) ret = jffs2_prealloc_raw_node_refs(c, jeb, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) sum_link_node_ref(c, jeb, ofs | REF_NORMAL, sumsize, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) if (unlikely(jeb->free_size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) JFFS2_WARNING("Free size 0x%x bytes in eraseblock @0x%08x with summary?\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) jeb->free_size, jeb->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) jeb->wasted_size += jeb->free_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) c->wasted_size += jeb->free_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) c->free_size -= jeb->free_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) jeb->free_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) return jffs2_scan_classify_jeb(c, jeb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) crc_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) JFFS2_WARNING("Summary node crc error, skipping summary information.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) /* Write summary data to flash - helper function for jffs2_sum_write_sumnode() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) uint32_t infosize, uint32_t datasize, int padsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) struct jffs2_raw_summary isum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) union jffs2_sum_mem *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct jffs2_sum_marker *sm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) struct kvec vecs[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) uint32_t sum_ofs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) void *wpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) size_t retlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) if (padsize + datasize > MAX_SUMMARY_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) /* It won't fit in the buffer. Abort summary for this jeb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) jffs2_sum_disable_collecting(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) JFFS2_WARNING("Summary too big (%d data, %d pad) in eraseblock at %08x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) datasize, padsize, jeb->offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) /* Non-fatal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) /* Is there enough space for summary? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) if (padsize < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) /* don't try to write out summary for this jeb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) jffs2_sum_disable_collecting(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) JFFS2_WARNING("Not enough space for summary, padsize = %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) padsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) /* Non-fatal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) memset(c->summary->sum_buf, 0xff, datasize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) memset(&isum, 0, sizeof(isum));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) isum.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) isum.nodetype = cpu_to_je16(JFFS2_NODETYPE_SUMMARY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) isum.totlen = cpu_to_je32(infosize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) isum.hdr_crc = cpu_to_je32(crc32(0, &isum, sizeof(struct jffs2_unknown_node) - 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) isum.padded = cpu_to_je32(c->summary->sum_padded);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) isum.cln_mkr = cpu_to_je32(c->cleanmarker_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) isum.sum_num = cpu_to_je32(c->summary->sum_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) wpage = c->summary->sum_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) while (c->summary->sum_num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) temp = c->summary->sum_list_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) switch (je16_to_cpu(temp->u.nodetype)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) case JFFS2_NODETYPE_INODE: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct jffs2_sum_inode_flash *sino_ptr = wpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) sino_ptr->nodetype = temp->i.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) sino_ptr->inode = temp->i.inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) sino_ptr->version = temp->i.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) sino_ptr->offset = temp->i.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) sino_ptr->totlen = temp->i.totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) wpage += JFFS2_SUMMARY_INODE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) case JFFS2_NODETYPE_DIRENT: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) struct jffs2_sum_dirent_flash *sdrnt_ptr = wpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) sdrnt_ptr->nodetype = temp->d.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) sdrnt_ptr->totlen = temp->d.totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) sdrnt_ptr->offset = temp->d.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) sdrnt_ptr->pino = temp->d.pino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) sdrnt_ptr->version = temp->d.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) sdrnt_ptr->ino = temp->d.ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) sdrnt_ptr->nsize = temp->d.nsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) sdrnt_ptr->type = temp->d.type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) memcpy(sdrnt_ptr->name, temp->d.name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) temp->d.nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) wpage += JFFS2_SUMMARY_DIRENT_SIZE(temp->d.nsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) #ifdef CONFIG_JFFS2_FS_XATTR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) case JFFS2_NODETYPE_XATTR: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) struct jffs2_sum_xattr_flash *sxattr_ptr = wpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) temp = c->summary->sum_list_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) sxattr_ptr->nodetype = temp->x.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) sxattr_ptr->xid = temp->x.xid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) sxattr_ptr->version = temp->x.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) sxattr_ptr->offset = temp->x.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) sxattr_ptr->totlen = temp->x.totlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) wpage += JFFS2_SUMMARY_XATTR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) case JFFS2_NODETYPE_XREF: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) struct jffs2_sum_xref_flash *sxref_ptr = wpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) temp = c->summary->sum_list_head;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) sxref_ptr->nodetype = temp->r.nodetype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) sxref_ptr->offset = temp->r.offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) wpage += JFFS2_SUMMARY_XREF_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) default : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) if ((je16_to_cpu(temp->u.nodetype) & JFFS2_COMPAT_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) == JFFS2_FEATURE_RWCOMPAT_COPY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) dbg_summary("Writing unknown RWCOMPAT_COPY node type %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) je16_to_cpu(temp->u.nodetype));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) jffs2_sum_disable_collecting(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) /* The above call removes the list, nothing more to do */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) goto bail_rwcompat;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) BUG(); /* unknown node in summary information */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) c->summary->sum_list_head = temp->u.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) kfree(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) c->summary->sum_num--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) bail_rwcompat:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) jffs2_sum_reset_collected(c->summary);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) wpage += padsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) sm = wpage;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) sm->offset = cpu_to_je32(c->sector_size - jeb->free_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) sm->magic = cpu_to_je32(JFFS2_SUM_MAGIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) isum.sum_crc = cpu_to_je32(crc32(0, c->summary->sum_buf, datasize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) isum.node_crc = cpu_to_je32(crc32(0, &isum, sizeof(isum) - 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) vecs[0].iov_base = &isum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) vecs[0].iov_len = sizeof(isum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) vecs[1].iov_base = c->summary->sum_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) vecs[1].iov_len = datasize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) sum_ofs = jeb->offset + c->sector_size - jeb->free_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) dbg_summary("writing out data to flash to pos : 0x%08x\n", sum_ofs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) ret = jffs2_flash_writev(c, vecs, 2, sum_ofs, &retlen, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) if (ret || (retlen != infosize)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) JFFS2_WARNING("Write of %u bytes at 0x%08x failed. returned %d, retlen %zd\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) infosize, sum_ofs, ret, retlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) if (retlen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) /* Waste remaining space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) spin_lock(&c->erase_completion_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) jffs2_link_node_ref(c, jeb, sum_ofs | REF_OBSOLETE, infosize, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) spin_unlock(&c->erase_completion_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) c->summary->sum_size = JFFS2_SUMMARY_NOSUM_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) spin_lock(&c->erase_completion_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) jffs2_link_node_ref(c, jeb, sum_ofs | REF_NORMAL, infosize, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) spin_unlock(&c->erase_completion_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) /* Write out summary information - called from jffs2_do_reserve_space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) __must_hold(&c->erase_completion_block)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) int datasize, infosize, padsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) struct jffs2_eraseblock *jeb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) dbg_summary("called\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) spin_unlock(&c->erase_completion_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) jeb = c->nextblock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) jffs2_prealloc_raw_node_refs(c, jeb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if (!c->summary->sum_num || !c->summary->sum_list_head) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) JFFS2_WARNING("Empty summary info!!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) BUG();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) datasize = c->summary->sum_size + sizeof(struct jffs2_sum_marker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) infosize = sizeof(struct jffs2_raw_summary) + datasize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) padsize = jeb->free_size - infosize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) infosize += padsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) datasize += padsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) ret = jffs2_sum_write_data(c, jeb, infosize, datasize, padsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) spin_lock(&c->erase_completion_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) }