diff -auNrp --exclude CVS mtd/fs/jffs2/gc.c mtd-fixed/fs/jffs2/gc.c --- mtd/fs/jffs2/gc.c 2005-04-08 14:14:36.083656010 +0400 +++ mtd-fixed/fs/jffs2/gc.c 2005-04-08 14:17:15.941323792 +0400 @@ -669,6 +669,7 @@ static int jffs2_garbage_collect_metadat { struct jffs2_full_dnode *new_fn; struct jffs2_raw_inode ri; + struct jffs2_node_frag *last_frag; jint16_t dev; char *mdata = NULL, mdatalen = 0; uint32_t alloclen, phys_ofs; @@ -718,7 +719,8 @@ static int jffs2_garbage_collect_metadat ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f)); ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); - ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); + last_frag = frag_last(&f->fragtree); + ri.isize = cpu_to_je32(last_frag->ofs + last_frag->size); ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); @@ -961,7 +963,8 @@ static int jffs2_garbage_collect_hole(st ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f)); ri.uid = cpu_to_je16(JFFS2_F_I_UID(f)); ri.gid = cpu_to_je16(JFFS2_F_I_GID(f)); - ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f)); + frag = frag_last(&f->fragtree); + ri.isize = cpu_to_je32(frag->ofs + frag->size); ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f)); ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f)); ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f)); @@ -1168,7 +1171,7 @@ static int jffs2_garbage_collect_dnode(s D1(printk(KERN_DEBUG "Expanded dnode to write from (0x%x-0x%x) to (0x%x-0x%x)\n", orig_start, orig_end, start, end)); - BUG_ON(end > JFFS2_F_I_SIZE(f)); + D1(BUG_ON(end > frag_last(&f->fragtree)->ofs + frag_last(&f->fragtree)->size)); BUG_ON(end < orig_end); BUG_ON(start > orig_start); } diff -auNrp --exclude CVS mtd/fs/jffs2/nodelist.h mtd-fixed/fs/jffs2/nodelist.h --- mtd/fs/jffs2/nodelist.h 2005-04-08 14:14:33.206274244 +0400 +++ mtd-fixed/fs/jffs2/nodelist.h 2005-04-08 14:09:37.007914567 +0400 @@ -363,6 +363,18 @@ static inline struct jffs2_node_frag *fr node = node->rb_left; return rb_entry(node, struct jffs2_node_frag, rb); } + +static inline struct jffs2_node_frag *frag_last(struct rb_root *root) +{ + struct rb_node *node = root->rb_node; + + if (!node) + return NULL; + while(node->rb_right) + node = node->rb_right; + return rb_entry(node, struct jffs2_node_frag, rb); +} + #define rb_parent(rb) ((rb)->rb_parent) #define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb) #define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb)