• liubo's avatar
    btrfs: make inode ref log recovery faster · c622ae60
    liubo authored
    When we recover from crash via write-ahead log tree and process
    the inode refs, for each btrfs_inode_ref item, we will
    1) check if we already have a perfect match in fs/file tree, if
       we have, then we're done.
    2) search the corresponding back reference in fs/file tree, and
       check all the names in this back reference to see if they are
       also in the log to avoid conflict corners.
    3) recover the logged inode refs to fs/file tree.
    
    In current btrfs, however,
    - for 2)'s check, once is enough, since the checked back reference
      will remain unchanged after processing all the inode refs belonged
      to the key.
    - it has no need to do another 1) between 2) and 3).
    
    I've made a small test to show how it improves,
    
    $dd if=/dev/zero of=foobar bs=4K count=1
    $sync
    $make 100 hard links continuously, like ln foobar link_i
    $fsync foobar
    $echo b > /proc/sysrq-trigger
    after reboot
    $time mount DEV PATH
    
    without patch:
    real    0m0.285s
    user    0m0.001s
    sys     0m0.009s
    
    with patch:
    real    0m0.123s
    user    0m0.000s
    sys     0m0.010s
    
    Changelog v1->v2:
    - fix double free - pointed by David Sterba
    Changelog v2->v3:
    - adjust free order
    Signed-off-by: default avatarLiu Bo <liubo2009@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    c622ae60
tree-log.c 84.9 KB