JFFS2_DBG_FRAGTREE2("dealing with frag %u-%u, phys %#08x(%d).\n", 
dbg_fragtree2("dealing with frag %u-%u, phys %#08x(%d).\n", 
static int jffs2_add_frag_to_fragtree(struct jffs2_sb_info *c, struct rb_root *root, struct jffs2_node_frag *newfrag){	struct jffs2_node_frag *this;	uint32_t lastend;	/* Skip all the nodes which are completed before this one starts */	this = jffs2_lookup_node_frag(root, newfrag->node->ofs);	if (this) {		JFFS2_DBG_FRAGTREE2("lookup gave frag 0x%04x-0x%04x; phys 0x%08x (*%p)\n",			  this->ofs, this->ofs+this->size, this->node?(ref_offset(this->node->raw)):0xffffffff, this);		lastend = this->ofs + this->size;	} else {		JFFS2_DBG_FRAGTREE2("lookup gave no frag\n");		lastend = 0;	}			  	/* See if we ran off the end of the fragtree */	if (lastend <= newfrag->ofs) {		/* We did */		/* Check if 'this' node was on the same page as the new node.		   If so, both 'this' and the new node get marked REF_NORMAL so		   the GC can take a look.		*/		if (lastend && (lastend-1) >> PAGE_CACHE_SHIFT == newfrag->ofs >> PAGE_CACHE_SHIFT) {			if (this->node)				mark_ref_normal(this->node->raw);			mark_ref_normal(newfrag->node->raw);		}		return no_overlapping_node(c, root, newfrag, this, lastend);	}	if (this->node)		JFFS2_DBG_FRAGTREE2("dealing with frag %u-%u, phys %#08x(%d).\n",		this->ofs, this->ofs + this->size,		ref_offset(this->node->raw), ref_flags(this->node->raw));	else		JFFS2_DBG_FRAGTREE2("dealing with hole frag %u-%u.\n",		this->ofs, this->ofs + this->size);	/* OK. 'this' is pointing at the first frag that newfrag->ofs at least partially obsoletes,	 * - i.e. newfrag->ofs < this->ofs+this->size && newfrag->ofs >= this->ofs  	 */	if (newfrag->ofs > this->ofs) {		/* This node isn't completely obsoleted. The start of it remains valid */		/* Mark the new node and the partially covered node REF_NORMAL -- let		   the GC take a look at them */		mark_ref_normal(newfrag->node->raw);		if (this->node)			mark_ref_normal(this->node->raw);		if (this->ofs + this->size > newfrag->ofs + newfrag->size) {			/* The new node splits 'this' frag into two */			struct jffs2_node_frag *newfrag2;			if (this->node)				JFFS2_DBG_FRAGTREE2("split old frag 0x%04x-0x%04x, phys 0x%08x\n",					this->ofs, this->ofs+this->size, ref_offset(this->node->raw));			else 				JFFS2_DBG_FRAGTREE2("split old hole frag 0x%04x-0x%04x\n",					this->ofs, this->ofs+this->size);						/* New second frag pointing to this's node */			newfrag2 = new_fragment(this->node, newfrag->ofs + newfrag->size,						this->ofs + this->size - newfrag->ofs - newfrag->size);			if (unlikely(!newfrag2))				return -ENOMEM;			if (this->node)				this->node->frags++;			/* Adjust size of original 'this' */			this->size = newfrag->ofs - this->ofs;			/* Now, we know there's no node with offset			   greater than this->ofs but smaller than			   newfrag2->ofs or newfrag->ofs, for obvious			   reasons. So we can do a tree insert from			   'this' to insert newfrag, and a tree insert			   from newfrag to insert newfrag2. */			jffs2_fragtree_insert(newfrag, this);			rb_insert_color(&newfrag->rb, root);						jffs2_fragtree_insert(newfrag2, newfrag);			rb_insert_color(&newfrag2->rb, root);						return 0;		}		/* New node just reduces 'this' frag in size, doesn't split it */		this->size = newfrag->ofs - this->ofs;		/* Again, we know it lives down here in the tree */		jffs2_fragtree_insert(newfrag, this);		rb_insert_color(&newfrag->rb, root);	} else {		/* New frag starts at the same point as 'this' used to. Replace 		   it in the tree without doing a delete and insertion */		JFFS2_DBG_FRAGTREE2("inserting newfrag (*%p),%d-%d in before 'this' (*%p),%d-%d\n",			  newfrag, newfrag->ofs, newfrag->ofs+newfrag->size, this, this->ofs, this->ofs+this->size);			rb_replace_node(&this->rb, &newfrag->rb, root);				if (newfrag->ofs + newfrag->size >= this->ofs+this->size) {			JFFS2_DBG_FRAGTREE2("obsoleting node frag %p (%x-%x)\n", this, this->ofs, this->ofs+this->size);			jffs2_obsolete_node_frag(c, this);		} else {			this->ofs += newfrag->size;			this->size -= newfrag->size;			jffs2_fragtree_insert(this, newfrag);			rb_insert_color(&this->rb, root);			return 0;		}	}	/* OK, now we have newfrag added in the correct place in the tree, but	   frag_next(newfrag) may be a fragment which is overlapped by it 	*/	while ((this = frag_next(newfrag)) && newfrag->ofs + newfrag->size >= this->ofs + this->size) {		/* 'this' frag is obsoleted completely. */		JFFS2_DBG_FRAGTREE2("obsoleting node frag %p (%x-%x) and removing from tree\n",			this, this->ofs, this->ofs+this->size);		rb_erase(&this->rb, root);		jffs2_obsolete_node_frag(c, this);	}	/* Now we're pointing at the first frag which isn't totally obsoleted by 	   the new frag */	if (!this || newfrag->ofs + newfrag->size == this->ofs)		return 0;	/* Still some overlap but we don't need to move it in the tree */	this->size = (this->ofs + this->size) - (newfrag->ofs + newfrag->size);	this->ofs = newfrag->ofs + newfrag->size;	/* And mark them REF_NORMAL so the GC takes a look at them */	if (this->node)		mark_ref_normal(this->node->raw);	mark_ref_normal(newfrag->node->raw);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/733802d974e5af42acb7cd61b16c0ce6dd03b7ed/nodelist.c/clean/fs/jffs2/nodelist.c