[JFFS2] Reduce visibility of raw_node_ref to upper layers of JFFS2 code.
As the first step towards eliminating the ref->next_phys member and saving memory by using an _array_ of struct jffs2_raw_node_ref per eraseblock, stop the write functions from allocating their own refs; have them just _reserve_ the appropriate number instead. Then jffs2_link_node_ref() can just fill them in. Use a linked list of pre-allocated refs in the superblock, for now. Once we switch to an array, it'll just be a case of extending that array. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
@@ -317,7 +317,6 @@ static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
|
||||
struct jffs2_summary *s)
|
||||
{
|
||||
struct jffs2_xattr_datum *xd;
|
||||
struct jffs2_raw_node_ref *raw;
|
||||
uint32_t totlen, crc;
|
||||
int err;
|
||||
|
||||
@@ -340,13 +339,8 @@ static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
|
||||
return 0;
|
||||
}
|
||||
|
||||
raw = jffs2_alloc_raw_node_ref();
|
||||
if (!raw)
|
||||
return -ENOMEM;
|
||||
|
||||
xd = jffs2_setup_xattr_datum(c, je32_to_cpu(rx->xid), je32_to_cpu(rx->version));
|
||||
if (IS_ERR(xd)) {
|
||||
jffs2_free_raw_node_ref(raw);
|
||||
if (PTR_ERR(xd) == -EEXIST) {
|
||||
if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rx->totlen)))))
|
||||
return err;
|
||||
@@ -358,12 +352,9 @@ static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
|
||||
xd->name_len = rx->name_len;
|
||||
xd->value_len = je16_to_cpu(rx->value_len);
|
||||
xd->data_crc = je32_to_cpu(rx->data_crc);
|
||||
xd->node = raw;
|
||||
|
||||
raw->flash_offset = ofs | REF_PRISTINE;
|
||||
|
||||
jffs2_link_node_ref(c, jeb, raw, totlen, NULL);
|
||||
/* FIXME */ raw->next_in_ino = (void *)xd;
|
||||
xd->node = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, NULL);
|
||||
/* FIXME */ xd->node->next_in_ino = (void *)xd;
|
||||
|
||||
if (jffs2_sum_active())
|
||||
jffs2_sum_add_xattr_mem(s, rx, ofs - jeb->offset);
|
||||
@@ -377,7 +368,6 @@ static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock
|
||||
struct jffs2_summary *s)
|
||||
{
|
||||
struct jffs2_xattr_ref *ref;
|
||||
struct jffs2_raw_node_ref *raw;
|
||||
uint32_t crc;
|
||||
int err;
|
||||
|
||||
@@ -404,12 +394,6 @@ static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock
|
||||
if (!ref)
|
||||
return -ENOMEM;
|
||||
|
||||
raw = jffs2_alloc_raw_node_ref();
|
||||
if (!raw) {
|
||||
jffs2_free_xattr_ref(ref);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* BEFORE jffs2_build_xattr_subsystem() called,
|
||||
* ref->xid is used to store 32bit xid, xd is not used
|
||||
* ref->ino is used to store 32bit inode-number, ic is not used
|
||||
@@ -418,16 +402,13 @@ static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock
|
||||
* used to chain all xattr_ref object. It's re-chained to
|
||||
* jffs2_inode_cache in jffs2_build_xattr_subsystem() correctly.
|
||||
*/
|
||||
ref->node = raw;
|
||||
ref->ino = je32_to_cpu(rr->ino);
|
||||
ref->xid = je32_to_cpu(rr->xid);
|
||||
ref->next = c->xref_temp;
|
||||
c->xref_temp = ref;
|
||||
|
||||
raw->flash_offset = ofs | REF_PRISTINE;
|
||||
|
||||
jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(rr->totlen)), NULL);
|
||||
/* FIXME */ raw->next_in_ino = (void *)ref;
|
||||
ref->node = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rr->totlen)), NULL);
|
||||
/* FIXME */ ref->node->next_in_ino = (void *)ref;
|
||||
|
||||
if (jffs2_sum_active())
|
||||
jffs2_sum_add_xref_mem(s, rr, ofs - jeb->offset);
|
||||
@@ -597,6 +578,11 @@ scan_more:
|
||||
|
||||
jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
|
||||
|
||||
/* Make sure there are node refs available for use */
|
||||
err = jffs2_prealloc_raw_node_refs(c, 2);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
cond_resched();
|
||||
|
||||
if (ofs & 3) {
|
||||
@@ -839,14 +825,7 @@ scan_more:
|
||||
return err;
|
||||
ofs += PAD(sizeof(struct jffs2_unknown_node));
|
||||
} else {
|
||||
struct jffs2_raw_node_ref *marker_ref = jffs2_alloc_raw_node_ref();
|
||||
if (!marker_ref) {
|
||||
printk(KERN_NOTICE "Failed to allocate node ref for clean marker\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
marker_ref->flash_offset = ofs | REF_NORMAL;
|
||||
|
||||
jffs2_link_node_ref(c, jeb, marker_ref, c->cleanmarker_size, NULL);
|
||||
jffs2_link_node_ref(c, jeb, ofs | REF_NORMAL, c->cleanmarker_size, NULL);
|
||||
|
||||
ofs += PAD(c->cleanmarker_size);
|
||||
}
|
||||
@@ -884,14 +863,9 @@ scan_more:
|
||||
break;
|
||||
|
||||
case JFFS2_FEATURE_RWCOMPAT_COPY: {
|
||||
struct jffs2_raw_node_ref *ref;
|
||||
D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs));
|
||||
|
||||
ref = jffs2_alloc_raw_node_ref();
|
||||
if (!ref)
|
||||
return -ENOMEM;
|
||||
ref->flash_offset = ofs | REF_PRISTINE;
|
||||
jffs2_link_node_ref(c, jeb, ref, PAD(je32_to_cpu(node->totlen)), NULL);
|
||||
jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(node->totlen)), NULL);
|
||||
|
||||
/* We can't summarise nodes we don't grok */
|
||||
jffs2_sum_disable_collecting(s);
|
||||
@@ -953,7 +927,6 @@ struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uin
|
||||
static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
|
||||
struct jffs2_raw_inode *ri, uint32_t ofs, struct jffs2_summary *s)
|
||||
{
|
||||
struct jffs2_raw_node_ref *raw;
|
||||
struct jffs2_inode_cache *ic;
|
||||
uint32_t ino = je32_to_cpu(ri->ino);
|
||||
int err;
|
||||
@@ -969,12 +942,6 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
|
||||
Which means that the _full_ amount of time to get to proper write mode with GC
|
||||
operational may actually be _longer_ than before. Sucks to be me. */
|
||||
|
||||
raw = jffs2_alloc_raw_node_ref();
|
||||
if (!raw) {
|
||||
printk(KERN_NOTICE "jffs2_scan_inode_node(): allocation of node reference failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ic = jffs2_get_ino_cache(c, ino);
|
||||
if (!ic) {
|
||||
/* Inocache get failed. Either we read a bogus ino# or it's just genuinely the
|
||||
@@ -988,21 +955,15 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
|
||||
/* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */
|
||||
if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(ri->totlen)))))
|
||||
return err;
|
||||
jffs2_free_raw_node_ref(raw);
|
||||
return 0;
|
||||
}
|
||||
ic = jffs2_scan_make_ino_cache(c, ino);
|
||||
if (!ic) {
|
||||
jffs2_free_raw_node_ref(raw);
|
||||
if (!ic)
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
/* Wheee. It worked */
|
||||
|
||||
raw->flash_offset = ofs | REF_UNCHECKED;
|
||||
|
||||
jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(ri->totlen)), ic);
|
||||
jffs2_link_node_ref(c, jeb, ofs | REF_UNCHECKED, PAD(je32_to_cpu(ri->totlen)), ic);
|
||||
|
||||
D1(printk(KERN_DEBUG "Node is ino #%u, version %d. Range 0x%x-0x%x\n",
|
||||
je32_to_cpu(ri->ino), je32_to_cpu(ri->version),
|
||||
@@ -1021,7 +982,6 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
|
||||
static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
|
||||
struct jffs2_raw_dirent *rd, uint32_t ofs, struct jffs2_summary *s)
|
||||
{
|
||||
struct jffs2_raw_node_ref *raw;
|
||||
struct jffs2_full_dirent *fd;
|
||||
struct jffs2_inode_cache *ic;
|
||||
uint32_t crc;
|
||||
@@ -1063,23 +1023,14 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
raw = jffs2_alloc_raw_node_ref();
|
||||
if (!raw) {
|
||||
jffs2_free_full_dirent(fd);
|
||||
printk(KERN_NOTICE "jffs2_scan_dirent_node(): allocation of node reference failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino));
|
||||
if (!ic) {
|
||||
jffs2_free_full_dirent(fd);
|
||||
jffs2_free_raw_node_ref(raw);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
raw->flash_offset = ofs | REF_PRISTINE;
|
||||
jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(rd->totlen)), ic);
|
||||
fd->raw = jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rd->totlen)), ic);
|
||||
|
||||
fd->raw = raw;
|
||||
fd->next = NULL;
|
||||
fd->version = je32_to_cpu(rd->version);
|
||||
fd->ino = je32_to_cpu(rd->ino);
|
||||
|
Reference in New Issue
Block a user