Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1f9671b authored by David Woodhouse's avatar David Woodhouse
Browse files

[JFFS2] Introduce jffs2_link_node_ref() function to reduce code duplication



The same sequence of code was repeated in many places, to add a new
struct jffs2_raw_node_ref to an eraseblock and adjust the space accounting
accordingly. Move it out-of-line.

Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
parent 0cfc7da3
Loading
Loading
Loading
Loading
+5 −13
Original line number Diff line number Diff line
@@ -373,12 +373,8 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb
				goto filebad;
		}

		jeb->first_node = jeb->last_node = NULL;
		/* Everything else got zeroed before the erase */
		jeb->free_size = c->sector_size;
		jeb->used_size = 0;
		jeb->dirty_size = 0;
		jeb->wasted_size = 0;

	} else {

		struct kvec vecs[1];
@@ -412,17 +408,13 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb
			goto filebad;
		}

		/* Everything else got zeroed before the erase */
		jeb->free_size = c->sector_size;

		marker_ref->next_in_ino = NULL;
		marker_ref->next_phys = NULL;
		marker_ref->flash_offset = jeb->offset | REF_NORMAL;
		marker_ref->__totlen = c->cleanmarker_size;

		jeb->first_node = jeb->last_node = marker_ref;

		jeb->free_size = c->sector_size - c->cleanmarker_size;
		jeb->used_size = c->cleanmarker_size;
		jeb->dirty_size = 0;
		jeb->wasted_size = 0;
		jffs2_link_node_ref(c, jeb, marker_ref, c->cleanmarker_size);
	}

	spin_lock(&c->erase_completion_lock);
+34 −0
Original line number Diff line number Diff line
@@ -1046,3 +1046,37 @@ void jffs2_kill_fragtree(struct rb_root *root, struct jffs2_sb_info *c)
		cond_resched();
	}
}

void jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
			 struct jffs2_raw_node_ref *ref, uint32_t len)
{
	if (!jeb->first_node)
		jeb->first_node = ref;
	if (jeb->last_node)
		jeb->last_node->next_phys = ref;
	jeb->last_node = ref;

	switch(ref_flags(ref)) {
	case REF_UNCHECKED:
		c->unchecked_size += len;
		jeb->unchecked_size += len;
		break;

	case REF_NORMAL:
	case REF_PRISTINE:
		c->used_size += len;
		jeb->used_size += len;
		break;

	case REF_OBSOLETE:
		c->dirty_size += len;
		jeb->used_size += len;
		break;
	}
	c->free_size -= len;
	jeb->free_size -= len;

	/* Set __totlen field... for now */
	ref->__totlen = len;
	ref->next_phys = NULL;
}
+2 −0
Original line number Diff line number Diff line
@@ -348,6 +348,8 @@ void jffs2_obsolete_node_frag(struct jffs2_sb_info *c, struct jffs2_node_frag *t
int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn);
void jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size);
int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info *tn);
void jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
			 struct jffs2_raw_node_ref *ref, uint32_t len);

