Commit f1f9671bd8f7d2ac6a918bad806ab5bdc0daaf4e

Authored by David Woodhouse
1 parent 0cfc7da3ff

[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

... ... @@ -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);
... ... @@ -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 +}
... ... @@ -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);
... ... @@ -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 */
... ... @@ -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()) {
... ... @@ -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 }