This is the mail archive of the mailing list for the eCos project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [ECOS] JFFS2 Garbage Collection Error? (NO! rbtree.c bug)

On Sun, 2003-07-13 at 10:55, David Woodhouse wrote:
> On Sat, 2003-07-12 at 23:55, Scott Wilkinson wrote: 
> > If, for testing purposes, I compile eCos using the linux rbtree.[ch]
> > instead of the eCos/OpenBSD port, my JFFS2 stuff works (and very well so
> > far I might add!).
> I note the trees dumped before the call to rb_erase() and the crash are
> identical in the Linux and eCos versions -- it doesn't seem to be an
> error in _building_ the tree, only removing stuff from it.
> I note further that your test case also works if I take the Linux
> rb_erase() function and drop it into the BSD/eCos rbtree.c, adjusting
> name and order of rb_remove_color() and its arguments respectively.

I believe I fixed the bug in the eCos rbtree.c that was causing JFFS2 to
fail during certain garbage collection events.  It was a simple problem
of copying pointers to structures instead of copying the entire
structure itself, as is necessary.

I am continuing to test, but the attached patch seems to do the trick!


Index: rbtree.c
RCS file: /home/cvs/ecos/packages/compat/linux/current/src/rbtree.c,v
retrieving revision
diff -u -r1.1.1.1 rbtree.c
--- rbtree.c	14 May 2003 17:47:38 -0000
+++ rbtree.c	14 Jul 2003 17:02:29 -0000
@@ -294,7 +294,7 @@
 			RB_HEAD(head) = child;
 		if (RB_PARENT(elm) == old)
 			parent = elm;
-		(elm) = (old);
+		*(elm) = *(old);
 		if (RB_PARENT(old)) {
 			if (RB_LEFT(RB_PARENT(old)) == old)
 				RB_LEFT(RB_PARENT(old)) = elm;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]