diff options
author | Steve French <sfrench@us.ibm.com> | 2006-06-25 11:57:32 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2006-06-25 11:57:32 -0400 |
commit | bbe5d235ee201705530a7153b57e141cd77d818b (patch) | |
tree | e98c31b4cb2ced6357a87a02596f9ecdbd6dbb26 /fs/jffs2/gc.c | |
parent | 189acaaef81b1d71aedd0d28810de24160c2e781 (diff) | |
parent | dfd8317d3340f03bc06eba6b58f0ec0861da4a13 (diff) |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'fs/jffs2/gc.c')
-rw-r--r-- | fs/jffs2/gc.c | 131 |
1 files changed, 67 insertions, 64 deletions
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index f9ffece453a3..477c526d638b 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c | |||
@@ -125,6 +125,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
125 | struct jffs2_eraseblock *jeb; | 125 | struct jffs2_eraseblock *jeb; |
126 | struct jffs2_raw_node_ref *raw; | 126 | struct jffs2_raw_node_ref *raw; |
127 | int ret = 0, inum, nlink; | 127 | int ret = 0, inum, nlink; |
128 | int xattr = 0; | ||
128 | 129 | ||
129 | if (down_interruptible(&c->alloc_sem)) | 130 | if (down_interruptible(&c->alloc_sem)) |
130 | return -EINTR; | 131 | return -EINTR; |
@@ -138,7 +139,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
138 | the node CRCs etc. Do it now. */ | 139 | the node CRCs etc. Do it now. */ |
139 | 140 | ||
140 | /* checked_ino is protected by the alloc_sem */ | 141 | /* checked_ino is protected by the alloc_sem */ |
141 | if (c->checked_ino > c->highest_ino) { | 142 | if (c->checked_ino > c->highest_ino && xattr) { |
142 | printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n", | 143 | printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n", |
143 | c->unchecked_size); | 144 | c->unchecked_size); |
144 | jffs2_dbg_dump_block_lists_nolock(c); | 145 | jffs2_dbg_dump_block_lists_nolock(c); |
@@ -148,6 +149,9 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
148 | 149 | ||
149 | spin_unlock(&c->erase_completion_lock); | 150 | spin_unlock(&c->erase_completion_lock); |
150 | 151 | ||
152 | if (!xattr) | ||
153 | xattr = jffs2_verify_xattr(c); | ||
154 | |||
151 | spin_lock(&c->inocache_lock); | 155 | spin_lock(&c->inocache_lock); |
152 | 156 | ||
153 | ic = jffs2_get_ino_cache(c, c->checked_ino++); | 157 | ic = jffs2_get_ino_cache(c, c->checked_ino++); |
@@ -181,6 +185,10 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
181 | and trigger the BUG() above while we haven't yet | 185 | and trigger the BUG() above while we haven't yet |
182 | finished checking all its nodes */ | 186 | finished checking all its nodes */ |
183 | D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino)); | 187 | D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino)); |
188 | /* We need to come back again for the _same_ inode. We've | ||
189 | made no progress in this case, but that should be OK */ | ||
190 | c->checked_ino--; | ||
191 | |||
184 | up(&c->alloc_sem); | 192 | up(&c->alloc_sem); |
185 | sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); | 193 | sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); |
186 | return 0; | 194 | return 0; |
@@ -231,7 +239,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
231 | 239 | ||
232 | while(ref_obsolete(raw)) { | 240 | while(ref_obsolete(raw)) { |
233 | D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); | 241 | D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); |
234 | raw = raw->next_phys; | 242 | raw = ref_next(raw); |
235 | if (unlikely(!raw)) { | 243 | if (unlikely(!raw)) { |
236 | printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); | 244 | printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n"); |
237 | printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n", | 245 | printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n", |
@@ -248,16 +256,37 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
248 | 256 | ||
249 | if (!raw->next_in_ino) { | 257 | if (!raw->next_in_ino) { |
250 | /* Inode-less node. Clean marker, snapshot or something like that */ | 258 | /* Inode-less node. Clean marker, snapshot or something like that */ |
251 | /* FIXME: If it's something that needs to be copied, including something | ||
252 | we don't grok that has JFFS2_NODETYPE_RWCOMPAT_COPY, we should do so */ | ||
253 | spin_unlock(&c->erase_completion_lock); | 259 | spin_unlock(&c->erase_completion_lock); |
254 | jffs2_mark_node_obsolete(c, raw); | 260 | if (ref_flags(raw) == REF_PRISTINE) { |
261 | /* It's an unknown node with JFFS2_FEATURE_RWCOMPAT_COPY */ | ||
262 | jffs2_garbage_collect_pristine(c, NULL, raw); | ||
263 | } else { | ||
264 | /* Just mark it obsolete */ | ||
265 | jffs2_mark_node_obsolete(c, raw); | ||
266 | } | ||
255 | up(&c->alloc_sem); | 267 | up(&c->alloc_sem); |
256 | goto eraseit_lock; | 268 | goto eraseit_lock; |
257 | } | 269 | } |
258 | 270 | ||
259 | ic = jffs2_raw_ref_to_ic(raw); | 271 | ic = jffs2_raw_ref_to_ic(raw); |
260 | 272 | ||
273 | #ifdef CONFIG_JFFS2_FS_XATTR | ||
274 | /* When 'ic' refers xattr_datum/xattr_ref, this node is GCed as xattr. | ||
275 | * We can decide whether this node is inode or xattr by ic->class. */ | ||
276 | if (ic->class == RAWNODE_CLASS_XATTR_DATUM | ||
277 | || ic->class == RAWNODE_CLASS_XATTR_REF) { | ||
278 | BUG_ON(raw->next_in_ino != (void *)ic); | ||
279 | spin_unlock(&c->erase_completion_lock); | ||
280 | |||
281 | if (ic->class == RAWNODE_CLASS_XATTR_DATUM) { | ||
282 | ret = jffs2_garbage_collect_xattr_datum(c, (struct jffs2_xattr_datum *)ic); | ||
283 | } else { | ||
284 | ret = jffs2_garbage_collect_xattr_ref(c, (struct jffs2_xattr_ref *)ic); | ||
285 | } | ||
286 | goto release_sem; | ||
287 | } | ||
288 | #endif | ||
289 | |||
261 | /* We need to hold the inocache. Either the erase_completion_lock or | 290 | /* We need to hold the inocache. Either the erase_completion_lock or |
262 | the inocache_lock are sufficient; we trade down since the inocache_lock | 291 | the inocache_lock are sufficient; we trade down since the inocache_lock |
263 | causes less contention. */ | 292 | causes less contention. */ |
@@ -499,7 +528,6 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | |||
499 | struct jffs2_raw_node_ref *raw) | 528 | struct jffs2_raw_node_ref *raw) |
500 | { | 529 | { |
501 | union jffs2_node_union *node; | 530 | union jffs2_node_union *node; |
502 | struct jffs2_raw_node_ref *nraw; | ||
503 | size_t retlen; | 531 | size_t retlen; |
504 | int ret; | 532 | int ret; |
505 | uint32_t phys_ofs, alloclen; | 533 | uint32_t phys_ofs, alloclen; |
@@ -508,15 +536,16 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | |||
508 | 536 | ||
509 | D1(printk(KERN_DEBUG "Going to GC REF_PRISTINE node at 0x%08x\n", ref_offset(raw))); | 537 | D1(printk(KERN_DEBUG "Going to GC REF_PRISTINE node at 0x%08x\n", ref_offset(raw))); |
510 | 538 | ||
511 | rawlen = ref_totlen(c, c->gcblock, raw); | 539 | alloclen = rawlen = ref_totlen(c, c->gcblock, raw); |
512 | 540 | ||
513 | /* Ask for a small amount of space (or the totlen if smaller) because we | 541 | /* Ask for a small amount of space (or the totlen if smaller) because we |
514 | don't want to force wastage of the end of a block if splitting would | 542 | don't want to force wastage of the end of a block if splitting would |
515 | work. */ | 543 | work. */ |
516 | ret = jffs2_reserve_space_gc(c, min_t(uint32_t, sizeof(struct jffs2_raw_inode) + | 544 | if (ic && alloclen > sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN) |
517 | JFFS2_MIN_DATA_LEN, rawlen), &phys_ofs, &alloclen, rawlen); | 545 | alloclen = sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN; |
518 | /* this is not the exact summary size of it, | 546 | |
519 | it is only an upper estimation */ | 547 | ret = jffs2_reserve_space_gc(c, alloclen, &alloclen, rawlen); |
548 | /* 'rawlen' is not the exact summary size; it is only an upper estimation */ | ||
520 | 549 | ||
521 | if (ret) | 550 | if (ret) |
522 | return ret; | 551 | return ret; |
@@ -580,22 +609,17 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | |||
580 | } | 609 | } |
581 | break; | 610 | break; |
582 | default: | 611 | default: |
583 | printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", | 612 | /* If it's inode-less, we don't _know_ what it is. Just copy it intact */ |
584 | ref_offset(raw), je16_to_cpu(node->u.nodetype)); | 613 | if (ic) { |
585 | goto bail; | 614 | printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n", |
586 | } | 615 | ref_offset(raw), je16_to_cpu(node->u.nodetype)); |
587 | 616 | goto bail; | |
588 | nraw = jffs2_alloc_raw_node_ref(); | 617 | } |
589 | if (!nraw) { | ||
590 | ret = -ENOMEM; | ||
591 | goto out_node; | ||
592 | } | 618 | } |
593 | 619 | ||
594 | /* OK, all the CRCs are good; this node can just be copied as-is. */ | 620 | /* OK, all the CRCs are good; this node can just be copied as-is. */ |
595 | retry: | 621 | retry: |
596 | nraw->flash_offset = phys_ofs; | 622 | phys_ofs = write_ofs(c); |
597 | nraw->__totlen = rawlen; | ||
598 | nraw->next_phys = NULL; | ||
599 | 623 | ||
600 | ret = jffs2_flash_write(c, phys_ofs, rawlen, &retlen, (char *)node); | 624 | ret = jffs2_flash_write(c, phys_ofs, rawlen, &retlen, (char *)node); |
601 | 625 | ||
@@ -603,17 +627,11 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | |||
603 | printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %zd\n", | 627 | printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %zd\n", |
604 | rawlen, phys_ofs, ret, retlen); | 628 | rawlen, phys_ofs, ret, retlen); |
605 | if (retlen) { | 629 | if (retlen) { |
606 | /* Doesn't belong to any inode */ | 630 | jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, rawlen, NULL); |
607 | nraw->next_in_ino = NULL; | ||
608 | |||
609 | nraw->flash_offset |= REF_OBSOLETE; | ||
610 | jffs2_add_physical_node_ref(c, nraw); | ||
611 | jffs2_mark_node_obsolete(c, nraw); | ||
612 | } else { | 631 | } else { |
613 | printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", nraw->flash_offset); | 632 | printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", phys_ofs); |
614 | jffs2_free_raw_node_ref(nraw); | ||
615 | } | 633 | } |
616 | if (!retried && (nraw = jffs2_alloc_raw_node_ref())) { | 634 | if (!retried) { |
617 | /* Try to reallocate space and retry */ | 635 | /* Try to reallocate space and retry */ |
618 | uint32_t dummy; | 636 | uint32_t dummy; |
619 | struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; | 637 | struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size]; |
@@ -625,7 +643,7 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | |||
625 | jffs2_dbg_acct_sanity_check(c,jeb); | 643 | jffs2_dbg_acct_sanity_check(c,jeb); |
626 | jffs2_dbg_acct_paranoia_check(c, jeb); | 644 | jffs2_dbg_acct_paranoia_check(c, jeb); |
627 | 645 | ||
628 | ret = jffs2_reserve_space_gc(c, rawlen, &phys_ofs, &dummy, rawlen); | 646 | ret = jffs2_reserve_space_gc(c, rawlen, &dummy, rawlen); |
629 | /* this is not the exact summary size of it, | 647 | /* this is not the exact summary size of it, |
630 | it is only an upper estimation */ | 648 | it is only an upper estimation */ |
631 | 649 | ||
@@ -638,25 +656,13 @@ static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c, | |||
638 | goto retry; | 656 | goto retry; |
639 | } | 657 | } |
640 | D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); | 658 | D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret)); |
641 | jffs2_free_raw_node_ref(nraw); | ||
642 | } | 659 | } |
643 | 660 | ||
644 | jffs2_free_raw_node_ref(nraw); | ||
645 | if (!ret) | 661 | if (!ret) |
646 | ret = -EIO; | 662 | ret = -EIO; |
647 | goto out_node; | 663 | goto out_node; |
648 | } | 664 | } |
649 | nraw->flash_offset |= REF_PRISTINE; | 665 | jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, rawlen, ic); |
650 | jffs2_add_physical_node_ref(c, nraw); | ||
651 | |||
652 | /* Link into per-inode list. This is safe because of the ic | ||
653 | state being INO_STATE_GC. Note that if we're doing this | ||
654 | for an inode which is in-core, the 'nraw' pointer is then | ||
655 | going to be fetched from ic->nodes by our caller. */ | ||
656 | spin_lock(&c->erase_completion_lock); | ||
657 | nraw->next_in_ino = ic->nodes; | ||
658 | ic->nodes = nraw; | ||
659 | spin_unlock(&c->erase_completion_lock); | ||
660 | 666 | ||
661 | jffs2_mark_node_obsolete(c, raw); | 667 | jffs2_mark_node_obsolete(c, raw); |
662 | D1(printk(KERN_DEBUG "WHEEE! GC REF_PRISTINE node at 0x%08x succeeded\n", ref_offset(raw))); | 668 | D1(printk(KERN_DEBUG "WHEEE! GC REF_PRISTINE node at 0x%08x succeeded\n", ref_offset(raw))); |
@@ -675,19 +681,16 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ | |||
675 | struct jffs2_full_dnode *new_fn; | 681 | struct jffs2_full_dnode *new_fn; |
676 | struct jffs2_raw_inode ri; | 682 | struct jffs2_raw_inode ri; |
677 | struct jffs2_node_frag *last_frag; | 683 | struct jffs2_node_frag *last_frag; |
678 | jint16_t dev; | 684 | union jffs2_device_node dev; |
679 | char *mdata = NULL, mdatalen = 0; | 685 | char *mdata = NULL, mdatalen = 0; |
680 | uint32_t alloclen, phys_ofs, ilen; | 686 | uint32_t alloclen, ilen; |
681 | int ret; | 687 | int ret; |
682 | 688 | ||
683 | if (S_ISBLK(JFFS2_F_I_MODE(f)) || | 689 | if (S_ISBLK(JFFS2_F_I_MODE(f)) || |
684 | S_ISCHR(JFFS2_F_I_MODE(f)) ) { | 690 | S_ISCHR(JFFS2_F_I_MODE(f)) ) { |
685 | /* For these, we don't actually need to read the old node */ | 691 | /* For these, we don't actually need to read the old node */ |
686 | /* FIXME: for minor or major > 255. */ | 692 | mdatalen = jffs2_encode_dev(&dev, JFFS2_F_I_RDEV(f)); |
687 | dev = cpu_to_je16(((JFFS2_F_I_RDEV_MAJ(f) << 8) | | ||
688 | JFFS2_F_I_RDEV_MIN(f))); | ||
689 | mdata = (char *)&dev; | 693 | mdata = (char *)&dev; |
690 | mdatalen = sizeof(dev); | ||
691 | D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); | 694 | D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen)); |
692 | } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { | 695 | } else if (S_ISLNK(JFFS2_F_I_MODE(f))) { |
693 | mdatalen = fn->size; | 696 | mdatalen = fn->size; |
@@ -706,7 +709,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ | |||
706 | 709 | ||
707 | } | 710 | } |
708 | 711 | ||
709 | ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &phys_ofs, &alloclen, | 712 | ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &alloclen, |
710 | JFFS2_SUMMARY_INODE_SIZE); | 713 | JFFS2_SUMMARY_INODE_SIZE); |
711 | if (ret) { | 714 | if (ret) { |
712 | printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n", | 715 | printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n", |
@@ -744,7 +747,7 @@ static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_ | |||
744 | ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); | 747 | ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); |
745 | ri.data_crc = cpu_to_je32(crc32(0, mdata, mdatalen)); | 748 | ri.data_crc = cpu_to_je32(crc32(0, mdata, mdatalen)); |
746 | 749 | ||
747 | new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, phys_ofs, ALLOC_GC); | 750 | new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, ALLOC_GC); |
748 | 751 | ||
749 | if (IS_ERR(new_fn)) { | 752 | if (IS_ERR(new_fn)) { |
750 | printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); | 753 | printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn)); |
@@ -765,7 +768,7 @@ static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_er | |||
765 | { | 768 | { |
766 | struct jffs2_full_dirent *new_fd; | 769 | struct jffs2_full_dirent *new_fd; |
767 | struct jffs2_raw_dirent rd; | 770 | struct jffs2_raw_dirent rd; |
768 | uint32_t alloclen, phys_ofs; | 771 | uint32_t alloclen; |
769 | int ret; | 772 | int ret; |
770 | 773 | ||
771 | rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); | 774 | rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); |
@@ -787,14 +790,14 @@ static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_er | |||
787 | rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); | 790 | rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8)); |
788 | rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); | 791 | rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize)); |
789 | 792 | ||
790 | ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &phys_ofs, &alloclen, | 793 | ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &alloclen, |
791 | JFFS2_SUMMARY_DIRENT_SIZE(rd.nsize)); | 794 | JFFS2_SUMMARY_DIRENT_SIZE(rd.nsize)); |
792 | if (ret) { | 795 | if (ret) { |
793 | printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n", | 796 | printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n", |
794 | sizeof(rd)+rd.nsize, ret); | 797 | sizeof(rd)+rd.nsize, ret); |
795 | return ret; | 798 | return ret; |
796 | } | 799 | } |
797 | new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, phys_ofs, ALLOC_GC); | 800 | new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, ALLOC_GC); |
798 | 801 | ||
799 | if (IS_ERR(new_fd)) { | 802 | if (IS_ERR(new_fd)) { |
800 | printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); | 803 | printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd)); |
@@ -922,7 +925,7 @@ static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eras | |||
922 | struct jffs2_raw_inode ri; | 925 | struct jffs2_raw_inode ri; |
923 | struct jffs2_node_frag *frag; | 926 | struct jffs2_node_frag *frag; |
924 | struct jffs2_full_dnode *new_fn; | 927 | struct jffs2_full_dnode *new_fn; |
925 | uint32_t alloclen, phys_ofs, ilen; | 928 | uint32_t alloclen, ilen; |
926 | int ret; | 929 | int ret; |
927 | 930 | ||
928 | D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", | 931 | D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n", |
@@ -1001,14 +1004,14 @@ static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eras | |||
1001 | ri.data_crc = cpu_to_je32(0); | 1004 | ri.data_crc = cpu_to_je32(0); |
1002 | ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); | 1005 | ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); |
1003 | 1006 | ||
1004 | ret = jffs2_reserve_space_gc(c, sizeof(ri), &phys_ofs, &alloclen, | 1007 | ret = jffs2_reserve_space_gc(c, sizeof(ri), &alloclen, |
1005 | JFFS2_SUMMARY_INODE_SIZE); | 1008 | JFFS2_SUMMARY_INODE_SIZE); |
1006 | if (ret) { | 1009 | if (ret) { |
1007 | printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_hole failed: %d\n", | 1010 | printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_hole failed: %d\n", |
1008 | sizeof(ri), ret); | 1011 | sizeof(ri), ret); |
1009 | return ret; | 1012 | return ret; |
1010 | } | 1013 | } |
1011 | new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, phys_ofs, ALLOC_GC); | 1014 | new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_GC); |
1012 | 1015 | ||
1013 | if (IS_ERR(new_fn)) { | 1016 | if (IS_ERR(new_fn)) { |
1014 | printk(KERN_WARNING "Error writing new hole node: %ld\n", PTR_ERR(new_fn)); | 1017 | printk(KERN_WARNING "Error writing new hole node: %ld\n", PTR_ERR(new_fn)); |
@@ -1070,7 +1073,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era | |||
1070 | { | 1073 | { |
1071 | struct jffs2_full_dnode *new_fn; | 1074 | struct jffs2_full_dnode *new_fn; |
1072 | struct jffs2_raw_inode ri; | 1075 | struct jffs2_raw_inode ri; |
1073 | uint32_t alloclen, phys_ofs, offset, orig_end, orig_start; | 1076 | uint32_t alloclen, offset, orig_end, orig_start; |
1074 | int ret = 0; | 1077 | int ret = 0; |
1075 | unsigned char *comprbuf = NULL, *writebuf; | 1078 | unsigned char *comprbuf = NULL, *writebuf; |
1076 | unsigned long pg; | 1079 | unsigned long pg; |
@@ -1227,7 +1230,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era | |||
1227 | uint32_t cdatalen; | 1230 | uint32_t cdatalen; |
1228 | uint16_t comprtype = JFFS2_COMPR_NONE; | 1231 | uint16_t comprtype = JFFS2_COMPR_NONE; |
1229 | 1232 | ||
1230 | ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, | 1233 | ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN, |
1231 | &alloclen, JFFS2_SUMMARY_INODE_SIZE); | 1234 | &alloclen, JFFS2_SUMMARY_INODE_SIZE); |
1232 | 1235 | ||
1233 | if (ret) { | 1236 | if (ret) { |
@@ -1264,7 +1267,7 @@ static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_era | |||
1264 | ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); | 1267 | ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8)); |
1265 | ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); | 1268 | ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen)); |
1266 | 1269 | ||
1267 | new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, phys_ofs, ALLOC_GC); | 1270 | new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, ALLOC_GC); |
1268 | 1271 | ||
1269 | jffs2_free_comprbuf(comprbuf, writebuf); | 1272 | jffs2_free_comprbuf(comprbuf, writebuf); |
1270 | 1273 | ||