Commit f1f9671bd8f7d2ac6a918bad806ab5bdc0daaf4e
1 parent
0cfc7da3ff
Exists in
master
and in
7 other branches
[JFFS2] Introduce jffs2_link_node_ref() function to reduce code duplication
The same sequence of code was repeated in many places, to add a new struct jffs2_raw_node_ref to an eraseblock and adjust the space accounting accordingly. Move it out-of-line. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Showing 6 changed files with 68 additions and 122 deletions Side-by-side Diff
fs/jffs2/erase.c
... | ... | @@ -373,12 +373,8 @@ |
373 | 373 | goto filebad; |
374 | 374 | } |
375 | 375 | |
376 | - jeb->first_node = jeb->last_node = NULL; | |
376 | + /* Everything else got zeroed before the erase */ | |
377 | 377 | jeb->free_size = c->sector_size; |
378 | - jeb->used_size = 0; | |
379 | - jeb->dirty_size = 0; | |
380 | - jeb->wasted_size = 0; | |
381 | - | |
382 | 378 | } else { |
383 | 379 | |
384 | 380 | struct kvec vecs[1]; |
385 | 381 | |
386 | 382 | |
387 | 383 | |
... | ... | @@ -412,17 +408,13 @@ |
412 | 408 | goto filebad; |
413 | 409 | } |
414 | 410 | |
411 | + /* Everything else got zeroed before the erase */ | |
412 | + jeb->free_size = c->sector_size; | |
413 | + | |
415 | 414 | marker_ref->next_in_ino = NULL; |
416 | - marker_ref->next_phys = NULL; | |
417 | 415 | marker_ref->flash_offset = jeb->offset | REF_NORMAL; |
418 | - marker_ref->__totlen = c->cleanmarker_size; | |
419 | 416 | |
420 | - jeb->first_node = jeb->last_node = marker_ref; | |
421 | - | |
422 | - jeb->free_size = c->sector_size - c->cleanmarker_size; | |
423 | - jeb->used_size = c->cleanmarker_size; | |
424 | - jeb->dirty_size = 0; | |
425 | - jeb->wasted_size = 0; | |
417 | + jffs2_link_node_ref(c, jeb, marker_ref, c->cleanmarker_size); | |
426 | 418 | } |
427 | 419 | |
428 | 420 | spin_lock(&c->erase_completion_lock); |
fs/jffs2/nodelist.c
... | ... | @@ -1046,4 +1046,38 @@ |
1046 | 1046 | cond_resched(); |
1047 | 1047 | } |
1048 | 1048 | } |
1049 | + | |
1050 | +void jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | |
1051 | + struct jffs2_raw_node_ref *ref, uint32_t len) | |
1052 | +{ | |
1053 | + if (!jeb->first_node) | |
1054 | + jeb->first_node = ref; | |
1055 | + if (jeb->last_node) | |
1056 | + jeb->last_node->next_phys = ref; | |
1057 | + jeb->last_node = ref; | |
1058 | + | |
1059 | + switch(ref_flags(ref)) { | |
1060 | + case REF_UNCHECKED: | |
1061 | + c->unchecked_size += len; | |
1062 | + jeb->unchecked_size += len; | |
1063 | + break; | |
1064 | + | |
1065 | + case REF_NORMAL: | |
1066 | + case REF_PRISTINE: | |
1067 | + c->used_size += len; | |
1068 | + jeb->used_size += len; | |
1069 | + break; | |
1070 | + | |
1071 | + case REF_OBSOLETE: | |
1072 | + c->dirty_size += len; | |
1073 | + jeb->used_size += len; | |
1074 | + break; | |
1075 | + } | |
1076 | + c->free_size -= len; | |
1077 | + jeb->free_size -= len; | |
1078 | + | |
1079 | + /* Set __totlen field... for now */ | |
1080 | + ref->__totlen = len; | |
1081 | + ref->next_phys = NULL; | |
1082 | +} |
fs/jffs2/nodelist.h
... | ... | @@ -348,6 +348,8 @@ |
348 | 348 | int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn); |
349 | 349 | void jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size); |
350 | 350 | int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info *tn); |
351 | +void jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, | |
352 | + struct jffs2_raw_node_ref *ref, uint32_t len); | |
351 | 353 | |
352 | 354 | /* nodemgmt.c */ |
353 | 355 | int jffs2_thread_should_wake(struct jffs2_sb_info *c); |
fs/jffs2/nodemgmt.c
... | ... | @@ -403,21 +403,7 @@ |
403 | 403 | #endif |
404 | 404 | spin_lock(&c->erase_completion_lock); |
405 | 405 | |
406 | - if (!jeb->first_node) | |
407 | - jeb->first_node = new; | |
408 | - if (jeb->last_node) | |
409 | - jeb->last_node->next_phys = new; | |
410 | - jeb->last_node = new; | |
411 | - | |
412 | - jeb->free_size -= len; | |
413 | - c->free_size -= len; | |
414 | - if (ref_obsolete(new)) { | |
415 | - jeb->dirty_size += len; | |
416 | - c->dirty_size += len; | |
417 | - } else { | |
418 | - jeb->used_size += len; | |
419 | - c->used_size += len; | |
420 | - } | |
406 | + jffs2_link_node_ref(c, jeb, new, len); | |
421 | 407 | |
422 | 408 | if (!jeb->free_size && !jeb->dirty_size && !ISDIRTY(jeb->wasted_size)) { |
423 | 409 | /* If it lives on the dirty_list, jffs2_reserve_space will put it there */ |
fs/jffs2/scan.c
... | ... | @@ -351,17 +351,11 @@ |
351 | 351 | xd->data_crc = je32_to_cpu(rx->data_crc); |
352 | 352 | xd->node = raw; |
353 | 353 | |
354 | - raw->__totlen = totlen; | |
355 | 354 | raw->flash_offset = ofs | REF_PRISTINE; |
356 | - raw->next_phys = NULL; | |
357 | 355 | raw->next_in_ino = (void *)xd; |
358 | - if (!jeb->first_node) | |
359 | - jeb->first_node = raw; | |
360 | - if (jeb->last_node) | |
361 | - jeb->last_node->next_phys = raw; | |
362 | - jeb->last_node = raw; | |
363 | 356 | |
364 | - USED_SPACE(PAD(je32_to_cpu(rx->totlen))); | |
357 | + jffs2_link_node_ref(c, jeb, raw, totlen); | |
358 | + | |
365 | 359 | if (jffs2_sum_active()) |
366 | 360 | jffs2_sum_add_xattr_mem(s, rx, ofs - jeb->offset); |
367 | 361 | dbg_xattr("scaning xdatum at %#08x (xid=%u, version=%u)\n", |
368 | 362 | |
369 | 363 | |
370 | 364 | |
... | ... | @@ -418,17 +412,11 @@ |
418 | 412 | ref->next = c->xref_temp; |
419 | 413 | c->xref_temp = ref; |
420 | 414 | |
421 | - raw->__totlen = PAD(je32_to_cpu(rr->totlen)); | |
422 | 415 | raw->flash_offset = ofs | REF_PRISTINE; |
423 | - raw->next_phys = NULL; | |
424 | 416 | raw->next_in_ino = (void *)ref; |
425 | - if (!jeb->first_node) | |
426 | - jeb->first_node = raw; | |
427 | - if (jeb->last_node) | |
428 | - jeb->last_node->next_phys = raw; | |
429 | - jeb->last_node = raw; | |
430 | 417 | |
431 | - USED_SPACE(PAD(je32_to_cpu(rr->totlen))); | |
418 | + jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(rr->totlen))); | |
419 | + | |
432 | 420 | if (jffs2_sum_active()) |
433 | 421 | jffs2_sum_add_xref_mem(s, rr, ofs - jeb->offset); |
434 | 422 | dbg_xattr("scan xref at %#08x (xid=%u, ino=%u)\n", |
435 | 423 | |
436 | 424 | |
... | ... | @@ -827,12 +815,10 @@ |
827 | 815 | return -ENOMEM; |
828 | 816 | } |
829 | 817 | marker_ref->next_in_ino = NULL; |
830 | - marker_ref->next_phys = NULL; | |
831 | 818 | marker_ref->flash_offset = ofs | REF_NORMAL; |
832 | - marker_ref->__totlen = c->cleanmarker_size; | |
833 | - jeb->first_node = jeb->last_node = marker_ref; | |
834 | 819 | |
835 | - USED_SPACE(PAD(c->cleanmarker_size)); | |
820 | + jffs2_link_node_ref(c, jeb, marker_ref, c->cleanmarker_size); | |
821 | + | |
836 | 822 | ofs += PAD(c->cleanmarker_size); |
837 | 823 | } |
838 | 824 | break; |
839 | 825 | |
840 | 826 | |
... | ... | @@ -971,16 +957,11 @@ |
971 | 957 | /* Wheee. It worked */ |
972 | 958 | |
973 | 959 | raw->flash_offset = ofs | REF_UNCHECKED; |
974 | - raw->__totlen = PAD(je32_to_cpu(ri->totlen)); | |
975 | - raw->next_phys = NULL; | |
976 | - raw->next_in_ino = ic->nodes; | |
977 | 960 | |
961 | + raw->next_in_ino = ic->nodes; | |
978 | 962 | ic->nodes = raw; |
979 | - if (!jeb->first_node) | |
980 | - jeb->first_node = raw; | |
981 | - if (jeb->last_node) | |
982 | - jeb->last_node->next_phys = raw; | |
983 | - jeb->last_node = raw; | |
963 | + | |
964 | + jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(ri->totlen))); | |
984 | 965 | |
985 | 966 | D1(printk(KERN_DEBUG "Node is ino #%u, version %d. Range 0x%x-0x%x\n", |
986 | 967 | je32_to_cpu(ri->ino), je32_to_cpu(ri->version), |
... | ... | @@ -989,8 +970,6 @@ |
989 | 970 | |
990 | 971 | pseudo_random += je32_to_cpu(ri->version); |
991 | 972 | |
992 | - UNCHECKED_SPACE(PAD(je32_to_cpu(ri->totlen))); | |
993 | - | |
994 | 973 | if (jffs2_sum_active()) { |
995 | 974 | jffs2_sum_add_inode_mem(s, ri, ofs - jeb->offset); |
996 | 975 | } |
997 | 976 | |
998 | 977 | |
999 | 978 | |
1000 | 979 | |
... | ... | @@ -1053,24 +1032,18 @@ |
1053 | 1032 | return -ENOMEM; |
1054 | 1033 | } |
1055 | 1034 | |
1056 | - raw->__totlen = PAD(je32_to_cpu(rd->totlen)); | |
1057 | 1035 | raw->flash_offset = ofs | REF_PRISTINE; |
1058 | - raw->next_phys = NULL; | |
1059 | 1036 | raw->next_in_ino = ic->nodes; |
1060 | 1037 | ic->nodes = raw; |
1061 | - if (!jeb->first_node) | |
1062 | - jeb->first_node = raw; | |
1063 | - if (jeb->last_node) | |
1064 | - jeb->last_node->next_phys = raw; | |
1065 | - jeb->last_node = raw; | |
1066 | 1038 | |
1039 | + jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(rd->totlen))); | |
1040 | + | |
1067 | 1041 | fd->raw = raw; |
1068 | 1042 | fd->next = NULL; |
1069 | 1043 | fd->version = je32_to_cpu(rd->version); |
1070 | 1044 | fd->ino = je32_to_cpu(rd->ino); |
1071 | 1045 | fd->nhash = full_name_hash(fd->name, rd->nsize); |
1072 | 1046 | fd->type = rd->type; |
1073 | - USED_SPACE(PAD(je32_to_cpu(rd->totlen))); | |
1074 | 1047 | jffs2_add_fd_to_list(c, fd, &ic->scan_dents); |
1075 | 1048 | |
1076 | 1049 | if (jffs2_sum_active()) { |
fs/jffs2/summary.c
... | ... | @@ -410,20 +410,14 @@ |
410 | 410 | } |
411 | 411 | |
412 | 412 | raw->flash_offset = (jeb->offset + je32_to_cpu(spi->offset)) | REF_UNCHECKED; |
413 | - raw->__totlen = PAD(je32_to_cpu(spi->totlen)); | |
414 | - raw->next_phys = NULL; | |
415 | - raw->next_in_ino = ic->nodes; | |
416 | 413 | |
414 | + raw->next_in_ino = ic->nodes; | |
417 | 415 | ic->nodes = raw; |
418 | - if (!jeb->first_node) | |
419 | - jeb->first_node = raw; | |
420 | - if (jeb->last_node) | |
421 | - jeb->last_node->next_phys = raw; | |
422 | - jeb->last_node = raw; | |
423 | - *pseudo_random += je32_to_cpu(spi->version); | |
424 | 416 | |
425 | - UNCHECKED_SPACE(PAD(je32_to_cpu(spi->totlen))); | |
417 | + jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(spi->totlen))); | |
426 | 418 | |
419 | + *pseudo_random += je32_to_cpu(spi->version); | |
420 | + | |
427 | 421 | sp += JFFS2_SUMMARY_INODE_SIZE; |
428 | 422 | |
429 | 423 | break; |
430 | 424 | |
431 | 425 | |
432 | 426 | |
433 | 427 | |
... | ... | @@ -457,24 +451,19 @@ |
457 | 451 | return -ENOMEM; |
458 | 452 | } |
459 | 453 | |
460 | - raw->__totlen = PAD(je32_to_cpu(spd->totlen)); | |
461 | 454 | raw->flash_offset = (jeb->offset + je32_to_cpu(spd->offset)) | REF_PRISTINE; |
462 | - raw->next_phys = NULL; | |
463 | 455 | raw->next_in_ino = ic->nodes; |
464 | 456 | ic->nodes = raw; |
465 | - if (!jeb->first_node) | |
466 | - jeb->first_node = raw; | |
467 | - if (jeb->last_node) | |
468 | - jeb->last_node->next_phys = raw; | |
469 | - jeb->last_node = raw; | |
470 | 457 | |
458 | + jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(spd->totlen))); | |
459 | + | |
471 | 460 | fd->raw = raw; |
472 | 461 | fd->next = NULL; |
473 | 462 | fd->version = je32_to_cpu(spd->version); |
474 | 463 | fd->ino = je32_to_cpu(spd->ino); |
475 | 464 | fd->nhash = full_name_hash(fd->name, spd->nsize); |
476 | 465 | fd->type = spd->type; |
477 | - USED_SPACE(PAD(je32_to_cpu(spd->totlen))); | |
466 | + | |
478 | 467 | jffs2_add_fd_to_list(c, fd, &ic->scan_dents); |
479 | 468 | |
480 | 469 | *pseudo_random += je32_to_cpu(spd->version); |
481 | 470 | |
482 | 471 | |
483 | 472 | |
... | ... | @@ -516,17 +505,11 @@ |
516 | 505 | xd->node = raw; |
517 | 506 | |
518 | 507 | raw->flash_offset = ofs | REF_UNCHECKED; |
519 | - raw->__totlen = PAD(je32_to_cpu(spx->totlen)); | |
520 | - raw->next_phys = NULL; | |
521 | 508 | raw->next_in_ino = (void *)xd; |
522 | - if (!jeb->first_node) | |
523 | - jeb->first_node = raw; | |
524 | - if (jeb->last_node) | |
525 | - jeb->last_node->next_phys = raw; | |
526 | - jeb->last_node = raw; | |
527 | 509 | |
510 | + jffs2_link_node_ref(c, jeb, raw, PAD(je32_to_cpu(spx->totlen))); | |
511 | + | |
528 | 512 | *pseudo_random += je32_to_cpu(spx->xid); |
529 | - UNCHECKED_SPACE(je32_to_cpu(spx->totlen)); | |
530 | 513 | sp += JFFS2_SUMMARY_XATTR_SIZE; |
531 | 514 | |
532 | 515 | break; |
533 | 516 | |
534 | 517 | |
535 | 518 | |
... | ... | @@ -559,17 +542,11 @@ |
559 | 542 | ref->next = c->xref_temp; |
560 | 543 | c->xref_temp = ref; |
561 | 544 | |
562 | - raw->__totlen = PAD(sizeof(struct jffs2_raw_xref)); | |
563 | 545 | raw->flash_offset = ofs | REF_UNCHECKED; |
564 | - raw->next_phys = NULL; | |
565 | 546 | raw->next_in_ino = (void *)ref; |
566 | - if (!jeb->first_node) | |
567 | - jeb->first_node = raw; | |
568 | - if (jeb->last_node) | |
569 | - jeb->last_node->next_phys = raw; | |
570 | - jeb->last_node = raw; | |
571 | 547 | |
572 | - UNCHECKED_SPACE(PAD(sizeof(struct jffs2_raw_xref))); | |
548 | + jffs2_link_node_ref(c, jeb, raw, PAD(sizeof(struct jffs2_raw_xref))); | |
549 | + | |
573 | 550 | *pseudo_random += ofs; |
574 | 551 | sp += JFFS2_SUMMARY_XREF_SIZE; |
575 | 552 | |
576 | 553 | |
577 | 554 | |
... | ... | @@ -653,13 +630,10 @@ |
653 | 630 | return -ENOMEM; |
654 | 631 | } |
655 | 632 | |
656 | - marker_ref->next_in_ino = NULL; | |
657 | - marker_ref->next_phys = NULL; | |
658 | 633 | marker_ref->flash_offset = jeb->offset | REF_NORMAL; |
659 | - marker_ref->__totlen = je32_to_cpu(summary->cln_mkr); | |
660 | - jeb->first_node = jeb->last_node = marker_ref; | |
634 | + marker_ref->next_in_ino = NULL; | |
661 | 635 | |
662 | - USED_SPACE( PAD(je32_to_cpu(summary->cln_mkr)) ); | |
636 | + jffs2_link_node_ref(c, jeb, marker_ref, je32_to_cpu(summary->cln_mkr)); | |
663 | 637 | } |
664 | 638 | } |
665 | 639 | |
666 | 640 | |
667 | 641 | |
... | ... | @@ -682,16 +656,9 @@ |
682 | 656 | cache_ref->next_in_ino = NULL; |
683 | 657 | cache_ref->next_phys = NULL; |
684 | 658 | cache_ref->flash_offset = ofs | REF_NORMAL; |
685 | - cache_ref->__totlen = sumsize; | |
686 | 659 | |
687 | - if (!jeb->first_node) | |
688 | - jeb->first_node = cache_ref; | |
689 | - if (jeb->last_node) | |
690 | - jeb->last_node->next_phys = cache_ref; | |
691 | - jeb->last_node = cache_ref; | |
660 | + jffs2_link_node_ref(c, jeb, cache_ref, sumsize); | |
692 | 661 | |
693 | - USED_SPACE(sumsize); | |
694 | - | |
695 | 662 | jeb->wasted_size += jeb->free_size; |
696 | 663 | c->wasted_size += jeb->free_size; |
697 | 664 | c->free_size -= jeb->free_size; |
698 | 665 | |
699 | 666 | |
... | ... | @@ -888,17 +855,9 @@ |
888 | 855 | } |
889 | 856 | |
890 | 857 | summary_ref->next_in_ino = NULL; |
891 | - summary_ref->next_phys = NULL; | |
892 | 858 | summary_ref->flash_offset = (jeb->offset + c->sector_size - jeb->free_size) | REF_NORMAL; |
893 | - summary_ref->__totlen = infosize; | |
894 | 859 | |
895 | - if (!jeb->first_node) | |
896 | - jeb->first_node = summary_ref; | |
897 | - if (jeb->last_node) | |
898 | - jeb->last_node->next_phys = summary_ref; | |
899 | - jeb->last_node = summary_ref; | |
900 | - | |
901 | - USED_SPACE(infosize); | |
860 | + jffs2_link_node_ref(c, jeb, summary_ref, infosize); | |
902 | 861 | |
903 | 862 | return 0; |
904 | 863 | } |