diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2008-12-28 03:17:23 -0500 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2009-09-15 10:09:48 -0400 |
commit | be9e62a7307583594d88f6ccf57a4e30308e7b21 (patch) | |
tree | b30b5ccb97f583c4bbc2095923f6f5f9fd18890a | |
parent | 055da1b704e95fea39597bd84d64cea7d4f7d2aa (diff) |
UBIFS: improve lprops dump
Improve 'dbg_dump_lprop()' and print dark and dead space there,
decode flags, and journal heads.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r-- | fs/ubifs/debug.c | 87 | ||||
-rw-r--r-- | fs/ubifs/lprops.c | 27 | ||||
-rw-r--r-- | fs/ubifs/ubifs.h | 1 |
3 files changed, 97 insertions, 18 deletions
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 96900049bcd6..fd3f07e2c71c 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c | |||
@@ -663,9 +663,90 @@ void dbg_dump_budg(struct ubifs_info *c) | |||
663 | 663 | ||
664 | void dbg_dump_lprop(const struct ubifs_info *c, const struct ubifs_lprops *lp) | 664 | void dbg_dump_lprop(const struct ubifs_info *c, const struct ubifs_lprops *lp) |
665 | { | 665 | { |
666 | printk(KERN_DEBUG "LEB %d lprops: free %d, dirty %d (used %d), " | 666 | int i, spc, dark = 0, dead = 0; |
667 | "flags %#x\n", lp->lnum, lp->free, lp->dirty, | 667 | struct rb_node *rb; |
668 | c->leb_size - lp->free - lp->dirty, lp->flags); | 668 | struct ubifs_bud *bud; |
669 | |||
670 | spc = lp->free + lp->dirty; | ||
671 | if (spc < c->dead_wm) | ||
672 | dead = spc; | ||
673 | else | ||
674 | dark = ubifs_calc_dark(c, spc); | ||
675 | |||
676 | if (lp->flags & LPROPS_INDEX) | ||
677 | printk(KERN_DEBUG "LEB %-7d free %-8d dirty %-8d used %-8d " | ||
678 | "free + dirty %-8d flags %#x (", lp->lnum, lp->free, | ||
679 | lp->dirty, c->leb_size - spc, spc, lp->flags); | ||
680 | else | ||
681 | printk(KERN_DEBUG "LEB %-7d free %-8d dirty %-8d used %-8d " | ||
682 | "free + dirty %-8d dark %-4d dead %-4d nodes fit %-3d " | ||
683 | "flags %#-4x (", lp->lnum, lp->free, lp->dirty, | ||
684 | c->leb_size - spc, spc, dark, dead, | ||
685 | (int)(spc / UBIFS_MAX_NODE_SZ), lp->flags); | ||
686 | |||
687 | if (lp->flags & LPROPS_TAKEN) { | ||
688 | if (lp->flags & LPROPS_INDEX) | ||
689 | printk(KERN_CONT "index, taken"); | ||
690 | else | ||
691 | printk(KERN_CONT "taken"); | ||
692 | } else { | ||
693 | const char *s; | ||
694 | |||
695 | if (lp->flags & LPROPS_INDEX) { | ||
696 | switch (lp->flags & LPROPS_CAT_MASK) { | ||
697 | case LPROPS_DIRTY_IDX: | ||
698 | s = "dirty index"; | ||
699 | break; | ||
700 | case LPROPS_FRDI_IDX: | ||
701 | s = "freeable index"; | ||
702 | break; | ||
703 | default: | ||
704 | s = "index"; | ||
705 | } | ||
706 | } else { | ||
707 | switch (lp->flags & LPROPS_CAT_MASK) { | ||
708 | case LPROPS_UNCAT: | ||
709 | s = "not categorized"; | ||
710 | break; | ||
711 | case LPROPS_DIRTY: | ||
712 | s = "dirty"; | ||
713 | break; | ||
714 | case LPROPS_FREE: | ||
715 | s = "free"; | ||
716 | break; | ||
717 | case LPROPS_EMPTY: | ||
718 | s = "empty"; | ||
719 | break; | ||
720 | case LPROPS_FREEABLE: | ||
721 | s = "freeable"; | ||
722 | break; | ||
723 | default: | ||
724 | s = NULL; | ||
725 | break; | ||
726 | } | ||
727 | } | ||
728 | printk(KERN_CONT "%s", s); | ||
729 | } | ||
730 | |||
731 | for (rb = rb_first((struct rb_root *)&c->buds); rb; rb = rb_next(rb)) { | ||
732 | bud = rb_entry(rb, struct ubifs_bud, rb); | ||
733 | if (bud->lnum == lp->lnum) { | ||
734 | int head = 0; | ||
735 | for (i = 0; i < c->jhead_cnt; i++) { | ||
736 | if (lp->lnum == c->jheads[i].wbuf.lnum) { | ||
737 | printk(KERN_CONT ", jhead %s", | ||
738 | dbg_jhead(i)); | ||
739 | head = 1; | ||
740 | } | ||
741 | } | ||
742 | if (!head) | ||
743 | printk(KERN_CONT ", bud of jhead %s", | ||
744 | dbg_jhead(bud->jhead)); | ||
745 | } | ||
746 | } | ||
747 | if (lp->lnum == c->gc_lnum) | ||
748 | printk(KERN_CONT ", GC LEB"); | ||
749 | printk(KERN_CONT ")\n"); | ||
669 | } | 750 | } |
670 | 751 | ||
671 | void dbg_dump_lprops(struct ubifs_info *c) | 752 | void dbg_dump_lprops(struct ubifs_info *c) |
diff --git a/fs/ubifs/lprops.c b/fs/ubifs/lprops.c index 89b355aff887..4d4ca388889b 100644 --- a/fs/ubifs/lprops.c +++ b/fs/ubifs/lprops.c | |||
@@ -461,21 +461,18 @@ static void change_category(struct ubifs_info *c, struct ubifs_lprops *lprops) | |||
461 | } | 461 | } |
462 | 462 | ||
463 | /** | 463 | /** |
464 | * calc_dark - calculate LEB dark space size. | 464 | * ubifs_calc_dark - calculate LEB dark space size. |
465 | * @c: the UBIFS file-system description object | 465 | * @c: the UBIFS file-system description object |
466 | * @spc: amount of free and dirty space in the LEB | 466 | * @spc: amount of free and dirty space in the LEB |
467 | * | 467 | * |
468 | * This function calculates amount of dark space in an LEB which has @spc bytes | 468 | * This function calculates and returns amount of dark space in an LEB which |
469 | * of free and dirty space. Returns the calculations result. | 469 | * has @spc bytes of free and dirty space. |
470 | * | 470 | * |
471 | * Dark space is the space which is not always usable - it depends on which | 471 | * UBIFS is trying to account the space which might not be usable, and this |
472 | * nodes are written in which order. E.g., if an LEB has only 512 free bytes, | 472 | * space is called "dark space". For example, if an LEB has only %512 free |
473 | * it is dark space, because it cannot fit a large data node. So UBIFS cannot | 473 | * bytes, it is dark space, because it cannot fit a large data node. |
474 | * count on this LEB and treat these 512 bytes as usable because it is not true | ||
475 | * if, for example, only big chunks of uncompressible data will be written to | ||
476 | * the FS. | ||
477 | */ | 474 | */ |
478 | static int calc_dark(struct ubifs_info *c, int spc) | 475 | int ubifs_calc_dark(const struct ubifs_info *c, int spc) |
479 | { | 476 | { |
480 | ubifs_assert(!(spc & 7)); | 477 | ubifs_assert(!(spc & 7)); |
481 | 478 | ||
@@ -575,7 +572,7 @@ const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c, | |||
575 | if (old_spc < c->dead_wm) | 572 | if (old_spc < c->dead_wm) |
576 | c->lst.total_dead -= old_spc; | 573 | c->lst.total_dead -= old_spc; |
577 | else | 574 | else |
578 | c->lst.total_dark -= calc_dark(c, old_spc); | 575 | c->lst.total_dark -= ubifs_calc_dark(c, old_spc); |
579 | 576 | ||
580 | c->lst.total_used -= c->leb_size - old_spc; | 577 | c->lst.total_used -= c->leb_size - old_spc; |
581 | } | 578 | } |
@@ -616,7 +613,7 @@ const struct ubifs_lprops *ubifs_change_lp(struct ubifs_info *c, | |||
616 | if (new_spc < c->dead_wm) | 613 | if (new_spc < c->dead_wm) |
617 | c->lst.total_dead += new_spc; | 614 | c->lst.total_dead += new_spc; |
618 | else | 615 | else |
619 | c->lst.total_dark += calc_dark(c, new_spc); | 616 | c->lst.total_dark += ubifs_calc_dark(c, new_spc); |
620 | 617 | ||
621 | c->lst.total_used += c->leb_size - new_spc; | 618 | c->lst.total_used += c->leb_size - new_spc; |
622 | } | 619 | } |
@@ -1107,7 +1104,7 @@ static int scan_check_cb(struct ubifs_info *c, | |||
1107 | "- continuing checking"); | 1104 | "- continuing checking"); |
1108 | lst->empty_lebs += 1; | 1105 | lst->empty_lebs += 1; |
1109 | lst->total_free += c->leb_size; | 1106 | lst->total_free += c->leb_size; |
1110 | lst->total_dark += calc_dark(c, c->leb_size); | 1107 | lst->total_dark += ubifs_calc_dark(c, c->leb_size); |
1111 | return LPT_SCAN_CONTINUE; | 1108 | return LPT_SCAN_CONTINUE; |
1112 | } | 1109 | } |
1113 | 1110 | ||
@@ -1117,7 +1114,7 @@ static int scan_check_cb(struct ubifs_info *c, | |||
1117 | "- continuing checking"); | 1114 | "- continuing checking"); |
1118 | lst->total_free += lp->free; | 1115 | lst->total_free += lp->free; |
1119 | lst->total_dirty += lp->dirty; | 1116 | lst->total_dirty += lp->dirty; |
1120 | lst->total_dark += calc_dark(c, c->leb_size); | 1117 | lst->total_dark += ubifs_calc_dark(c, c->leb_size); |
1121 | return LPT_SCAN_CONTINUE; | 1118 | return LPT_SCAN_CONTINUE; |
1122 | } | 1119 | } |
1123 | data->err = PTR_ERR(sleb); | 1120 | data->err = PTR_ERR(sleb); |
@@ -1235,7 +1232,7 @@ static int scan_check_cb(struct ubifs_info *c, | |||
1235 | if (spc < c->dead_wm) | 1232 | if (spc < c->dead_wm) |
1236 | lst->total_dead += spc; | 1233 | lst->total_dead += spc; |
1237 | else | 1234 | else |
1238 | lst->total_dark += calc_dark(c, spc); | 1235 | lst->total_dark += ubifs_calc_dark(c, spc); |
1239 | } | 1236 | } |
1240 | 1237 | ||
1241 | ubifs_scan_destroy(sleb); | 1238 | ubifs_scan_destroy(sleb); |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index 8ca441f5c7ea..b2d976366a46 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
@@ -1674,6 +1674,7 @@ const struct ubifs_lprops *ubifs_fast_find_free(struct ubifs_info *c); | |||
1674 | const struct ubifs_lprops *ubifs_fast_find_empty(struct ubifs_info *c); | 1674 | const struct ubifs_lprops *ubifs_fast_find_empty(struct ubifs_info *c); |
1675 | const struct ubifs_lprops *ubifs_fast_find_freeable(struct ubifs_info *c); | 1675 | const struct ubifs_lprops *ubifs_fast_find_freeable(struct ubifs_info *c); |
1676 | const struct ubifs_lprops *ubifs_fast_find_frdi_idx(struct ubifs_info *c); | 1676 | const struct ubifs_lprops *ubifs_fast_find_frdi_idx(struct ubifs_info *c); |
1677 | int ubifs_calc_dark(const struct ubifs_info *c, int spc); | ||
1677 | 1678 | ||
1678 | /* file.c */ | 1679 | /* file.c */ |
1679 | int ubifs_fsync(struct file *file, struct dentry *dentry, int datasync); | 1680 | int ubifs_fsync(struct file *file, struct dentry *dentry, int datasync); |