[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: What on Earth is JFFS2 GC doing?
vipin.malik@xxxxxxx.com said:
> What does this " jffs2_free_all_node_refs" do anyway and why can't it
> do it faster :)
Oh yes. I'd forgotten about that, although as the comment implies I did
realise at the time I wrote it just how bad it might be :)
I suppose we just have to increase the jffs2_raw_node_ref from 16 bytes to
20 - unless anyone's got any better suggestions?
/* Hmmm. Maybe we should accept the extra space it takes and make
this a standard doubly-linked list? */
static inline void jffs2_remove_node_ref_from_ino_list(struct jffs2_sb_info *sbinfo, struct jffs2_raw_node_ref *ref)
{
struct jffs2_inode_cache *ic;
struct jffs2_raw_node_ref **prev, *this;
D2(int c=0);
this = ref;
while(this->next_in_ino)
this = this->next_in_ino;
ic = (struct jffs2_inode_cache *)this;
D1(printk(KERN_DEBUG "Removing node at phys 0x%08x from ino #%u\n", ref->flash_offset &~3, ic->ino));
prev = &ic->nodes;
if (!*prev) {
printk(KERN_WARNING "Eep. ic->nodes == NULL.\n");
return;
}
while (*prev != ref) {
if (!(*prev)->next_in_ino) {
printk(KERN_WARNING "Eep. node at phys 0x%08x, mem %p. next_in_ino is NULL.\n", (*prev)->flash_offset &~3,
*prev);
return;
}
prev = &(*prev)->next_in_ino;
}
*prev = ref->next_in_ino;
this = ic->nodes;
D2(printk(KERN_DEBUG "After remove_node_ref_from_ino_list: \n" KERN_DEBUG);
while(this) {
printk( "0x%08x(%d)->", this->flash_offset & ~3, this->flash_offset &3);
if (++c == 5) {
printk("\n" KERN_DEBUG);
c=0;
}
this = this->next_in_ino;
}
printk("\n"););
if (ic->nodes == (void *)ic) {
D1(printk(KERN_DEBUG "inocache for ino #%u is all gone now. Freeing\n", ic->ino));
jffs2_del_ino_cache(sbinfo, ic);
jffs2_free_inode_cache(ic);
}
}
static void jffs2_free_all_node_refs(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
{
struct jffs2_raw_node_ref *ref;
D1(printk(KERN_DEBUG "Freeing all node refs for eraseblock offset 0x%08x\n", jeb->offset));
while(jeb->first_node) {
ref = jeb->first_node;
jeb->first_node = ref->next_phys;
/* Remove from the inode-list */
if (ref->next_in_ino)
jffs2_remove_node_ref_from_ino_list(c, ref);
/* else it was a non-inode node so don't bother */
jffs2_free_raw_node_ref(ref);
}
jeb->last_node = NULL;
}
--
dwmw2
To unsubscribe from this list: send the line "unsubscribe jffs-dev" in
the body of a message to majordomo@xxxxxxx.com