1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/kernel.h>
14#include <linux/mtd/mtd.h>
15#include <linux/slab.h>
16#include <linux/pagemap.h>
17#include <linux/crc32.h>
18#include <linux/compiler.h>
19#include <linux/stat.h>
20#include "nodelist.h"
21#include "compr.h"
22
23static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
24 struct jffs2_inode_cache *ic,
25 struct jffs2_raw_node_ref *raw);
26static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
27 struct jffs2_inode_info *f, struct jffs2_full_dnode *fd);
28static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
29 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd);
30static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
31 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd);
32static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
33 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn,
34 uint32_t start, uint32_t end);
35static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
36 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn,
37 uint32_t start, uint32_t end);
38static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
39 struct jffs2_raw_node_ref *raw, struct jffs2_inode_info *f);
40
41
42static struct jffs2_eraseblock *jffs2_find_gc_block(struct jffs2_sb_info *c)
43{
44 struct jffs2_eraseblock *ret;
45 struct list_head *nextlist = NULL;
46 int n = jiffies % 128;
47
48
49
50
51
52again:
53 if (!list_empty(&c->bad_used_list) && c->nr_free_blocks > c->resv_blocks_gcbad) {
54 D1(printk(KERN_DEBUG "Picking block from bad_used_list to GC next\n"));
55 nextlist = &c->bad_used_list;
56 } else if (n < 50 && !list_empty(&c->erasable_list)) {
57
58
59 D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next\n"));
60 nextlist = &c->erasable_list;
61 } else if (n < 110 && !list_empty(&c->very_dirty_list)) {
62
63 D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next\n"));
64 nextlist = &c->very_dirty_list;
65 } else if (n < 126 && !list_empty(&c->dirty_list)) {
66 D1(printk(KERN_DEBUG "Picking block from dirty_list to GC next\n"));
67 nextlist = &c->dirty_list;
68 } else if (!list_empty(&c->clean_list)) {
69 D1(printk(KERN_DEBUG "Picking block from clean_list to GC next\n"));
70 nextlist = &c->clean_list;
71 } else if (!list_empty(&c->dirty_list)) {
72 D1(printk(KERN_DEBUG "Picking block from dirty_list to GC next (clean_list was empty)\n"));
73
74 nextlist = &c->dirty_list;
75 } else if (!list_empty(&c->very_dirty_list)) {
76 D1(printk(KERN_DEBUG "Picking block from very_dirty_list to GC next (clean_list and dirty_list were empty)\n"));
77 nextlist = &c->very_dirty_list;
78 } else if (!list_empty(&c->erasable_list)) {
79 D1(printk(KERN_DEBUG "Picking block from erasable_list to GC next (clean_list and {very_,}dirty_list were empty)\n"));
80
81 nextlist = &c->erasable_list;
82 } else if (!list_empty(&c->erasable_pending_wbuf_list)) {
83
84 D1(printk(KERN_DEBUG "Synching wbuf in order to reuse erasable_pending_wbuf_list blocks\n"));
85 spin_unlock(&c->erase_completion_lock);
86 jffs2_flush_wbuf_pad(c);
87 spin_lock(&c->erase_completion_lock);
88 goto again;
89 } else {
90
91 D1(printk(KERN_NOTICE "jffs2: No clean, dirty _or_ erasable blocks to GC from! Where are they all?\n"));
92 return NULL;
93 }
94
95 ret = list_entry(nextlist->next, struct jffs2_eraseblock, list);
96 list_del(&ret->list);
97 c->gcblock = ret;
98 ret->gc_node = ret->first_node;
99 if (!ret->gc_node) {
100 printk(KERN_WARNING "Eep. ret->gc_node for block at 0x%08x is NULL\n", ret->offset);
101 BUG();
102 }
103
104
105 if (ret->wasted_size) {
106 D1(printk(KERN_DEBUG "Converting wasted_size %08x to dirty_size\n", ret->wasted_size));
107 ret->dirty_size += ret->wasted_size;
108 c->wasted_size -= ret->wasted_size;
109 c->dirty_size += ret->wasted_size;
110 ret->wasted_size = 0;
111 }
112
113 return ret;
114}
115
116
117
118
119
120int jffs2_garbage_collect_pass(struct jffs2_sb_info *c)
121{
122 struct jffs2_inode_info *f;
123 struct jffs2_inode_cache *ic;
124 struct jffs2_eraseblock *jeb;
125 struct jffs2_raw_node_ref *raw;
126 uint32_t gcblock_dirty;
127 int ret = 0, inum, nlink;
128 int xattr = 0;
129
130 if (mutex_lock_interruptible(&c->alloc_sem))
131 return -EINTR;
132
133 for (;;) {
134 spin_lock(&c->erase_completion_lock);
135 if (!c->unchecked_size)
136 break;
137
138
139
140
141
142 if (c->checked_ino > c->highest_ino && xattr) {
143 printk(KERN_CRIT "Checked all inodes but still 0x%x bytes of unchecked space?\n",
144 c->unchecked_size);
145 jffs2_dbg_dump_block_lists_nolock(c);
146 spin_unlock(&c->erase_completion_lock);
147 mutex_unlock(&c->alloc_sem);
148 return -ENOSPC;
149 }
150
151 spin_unlock(&c->erase_completion_lock);
152
153 if (!xattr)
154 xattr = jffs2_verify_xattr(c);
155
156 spin_lock(&c->inocache_lock);
157
158 ic = jffs2_get_ino_cache(c, c->checked_ino++);
159
160 if (!ic) {
161 spin_unlock(&c->inocache_lock);
162 continue;
163 }
164
165 if (!ic->pino_nlink) {
166 D1(printk(KERN_DEBUG "Skipping check of ino #%d with nlink/pino zero\n",
167 ic->ino));
168 spin_unlock(&c->inocache_lock);
169 jffs2_xattr_delete_inode(c, ic);
170 continue;
171 }
172 switch(ic->state) {
173 case INO_STATE_CHECKEDABSENT:
174 case INO_STATE_PRESENT:
175 D1(printk(KERN_DEBUG "Skipping ino #%u already checked\n", ic->ino));
176 spin_unlock(&c->inocache_lock);
177 continue;
178
179 case INO_STATE_GC:
180 case INO_STATE_CHECKING:
181 printk(KERN_WARNING "Inode #%u is in state %d during CRC check phase!\n", ic->ino, ic->state);
182 spin_unlock(&c->inocache_lock);
183 BUG();
184
185 case INO_STATE_READING:
186
187
188
189 D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino));
190
191
192 c->checked_ino--;
193
194 mutex_unlock(&c->alloc_sem);
195 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
196 return 0;
197
198 default:
199 BUG();
200
201 case INO_STATE_UNCHECKED:
202 ;
203 }
204 ic->state = INO_STATE_CHECKING;
205 spin_unlock(&c->inocache_lock);
206
207 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() triggering inode scan of ino#%u\n", ic->ino));
208
209 ret = jffs2_do_crccheck_inode(c, ic);
210 if (ret)
211 printk(KERN_WARNING "Returned error for crccheck of ino #%u. Expect badness...\n", ic->ino);
212
213 jffs2_set_inocache_state(c, ic, INO_STATE_CHECKEDABSENT);
214 mutex_unlock(&c->alloc_sem);
215 return ret;
216 }
217
218
219 if (!list_empty(&c->erase_complete_list) ||
220 !list_empty(&c->erase_pending_list)) {
221 spin_unlock(&c->erase_completion_lock);
222 mutex_unlock(&c->alloc_sem);
223 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() erasing pending blocks\n"));
224 if (jffs2_erase_pending_blocks(c, 1))
225 return 0;
226
227 D1(printk(KERN_DEBUG "No progress from erasing blocks; doing GC anyway\n"));
228 spin_lock(&c->erase_completion_lock);
229 mutex_lock(&c->alloc_sem);
230 }
231
232
233 jeb = c->gcblock;
234
235 if (!jeb)
236 jeb = jffs2_find_gc_block(c);
237
238 if (!jeb) {
239
240 if (c->nr_erasing_blocks) {
241 spin_unlock(&c->erase_completion_lock);
242 mutex_unlock(&c->alloc_sem);
243 return -EAGAIN;
244 }
245 D1(printk(KERN_NOTICE "jffs2: Couldn't find erase block to garbage collect!\n"));
246 spin_unlock(&c->erase_completion_lock);
247 mutex_unlock(&c->alloc_sem);
248 return -EIO;
249 }
250
251 D1(printk(KERN_DEBUG "GC from block %08x, used_size %08x, dirty_size %08x, free_size %08x\n", jeb->offset, jeb->used_size, jeb->dirty_size, jeb->free_size));
252 D1(if (c->nextblock)
253 printk(KERN_DEBUG "Nextblock at %08x, used_size %08x, dirty_size %08x, wasted_size %08x, free_size %08x\n", c->nextblock->offset, c->nextblock->used_size, c->nextblock->dirty_size, c->nextblock->wasted_size, c->nextblock->free_size));
254
255 if (!jeb->used_size) {
256 mutex_unlock(&c->alloc_sem);
257 goto eraseit;
258 }
259
260 raw = jeb->gc_node;
261 gcblock_dirty = jeb->dirty_size;
262
263 while(ref_obsolete(raw)) {
264 D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw)));
265 raw = ref_next(raw);
266 if (unlikely(!raw)) {
267 printk(KERN_WARNING "eep. End of raw list while still supposedly nodes to GC\n");
268 printk(KERN_WARNING "erase block at 0x%08x. free_size 0x%08x, dirty_size 0x%08x, used_size 0x%08x\n",
269 jeb->offset, jeb->free_size, jeb->dirty_size, jeb->used_size);
270 jeb->gc_node = raw;
271 spin_unlock(&c->erase_completion_lock);
272 mutex_unlock(&c->alloc_sem);
273 BUG();
274 }
275 }
276 jeb->gc_node = raw;
277
278 D1(printk(KERN_DEBUG "Going to garbage collect node at 0x%08x\n", ref_offset(raw)));
279
280 if (!raw->next_in_ino) {
281
282 spin_unlock(&c->erase_completion_lock);
283 if (ref_flags(raw) == REF_PRISTINE) {
284
285 jffs2_garbage_collect_pristine(c, NULL, raw);
286 } else {
287
288 jffs2_mark_node_obsolete(c, raw);
289 }
290 mutex_unlock(&c->alloc_sem);
291 goto eraseit_lock;
292 }
293
294 ic = jffs2_raw_ref_to_ic(raw);
295
296#ifdef CONFIG_JFFS2_FS_XATTR
297
298
299 if (ic->class == RAWNODE_CLASS_XATTR_DATUM
300 || ic->class == RAWNODE_CLASS_XATTR_REF) {
301 spin_unlock(&c->erase_completion_lock);
302
303 if (ic->class == RAWNODE_CLASS_XATTR_DATUM) {
304 ret = jffs2_garbage_collect_xattr_datum(c, (struct jffs2_xattr_datum *)ic, raw);
305 } else {
306 ret = jffs2_garbage_collect_xattr_ref(c, (struct jffs2_xattr_ref *)ic, raw);
307 }
308 goto test_gcnode;
309 }
310#endif
311
312
313
314
315 spin_lock(&c->inocache_lock);
316
317 spin_unlock(&c->erase_completion_lock);
318
319 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass collecting from block @0x%08x. Node @0x%08x(%d), ino #%u\n", jeb->offset, ref_offset(raw), ref_flags(raw), ic->ino));
320
321
322
323
324
325
326
327
328
329
330 switch(ic->state) {
331 case INO_STATE_CHECKEDABSENT:
332
333
334
335
336 if (ref_flags(raw) == REF_PRISTINE)
337 ic->state = INO_STATE_GC;
338 else {
339 D1(printk(KERN_DEBUG "Ino #%u is absent but node not REF_PRISTINE. Reading.\n",
340 ic->ino));
341 }
342 break;
343
344 case INO_STATE_PRESENT:
345
346 break;
347
348 case INO_STATE_UNCHECKED:
349 case INO_STATE_CHECKING:
350 case INO_STATE_GC:
351
352
353
354
355
356 printk(KERN_CRIT "Inode #%u already in state %d in jffs2_garbage_collect_pass()!\n",
357 ic->ino, ic->state);
358 mutex_unlock(&c->alloc_sem);
359 spin_unlock(&c->inocache_lock);
360 BUG();
361
362 case INO_STATE_READING:
363
364
365
366
367
368
369 mutex_unlock(&c->alloc_sem);
370 D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() waiting for ino #%u in state %d\n",
371 ic->ino, ic->state));
372 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
373
374
375
376
377
378
379
380
381
382
383 return 0;
384 }
385
386
387
388
389
390
391 if (ic->state == INO_STATE_GC) {
392 spin_unlock(&c->inocache_lock);
393
394 ret = jffs2_garbage_collect_pristine(c, ic, raw);
395
396 spin_lock(&c->inocache_lock);
397 ic->state = INO_STATE_CHECKEDABSENT;
398 wake_up(&c->inocache_wq);
399
400 if (ret != -EBADFD) {
401 spin_unlock(&c->inocache_lock);
402 goto test_gcnode;
403 }
404
405
406 }
407
408
409
410
411
412
413
414
415 inum = ic->ino;
416 nlink = ic->pino_nlink;
417 spin_unlock(&c->inocache_lock);
418
419 f = jffs2_gc_fetch_inode(c, inum, !nlink);
420 if (IS_ERR(f)) {
421 ret = PTR_ERR(f);
422 goto release_sem;
423 }
424 if (!f) {
425 ret = 0;
426 goto release_sem;
427 }
428
429 ret = jffs2_garbage_collect_live(c, jeb, raw, f);
430
431 jffs2_gc_release_inode(c, f);
432
433 test_gcnode:
434 if (jeb->dirty_size == gcblock_dirty && !ref_obsolete(jeb->gc_node)) {
435
436 printk(KERN_ERR "Error garbage collecting node at %08x!\n", ref_offset(jeb->gc_node));
437 ret = -ENOSPC;
438 }
439 release_sem:
440 mutex_unlock(&c->alloc_sem);
441
442 eraseit_lock:
443
444 spin_lock(&c->erase_completion_lock);
445
446 eraseit:
447 if (c->gcblock && !c->gcblock->used_size) {
448 D1(printk(KERN_DEBUG "Block at 0x%08x completely obsoleted by GC. Moving to erase_pending_list\n", c->gcblock->offset));
449
450 list_add_tail(&c->gcblock->list, &c->erase_pending_list);
451 c->gcblock = NULL;
452 c->nr_erasing_blocks++;
453 jffs2_garbage_collect_trigger(c);
454 }
455 spin_unlock(&c->erase_completion_lock);
456
457 return ret;
458}
459
460static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
461 struct jffs2_raw_node_ref *raw, struct jffs2_inode_info *f)
462{
463 struct jffs2_node_frag *frag;
464 struct jffs2_full_dnode *fn = NULL;
465 struct jffs2_full_dirent *fd;
466 uint32_t start = 0, end = 0, nrfrags = 0;
467 int ret = 0;
468
469 mutex_lock(&f->sem);
470
471
472
473
474 spin_lock(&c->erase_completion_lock);
475
476 if (c->gcblock != jeb) {
477 spin_unlock(&c->erase_completion_lock);
478 D1(printk(KERN_DEBUG "GC block is no longer gcblock. Restart\n"));
479 goto upnout;
480 }
481 if (ref_obsolete(raw)) {
482 spin_unlock(&c->erase_completion_lock);
483 D1(printk(KERN_DEBUG "node to be GC'd was obsoleted in the meantime.\n"));
484
485 goto upnout;
486 }
487 spin_unlock(&c->erase_completion_lock);
488
489
490 if (f->metadata && f->metadata->raw == raw) {
491 fn = f->metadata;
492 ret = jffs2_garbage_collect_metadata(c, jeb, f, fn);
493 goto upnout;
494 }
495
496
497 for (frag = frag_first(&f->fragtree); frag; frag = frag_next(frag)) {
498 if (frag->node && frag->node->raw == raw) {
499 fn = frag->node;
500 end = frag->ofs + frag->size;
501 if (!nrfrags++)
502 start = frag->ofs;
503 if (nrfrags == frag->node->frags)
504 break;
505 }
506 }
507 if (fn) {
508 if (ref_flags(raw) == REF_PRISTINE) {
509 ret = jffs2_garbage_collect_pristine(c, f->inocache, raw);
510 if (!ret) {
511
512 frag->node->raw = f->inocache->nodes;
513 }
514 if (ret != -EBADFD)
515 goto upnout;
516 }
517
518 if((start >> PAGE_CACHE_SHIFT) < ((end-1) >> PAGE_CACHE_SHIFT)) {
519
520 ret = jffs2_garbage_collect_hole(c, jeb, f, fn, start, end);
521 } else {
522
523 ret = jffs2_garbage_collect_dnode(c, jeb, f, fn, start, end);
524 }
525 goto upnout;
526 }
527
528
529 for (fd = f->dents; fd; fd=fd->next) {
530 if (fd->raw == raw)
531 break;
532 }
533
534 if (fd && fd->ino) {
535 ret = jffs2_garbage_collect_dirent(c, jeb, f, fd);
536 } else if (fd) {
537 ret = jffs2_garbage_collect_deletion_dirent(c, jeb, f, fd);
538 } else {
539 printk(KERN_WARNING "Raw node at 0x%08x wasn't in node lists for ino #%u\n",
540 ref_offset(raw), f->inocache->ino);
541 if (ref_obsolete(raw)) {
542 printk(KERN_WARNING "But it's obsolete so we don't mind too much\n");
543 } else {
544 jffs2_dbg_dump_node(c, ref_offset(raw));
545 BUG();
546 }
547 }
548 upnout:
549 mutex_unlock(&f->sem);
550
551 return ret;
552}
553
554static int jffs2_garbage_collect_pristine(struct jffs2_sb_info *c,
555 struct jffs2_inode_cache *ic,
556 struct jffs2_raw_node_ref *raw)
557{
558 union jffs2_node_union *node;
559 size_t retlen;
560 int ret;
561 uint32_t phys_ofs, alloclen;
562 uint32_t crc, rawlen;
563 int retried = 0;
564
565 D1(printk(KERN_DEBUG "Going to GC REF_PRISTINE node at 0x%08x\n", ref_offset(raw)));
566
567 alloclen = rawlen = ref_totlen(c, c->gcblock, raw);
568
569
570
571
572 if (ic && alloclen > sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN)
573 alloclen = sizeof(struct jffs2_raw_inode) + JFFS2_MIN_DATA_LEN;
574
575 ret = jffs2_reserve_space_gc(c, alloclen, &alloclen, rawlen);
576
577
578 if (ret)
579 return ret;
580
581 if (alloclen < rawlen) {
582
583 return -EBADFD;
584 }
585
586 node = kmalloc(rawlen, GFP_KERNEL);
587 if (!node)
588 return -ENOMEM;
589
590 ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)node);
591 if (!ret && retlen != rawlen)
592 ret = -EIO;
593 if (ret)
594 goto out_node;
595
596 crc = crc32(0, node, sizeof(struct jffs2_unknown_node)-4);
597 if (je32_to_cpu(node->u.hdr_crc) != crc) {
598 printk(KERN_WARNING "Header CRC failed on REF_PRISTINE node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
599 ref_offset(raw), je32_to_cpu(node->u.hdr_crc), crc);
600 goto bail;
601 }
602
603 switch(je16_to_cpu(node->u.nodetype)) {
604 case JFFS2_NODETYPE_INODE:
605 crc = crc32(0, node, sizeof(node->i)-8);
606 if (je32_to_cpu(node->i.node_crc) != crc) {
607 printk(KERN_WARNING "Node CRC failed on REF_PRISTINE data node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
608 ref_offset(raw), je32_to_cpu(node->i.node_crc), crc);
609 goto bail;
610 }
611
612 if (je32_to_cpu(node->i.dsize)) {
613 crc = crc32(0, node->i.data, je32_to_cpu(node->i.csize));
614 if (je32_to_cpu(node->i.data_crc) != crc) {
615 printk(KERN_WARNING "Data CRC failed on REF_PRISTINE data node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
616 ref_offset(raw), je32_to_cpu(node->i.data_crc), crc);
617 goto bail;
618 }
619 }
620 break;
621
622 case JFFS2_NODETYPE_DIRENT:
623 crc = crc32(0, node, sizeof(node->d)-8);
624 if (je32_to_cpu(node->d.node_crc) != crc) {
625 printk(KERN_WARNING "Node CRC failed on REF_PRISTINE dirent node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
626 ref_offset(raw), je32_to_cpu(node->d.node_crc), crc);
627 goto bail;
628 }
629
630 if (strnlen(node->d.name, node->d.nsize) != node->d.nsize) {
631 printk(KERN_WARNING "Name in dirent node at 0x%08x contains zeroes\n", ref_offset(raw));
632 goto bail;
633 }
634
635 if (node->d.nsize) {
636 crc = crc32(0, node->d.name, node->d.nsize);
637 if (je32_to_cpu(node->d.name_crc) != crc) {
638 printk(KERN_WARNING "Name CRC failed on REF_PRISTINE dirent node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
639 ref_offset(raw), je32_to_cpu(node->d.name_crc), crc);
640 goto bail;
641 }
642 }
643 break;
644 default:
645
646 if (ic) {
647 printk(KERN_WARNING "Unknown node type for REF_PRISTINE node at 0x%08x: 0x%04x\n",
648 ref_offset(raw), je16_to_cpu(node->u.nodetype));
649 goto bail;
650 }
651 }
652
653
654 retry:
655 phys_ofs = write_ofs(c);
656
657 ret = jffs2_flash_write(c, phys_ofs, rawlen, &retlen, (char *)node);
658
659 if (ret || (retlen != rawlen)) {
660 printk(KERN_NOTICE "Write of %d bytes at 0x%08x failed. returned %d, retlen %zd\n",
661 rawlen, phys_ofs, ret, retlen);
662 if (retlen) {
663 jffs2_add_physical_node_ref(c, phys_ofs | REF_OBSOLETE, rawlen, NULL);
664 } else {
665 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", phys_ofs);
666 }
667 if (!retried) {
668
669 uint32_t dummy;
670 struct jffs2_eraseblock *jeb = &c->blocks[phys_ofs / c->sector_size];
671
672 retried = 1;
673
674 D1(printk(KERN_DEBUG "Retrying failed write of REF_PRISTINE node.\n"));
675
676 jffs2_dbg_acct_sanity_check(c,jeb);
677 jffs2_dbg_acct_paranoia_check(c, jeb);
678
679 ret = jffs2_reserve_space_gc(c, rawlen, &dummy, rawlen);
680
681
682
683 if (!ret) {
684 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", phys_ofs));
685
686 jffs2_dbg_acct_sanity_check(c,jeb);
687 jffs2_dbg_acct_paranoia_check(c, jeb);
688
689 goto retry;
690 }
691 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
692 }
693
694 if (!ret)
695 ret = -EIO;
696 goto out_node;
697 }
698 jffs2_add_physical_node_ref(c, phys_ofs | REF_PRISTINE, rawlen, ic);
699
700 jffs2_mark_node_obsolete(c, raw);
701 D1(printk(KERN_DEBUG "WHEEE! GC REF_PRISTINE node at 0x%08x succeeded\n", ref_offset(raw)));
702
703 out_node:
704 kfree(node);
705 return ret;
706 bail:
707 ret = -EBADFD;
708 goto out_node;
709}
710
711static int jffs2_garbage_collect_metadata(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
712 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn)
713{
714 struct jffs2_full_dnode *new_fn;
715 struct jffs2_raw_inode ri;
716 struct jffs2_node_frag *last_frag;
717 union jffs2_device_node dev;
718 char *mdata = NULL;
719 int mdatalen = 0;
720 uint32_t alloclen, ilen;
721 int ret;
722
723 if (S_ISBLK(JFFS2_F_I_MODE(f)) ||
724 S_ISCHR(JFFS2_F_I_MODE(f)) ) {
725
726 mdatalen = jffs2_encode_dev(&dev, JFFS2_F_I_RDEV(f));
727 mdata = (char *)&dev;
728 D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bytes of kdev_t\n", mdatalen));
729 } else if (S_ISLNK(JFFS2_F_I_MODE(f))) {
730 mdatalen = fn->size;
731 mdata = kmalloc(fn->size, GFP_KERNEL);
732 if (!mdata) {
733 printk(KERN_WARNING "kmalloc of mdata failed in jffs2_garbage_collect_metadata()\n");
734 return -ENOMEM;
735 }
736 ret = jffs2_read_dnode(c, f, fn, mdata, 0, mdatalen);
737 if (ret) {
738 printk(KERN_WARNING "read of old metadata failed in jffs2_garbage_collect_metadata(): %d\n", ret);
739 kfree(mdata);
740 return ret;
741 }
742 D1(printk(KERN_DEBUG "jffs2_garbage_collect_metadata(): Writing %d bites of symlink target\n", mdatalen));
743
744 }
745
746 ret = jffs2_reserve_space_gc(c, sizeof(ri) + mdatalen, &alloclen,
747 JFFS2_SUMMARY_INODE_SIZE);
748 if (ret) {
749 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_metadata failed: %d\n",
750 sizeof(ri)+ mdatalen, ret);
751 goto out;
752 }
753
754 last_frag = frag_last(&f->fragtree);
755 if (last_frag)
756
757
758 ilen = last_frag->ofs + last_frag->size;
759 else
760 ilen = JFFS2_F_I_SIZE(f);
761
762 memset(&ri, 0, sizeof(ri));
763 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
764 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
765 ri.totlen = cpu_to_je32(sizeof(ri) + mdatalen);
766 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4));
767
768 ri.ino = cpu_to_je32(f->inocache->ino);
769 ri.version = cpu_to_je32(++f->highest_version);
770 ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f));
771 ri.uid = cpu_to_je16(JFFS2_F_I_UID(f));
772 ri.gid = cpu_to_je16(JFFS2_F_I_GID(f));
773 ri.isize = cpu_to_je32(ilen);
774 ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f));
775 ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f));
776 ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f));
777 ri.offset = cpu_to_je32(0);
778 ri.csize = cpu_to_je32(mdatalen);
779 ri.dsize = cpu_to_je32(mdatalen);
780 ri.compr = JFFS2_COMPR_NONE;
781 ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8));
782 ri.data_crc = cpu_to_je32(crc32(0, mdata, mdatalen));
783
784 new_fn = jffs2_write_dnode(c, f, &ri, mdata, mdatalen, ALLOC_GC);
785
786 if (IS_ERR(new_fn)) {
787 printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn));
788 ret = PTR_ERR(new_fn);
789 goto out;
790 }
791 jffs2_mark_node_obsolete(c, fn->raw);
792 jffs2_free_full_dnode(fn);
793 f->metadata = new_fn;
794 out:
795 if (S_ISLNK(JFFS2_F_I_MODE(f)))
796 kfree(mdata);
797 return ret;
798}
799
800static int jffs2_garbage_collect_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
801 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd)
802{
803 struct jffs2_full_dirent *new_fd;
804 struct jffs2_raw_dirent rd;
805 uint32_t alloclen;
806 int ret;
807
808 rd.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
809 rd.nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
810 rd.nsize = strlen(fd->name);
811 rd.totlen = cpu_to_je32(sizeof(rd) + rd.nsize);
812 rd.hdr_crc = cpu_to_je32(crc32(0, &rd, sizeof(struct jffs2_unknown_node)-4));
813
814 rd.pino = cpu_to_je32(f->inocache->ino);
815 rd.version = cpu_to_je32(++f->highest_version);
816 rd.ino = cpu_to_je32(fd->ino);
817
818
819 if (JFFS2_F_I_MTIME(f) == JFFS2_F_I_CTIME(f))
820 rd.mctime = cpu_to_je32(JFFS2_F_I_MTIME(f));
821 else
822 rd.mctime = cpu_to_je32(0);
823 rd.type = fd->type;
824 rd.node_crc = cpu_to_je32(crc32(0, &rd, sizeof(rd)-8));
825 rd.name_crc = cpu_to_je32(crc32(0, fd->name, rd.nsize));
826
827 ret = jffs2_reserve_space_gc(c, sizeof(rd)+rd.nsize, &alloclen,
828 JFFS2_SUMMARY_DIRENT_SIZE(rd.nsize));
829 if (ret) {
830 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dirent failed: %d\n",
831 sizeof(rd)+rd.nsize, ret);
832 return ret;
833 }
834 new_fd = jffs2_write_dirent(c, f, &rd, fd->name, rd.nsize, ALLOC_GC);
835
836 if (IS_ERR(new_fd)) {
837 printk(KERN_WARNING "jffs2_write_dirent in garbage_collect_dirent failed: %ld\n", PTR_ERR(new_fd));
838 return PTR_ERR(new_fd);
839 }
840 jffs2_add_fd_to_list(c, new_fd, &f->dents);
841 return 0;
842}
843
844static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
845 struct jffs2_inode_info *f, struct jffs2_full_dirent *fd)
846{
847 struct jffs2_full_dirent **fdp = &f->dents;
848 int found = 0;
849
850
851
852
853
854
855 if (!jffs2_can_mark_obsolete(c)) {
856 struct jffs2_raw_dirent *rd;
857 struct jffs2_raw_node_ref *raw;
858 int ret;
859 size_t retlen;
860 int name_len = strlen(fd->name);
861 uint32_t name_crc = crc32(0, fd->name, name_len);
862 uint32_t rawlen = ref_totlen(c, jeb, fd->raw);
863
864 rd = kmalloc(rawlen, GFP_KERNEL);
865 if (!rd)
866 return -ENOMEM;
867
868
869
870
871 mutex_lock(&c->erase_free_sem);
872
873 for (raw = f->inocache->nodes; raw != (void *)f->inocache; raw = raw->next_in_ino) {
874
875 cond_resched();
876
877
878 if (!(ref_obsolete(raw)))
879 continue;
880
881
882 if (ref_totlen(c, NULL, raw) != rawlen)
883 continue;
884
885
886
887 if (SECTOR_ADDR(raw->flash_offset) == SECTOR_ADDR(fd->raw->flash_offset))
888 continue;
889
890 D1(printk(KERN_DEBUG "Check potential deletion dirent at %08x\n", ref_offset(raw)));
891
892
893
894 ret = jffs2_flash_read(c, ref_offset(raw), rawlen, &retlen, (char *)rd);
895 if (ret) {
896 printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Read error (%d) reading obsolete node at %08x\n", ret, ref_offset(raw));
897
898 continue;
899 }
900 if (retlen != rawlen) {
901 printk(KERN_WARNING "jffs2_g_c_deletion_dirent(): Short read (%zd not %u) reading header from obsolete node at %08x\n",
902 retlen, rawlen, ref_offset(raw));
903 continue;
904 }
905
906 if (je16_to_cpu(rd->nodetype) != JFFS2_NODETYPE_DIRENT)
907 continue;
908
909
910 if (je32_to_cpu(rd->name_crc) != name_crc)
911 continue;
912
913
914 if (rd->nsize != name_len || !je32_to_cpu(rd->ino))
915 continue;
916
917
918 if (memcmp(rd->name, fd->name, name_len))
919 continue;
920
921
922
923
924 mutex_unlock(&c->erase_free_sem);
925
926 D1(printk(KERN_DEBUG "Deletion dirent at %08x still obsoletes real dirent \"%s\" at %08x for ino #%u\n",
927 ref_offset(fd->raw), fd->name, ref_offset(raw), je32_to_cpu(rd->ino)));
928 kfree(rd);
929
930 return jffs2_garbage_collect_dirent(c, jeb, f, fd);
931 }
932
933 mutex_unlock(&c->erase_free_sem);
934 kfree(rd);
935 }
936
937
938
939
940
941 while (*fdp) {
942 if ((*fdp) == fd) {
943 found = 1;
944 *fdp = fd->next;
945 break;
946 }
947 fdp = &(*fdp)->next;
948 }
949 if (!found) {
950 printk(KERN_WARNING "Deletion dirent \"%s\" not found in list for ino #%u\n", fd->name, f->inocache->ino);
951 }
952 jffs2_mark_node_obsolete(c, fd->raw);
953 jffs2_free_full_dirent(fd);
954 return 0;
955}
956
957static int jffs2_garbage_collect_hole(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
958 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn,
959 uint32_t start, uint32_t end)
960{
961 struct jffs2_raw_inode ri;
962 struct jffs2_node_frag *frag;
963 struct jffs2_full_dnode *new_fn;
964 uint32_t alloclen, ilen;
965 int ret;
966
967 D1(printk(KERN_DEBUG "Writing replacement hole node for ino #%u from offset 0x%x to 0x%x\n",
968 f->inocache->ino, start, end));
969
970 memset(&ri, 0, sizeof(ri));
971
972 if(fn->frags > 1) {
973 size_t readlen;
974 uint32_t crc;
975
976
977 ret = jffs2_flash_read(c, ref_offset(fn->raw), sizeof(ri), &readlen, (char *)&ri);
978 if (readlen != sizeof(ri) || ret) {
979 printk(KERN_WARNING "Node read failed in jffs2_garbage_collect_hole. Ret %d, retlen %zd. Data will be lost by writing new hole node\n", ret, readlen);
980 goto fill;
981 }
982 if (je16_to_cpu(ri.nodetype) != JFFS2_NODETYPE_INODE) {
983 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had node type 0x%04x instead of JFFS2_NODETYPE_INODE(0x%04x)\n",
984 ref_offset(fn->raw),
985 je16_to_cpu(ri.nodetype), JFFS2_NODETYPE_INODE);
986 return -EIO;
987 }
988 if (je32_to_cpu(ri.totlen) != sizeof(ri)) {
989 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had totlen 0x%x instead of expected 0x%zx\n",
990 ref_offset(fn->raw),
991 je32_to_cpu(ri.totlen), sizeof(ri));
992 return -EIO;
993 }
994 crc = crc32(0, &ri, sizeof(ri)-8);
995 if (crc != je32_to_cpu(ri.node_crc)) {
996 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node at 0x%08x had CRC 0x%08x which doesn't match calculated CRC 0x%08x\n",
997 ref_offset(fn->raw),
998 je32_to_cpu(ri.node_crc), crc);
999
1000 printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n",
1001 start, end, f->inocache->ino);
1002 goto fill;
1003 }
1004 if (ri.compr != JFFS2_COMPR_ZERO) {
1005 printk(KERN_WARNING "jffs2_garbage_collect_hole: Node 0x%08x wasn't a hole node!\n", ref_offset(fn->raw));
1006 printk(KERN_WARNING "Data in the range 0x%08x to 0x%08x of inode #%u will be lost\n",
1007 start, end, f->inocache->ino);
1008 goto fill;
1009 }
1010 } else {
1011 fill:
1012 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
1013 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
1014 ri.totlen = cpu_to_je32(sizeof(ri));
1015 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4));
1016
1017 ri.ino = cpu_to_je32(f->inocache->ino);
1018 ri.version = cpu_to_je32(++f->highest_version);
1019 ri.offset = cpu_to_je32(start);
1020 ri.dsize = cpu_to_je32(end - start);
1021 ri.csize = cpu_to_je32(0);
1022 ri.compr = JFFS2_COMPR_ZERO;
1023 }
1024
1025 frag = frag_last(&f->fragtree);
1026 if (frag)
1027
1028
1029 ilen = frag->ofs + frag->size;
1030 else
1031 ilen = JFFS2_F_I_SIZE(f);
1032
1033 ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f));
1034 ri.uid = cpu_to_je16(JFFS2_F_I_UID(f));
1035 ri.gid = cpu_to_je16(JFFS2_F_I_GID(f));
1036 ri.isize = cpu_to_je32(ilen);
1037 ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f));
1038 ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f));
1039 ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f));
1040 ri.data_crc = cpu_to_je32(0);
1041 ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8));
1042
1043 ret = jffs2_reserve_space_gc(c, sizeof(ri), &alloclen,
1044 JFFS2_SUMMARY_INODE_SIZE);
1045 if (ret) {
1046 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_hole failed: %d\n",
1047 sizeof(ri), ret);
1048 return ret;
1049 }
1050 new_fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_GC);
1051
1052 if (IS_ERR(new_fn)) {
1053 printk(KERN_WARNING "Error writing new hole node: %ld\n", PTR_ERR(new_fn));
1054 return PTR_ERR(new_fn);
1055 }
1056 if (je32_to_cpu(ri.version) == f->highest_version) {
1057 jffs2_add_full_dnode_to_inode(c, f, new_fn);
1058 if (f->metadata) {
1059 jffs2_mark_node_obsolete(c, f->metadata->raw);
1060 jffs2_free_full_dnode(f->metadata);
1061 f->metadata = NULL;
1062 }
1063 return 0;
1064 }
1065
1066
1067
1068
1069
1070
1071
1072 D1(if(unlikely(fn->frags <= 1)) {
1073 printk(KERN_WARNING "jffs2_garbage_collect_hole: Replacing fn with %d frag(s) but new ver %d != highest_version %d of ino #%d\n",
1074 fn->frags, je32_to_cpu(ri.version), f->highest_version,
1075 je32_to_cpu(ri.ino));
1076 });
1077
1078
1079 mark_ref_normal(new_fn->raw);
1080
1081 for (frag = jffs2_lookup_node_frag(&f->fragtree, fn->ofs);
1082 frag; frag = frag_next(frag)) {
1083 if (frag->ofs > fn->size + fn->ofs)
1084 break;
1085 if (frag->node == fn) {
1086 frag->node = new_fn;
1087 new_fn->frags++;
1088 fn->frags--;
1089 }
1090 }
1091 if (fn->frags) {
1092 printk(KERN_WARNING "jffs2_garbage_collect_hole: Old node still has frags!\n");
1093 BUG();
1094 }
1095 if (!new_fn->frags) {
1096 printk(KERN_WARNING "jffs2_garbage_collect_hole: New node has no frags!\n");
1097 BUG();
1098 }
1099
1100 jffs2_mark_node_obsolete(c, fn->raw);
1101 jffs2_free_full_dnode(fn);
1102
1103 return 0;
1104}
1105
1106static int jffs2_garbage_collect_dnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *orig_jeb,
1107 struct jffs2_inode_info *f, struct jffs2_full_dnode *fn,
1108 uint32_t start, uint32_t end)
1109{
1110 struct jffs2_full_dnode *new_fn;
1111 struct jffs2_raw_inode ri;
1112 uint32_t alloclen, offset, orig_end, orig_start;
1113 int ret = 0;
1114 unsigned char *comprbuf = NULL, *writebuf;
1115 unsigned long pg;
1116 unsigned char *pg_ptr;
1117
1118 memset(&ri, 0, sizeof(ri));
1119
1120 D1(printk(KERN_DEBUG "Writing replacement dnode for ino #%u from offset 0x%x to 0x%x\n",
1121 f->inocache->ino, start, end));
1122
1123 orig_end = end;
1124 orig_start = start;
1125
1126 if (c->nr_free_blocks + c->nr_erasing_blocks > c->resv_blocks_gcmerge) {
1127
1128
1129
1130
1131
1132
1133
1134 struct jffs2_node_frag *frag;
1135 uint32_t min, max;
1136
1137 min = start & ~(PAGE_CACHE_SIZE-1);
1138 max = min + PAGE_CACHE_SIZE;
1139
1140 frag = jffs2_lookup_node_frag(&f->fragtree, start);
1141
1142
1143
1144 BUG_ON(frag->ofs != start);
1145
1146
1147 while((frag = frag_prev(frag)) && frag->ofs >= min) {
1148
1149
1150
1151 if (frag->ofs > min) {
1152 D1(printk(KERN_DEBUG "Expanding down to cover partial frag (0x%x-0x%x)\n",
1153 frag->ofs, frag->ofs+frag->size));
1154 start = frag->ofs;
1155 continue;
1156 }
1157
1158 if (!frag->node || !frag->node->raw) {
1159 D1(printk(KERN_DEBUG "First frag in page is hole (0x%x-0x%x). Not expanding down.\n",
1160 frag->ofs, frag->ofs+frag->size));
1161 break;
1162 } else {
1163
1164
1165
1166
1167
1168 struct jffs2_raw_node_ref *raw = frag->node->raw;
1169 struct jffs2_eraseblock *jeb;
1170
1171 jeb = &c->blocks[raw->flash_offset / c->sector_size];
1172
1173 if (jeb == c->gcblock) {
1174 D1(printk(KERN_DEBUG "Expanding down to cover frag (0x%x-0x%x) in gcblock at %08x\n",
1175 frag->ofs, frag->ofs+frag->size, ref_offset(raw)));
1176 start = frag->ofs;
1177 break;
1178 }
1179 if (!ISDIRTY(jeb->dirty_size + jeb->wasted_size)) {
1180 D1(printk(KERN_DEBUG "Not expanding down to cover frag (0x%x-0x%x) in clean block %08x\n",
1181 frag->ofs, frag->ofs+frag->size, jeb->offset));
1182 break;
1183 }
1184
1185 D1(printk(KERN_DEBUG "Expanding down to cover frag (0x%x-0x%x) in dirty block %08x\n",
1186 frag->ofs, frag->ofs+frag->size, jeb->offset));
1187 start = frag->ofs;
1188 break;
1189 }
1190 }
1191
1192
1193
1194
1195 frag = jffs2_lookup_node_frag(&f->fragtree, end-1);
1196
1197 while((frag = frag_next(frag)) && frag->ofs+frag->size <= max) {
1198
1199
1200
1201 if (frag->ofs+frag->size < max) {
1202 D1(printk(KERN_DEBUG "Expanding up to cover partial frag (0x%x-0x%x)\n",
1203 frag->ofs, frag->ofs+frag->size));
1204 end = frag->ofs + frag->size;
1205 continue;
1206 }
1207
1208 if (!frag->node || !frag->node->raw) {
1209 D1(printk(KERN_DEBUG "Last frag in page is hole (0x%x-0x%x). Not expanding up.\n",
1210 frag->ofs, frag->ofs+frag->size));
1211 break;
1212 } else {
1213
1214
1215
1216
1217
1218 struct jffs2_raw_node_ref *raw = frag->node->raw;
1219 struct jffs2_eraseblock *jeb;
1220
1221 jeb = &c->blocks[raw->flash_offset / c->sector_size];
1222
1223 if (jeb == c->gcblock) {
1224 D1(printk(KERN_DEBUG "Expanding up to cover frag (0x%x-0x%x) in gcblock at %08x\n",
1225 frag->ofs, frag->ofs+frag->size, ref_offset(raw)));
1226 end = frag->ofs + frag->size;
1227 break;
1228 }
1229 if (!ISDIRTY(jeb->dirty_size + jeb->wasted_size)) {
1230 D1(printk(KERN_DEBUG "Not expanding up to cover frag (0x%x-0x%x) in clean block %08x\n",
1231 frag->ofs, frag->ofs+frag->size, jeb->offset));
1232 break;
1233 }
1234
1235 D1(printk(KERN_DEBUG "Expanding up to cover frag (0x%x-0x%x) in dirty block %08x\n",
1236 frag->ofs, frag->ofs+frag->size, jeb->offset));
1237 end = frag->ofs + frag->size;
1238 break;
1239 }
1240 }
1241 D1(printk(KERN_DEBUG "Expanded dnode to write from (0x%x-0x%x) to (0x%x-0x%x)\n",
1242 orig_start, orig_end, start, end));
1243
1244 D1(BUG_ON(end > frag_last(&f->fragtree)->ofs + frag_last(&f->fragtree)->size));
1245 BUG_ON(end < orig_end);
1246 BUG_ON(start > orig_start);
1247 }
1248
1249
1250
1251
1252
1253
1254
1255
1256 pg_ptr = jffs2_gc_fetch_page(c, f, start, &pg);
1257
1258 if (IS_ERR(pg_ptr)) {
1259 printk(KERN_WARNING "read_cache_page() returned error: %ld\n", PTR_ERR(pg_ptr));
1260 return PTR_ERR(pg_ptr);
1261 }
1262
1263 offset = start;
1264 while(offset < orig_end) {
1265 uint32_t datalen;
1266 uint32_t cdatalen;
1267 uint16_t comprtype = JFFS2_COMPR_NONE;
1268
1269 ret = jffs2_reserve_space_gc(c, sizeof(ri) + JFFS2_MIN_DATA_LEN,
1270 &alloclen, JFFS2_SUMMARY_INODE_SIZE);
1271
1272 if (ret) {
1273 printk(KERN_WARNING "jffs2_reserve_space_gc of %zd bytes for garbage_collect_dnode failed: %d\n",
1274 sizeof(ri)+ JFFS2_MIN_DATA_LEN, ret);
1275 break;
1276 }
1277 cdatalen = min_t(uint32_t, alloclen - sizeof(ri), end - offset);
1278 datalen = end - offset;
1279
1280 writebuf = pg_ptr + (offset & (PAGE_CACHE_SIZE -1));
1281
1282 comprtype = jffs2_compress(c, f, writebuf, &comprbuf, &datalen, &cdatalen);
1283
1284 ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
1285 ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
1286 ri.totlen = cpu_to_je32(sizeof(ri) + cdatalen);
1287 ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4));
1288
1289 ri.ino = cpu_to_je32(f->inocache->ino);
1290 ri.version = cpu_to_je32(++f->highest_version);
1291 ri.mode = cpu_to_jemode(JFFS2_F_I_MODE(f));
1292 ri.uid = cpu_to_je16(JFFS2_F_I_UID(f));
1293 ri.gid = cpu_to_je16(JFFS2_F_I_GID(f));
1294 ri.isize = cpu_to_je32(JFFS2_F_I_SIZE(f));
1295 ri.atime = cpu_to_je32(JFFS2_F_I_ATIME(f));
1296 ri.ctime = cpu_to_je32(JFFS2_F_I_CTIME(f));
1297 ri.mtime = cpu_to_je32(JFFS2_F_I_MTIME(f));
1298 ri.offset = cpu_to_je32(offset);
1299 ri.csize = cpu_to_je32(cdatalen);
1300 ri.dsize = cpu_to_je32(datalen);
1301 ri.compr = comprtype & 0xff;
1302 ri.usercompr = (comprtype >> 8) & 0xff;
1303 ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8));
1304 ri.data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen));
1305
1306 new_fn = jffs2_write_dnode(c, f, &ri, comprbuf, cdatalen, ALLOC_GC);
1307
1308 jffs2_free_comprbuf(comprbuf, writebuf);
1309
1310 if (IS_ERR(new_fn)) {
1311 printk(KERN_WARNING "Error writing new dnode: %ld\n", PTR_ERR(new_fn));
1312 ret = PTR_ERR(new_fn);
1313 break;
1314 }
1315 ret = jffs2_add_full_dnode_to_inode(c, f, new_fn);
1316 offset += datalen;
1317 if (f->metadata) {
1318 jffs2_mark_node_obsolete(c, f->metadata->raw);
1319 jffs2_free_full_dnode(f->metadata);
1320 f->metadata = NULL;
1321 }
1322 }
1323
1324 jffs2_gc_release_page(c, pg_ptr, &pg);
1325 return ret;
1326}
1327