/* nodemgmt.c */
int jffs2_thread_should_wake(struct jffs2_sb_info *c);
+1 −15
Original line number Diff line number Diff line
@@ -403,21 +403,7 @@ int jffs2_add_physical_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_r
#endif
	spin_lock(&c->erase_completion_lock);

	if (!jeb->first_node)
		jeb->first_node = new;
	if (jeb->last_node)
		jeb->last_node->next_phys = new;
	jeb->last_node = new;

	jeb->free_size -= len;
	c->free_size -= len;
	if (ref_obsolete(new)) {
		jeb->dirty_size += len;
		c->dirty_size += len;
	} else {
		jeb->used_size += len;
		c->used_size += len;
	}
	jffs2_link_node_ref(c, jeb, new, len);

	if (!jeb->free_size && !jeb->dirty_size && !ISDIRTY(jeb->wasted_size)) {
		/* If it lives on the dirty_list, jffs2_reserve_space will put it there */
+11 −38
Original line number Diff line number Diff line
@@ -351,17 +351,11 @@ static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
	xd->data_crc = je32_to_cpu(rx->data_crc);
	xd->node = raw;

	raw->__totlen = totlen;
	raw->flash_offset = ofs | REF_PRISTINE;
	raw->next_phys = NULL;
	raw->next_in_ino = (void *)xd;
	if (!jeb->first_node)
		jeb->first_node = raw;
	if (jeb->last_node)
		jeb->last_node->next_phys = raw;
	jeb->last_node = raw;

	USED_SPACE(PAD(je32_to_cpu(rx->totlen)));
	jffs2_link_node_ref(c, jeb, raw, totlen);

	if (jffs2_sum_active())
		jffs2_sum_add_xattr_mem(s, rx, ofs - jeb->offset);
	dbg_xattr("scaning xdatum at %#08x (xid=%u, version=%u)\n",
@@ -418,17 +412,11 @@ static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock
	ref->next = c->xref_temp;
	c->xref_temp = ref;

	raw->__totlen = PAD(je32_to_cpu(rr->totlen));
	raw->flash_offset = ofs | REF_PRISTINE;
	raw->next_phys = NULL;
	raw->next_in_ino = (void *)ref;
	if (!jeb->first_node)
		jeb->first_node = raw;
	if (jeb->last_node)
		jeb->last_node->next_phys = raw;
	jeb->last_node = raw;

	USED_SPACE(PAD(je32_to_cpu(rr->totlen)));	
	jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(rr->totlen)));

	if (jffs2_sum_active())
		jffs2_sum_add_xref_mem(s, rr, ofs - jeb->offset);
	dbg_xattr("scan xref at %#08x (xid=%u, ino=%u)\n",
@@ -827,12 +815,10 @@ scan_more:
					return -ENOMEM;
				}
				marker_ref->next_in_ino = NULL;
				marker_ref->next_phys = NULL;
				marker_ref->flash_offset = ofs | REF_NORMAL;
				marker_ref->__totlen = c->cleanmarker_size;
				jeb->first_node = jeb->last_node = marker_ref;

				USED_SPACE(PAD(c->cleanmarker_size));
				jffs2_link_node_ref(c, jeb, marker_ref, c->cleanmarker_size);

				ofs += PAD(c->cleanmarker_size);
			}
			break;
@@ -971,16 +957,11 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
	/* Wheee. It worked */

	raw->flash_offset = ofs | REF_UNCHECKED;
	raw->__totlen = PAD(je32_to_cpu(ri->totlen));
	raw->next_phys = NULL;
	raw->next_in_ino = ic->nodes;

	raw->next_in_ino = ic->nodes;
	ic->nodes = raw;
	if (!jeb->first_node)
		jeb->first_node = raw;
	if (jeb->last_node)
		jeb->last_node->next_phys = raw;
	jeb->last_node = raw;
	
	jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(ri->totlen)));

	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),
@@ -989,8 +970,6 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc

	pseudo_random += je32_to_cpu(ri->version);

	UNCHECKED_SPACE(PAD(je32_to_cpu(ri->totlen)));

	if (jffs2_sum_active()) {
		jffs2_sum_add_inode_mem(s, ri, ofs - jeb->offset);
	}
@@ -1053,16 +1032,11 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo
		return -ENOMEM;
	}

	raw->__totlen = PAD(je32_to_cpu(rd->totlen));
	raw->flash_offset = ofs | REF_PRISTINE;
	raw->next_phys = NULL;
	raw->next_in_ino = ic->nodes;
	ic->nodes = raw;
	if (!jeb->first_node)
		jeb->first_node = raw;
	if (jeb->last_node)
		jeb->last_node->next_phys = raw;
	jeb->last_node = raw;

	jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(rd->totlen)));

	fd->raw = raw;
	fd->next = NULL;
@@ -1070,7 +1044,6 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo
	fd->ino = je32_to_cpu(rd->ino);
	fd->nhash = full_name_hash(fd->name, rd->nsize);
	fd->type = rd->type;
	USED_SPACE(PAD(je32_to_cpu(rd->totlen)));
	jffs2_add_fd_to_list(c, fd, &ic->scan_dents);

	if (jffs2_sum_active()) {
Loading