Skip to content
  • Chao Yu's avatar
    f2fs: recover invalid/reserved block address for fsynced file · 12a8343e
    Chao Yu authored
    
    
    When testing with generic/101 in xfstests, error message outputed as below:
    
        --- tests/generic/101.out
        +++ results//generic/101.out.bad
        @@ -10,10 +10,14 @@
         File foo content after log replay:
         0000000 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa
         *
        -0200000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        +0200000 bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb
         *
         0372000
        ...
        (Run 'diff -u tests/generic/101.out results/generic/101.out.bad'  to see the entire diff)
    
    The test flow is like below:
    1. pwrite foo -S 0xaa 0 64K
    2. pwrite foo -S 0xbb 64K 61K
    3. sync
    4. truncate foo 64K
    5. truncate foo 125K
    6. fsync foo
    7. flakey drop writes
    8. umount
    
    After this test, we expect the data of recovered file will have the first
    64k of data filling with value 0xaa and the next 61k of data filling with
    value 0x00 because we have fsynced it before dropping writes in dm.
    
    In f2fs, during recovering, we will only recover the valid block address
    in direct node page if it is marked as a fsynced dnode, but block address
    which means invalid/reserved (with value NULL_ADDR/NEW_ADDR) will not be
    recovered. So, the file recovered shows its incorrect data 0xbb in range of
    [61k, 125k].
    
    In this patch, we fix to recover invalid/reserved block during recover flow.
    
    Signed-off-by: default avatarChao Yu <chao2.yu@samsung.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    12a8343e