• F
    Btrfs: fix directory recovery from fsync log · a2cc11db
    Filipe Manana 提交于
    When replaying a directory from the fsync log, if a directory entry
    exists both in the fs/subvol tree and in the log, the directory's inode
    got its i_size updated incorrectly, accounting for the dentry's name
    twice.
    
    Reproducer, from a test for xfstests:
    
        _scratch_mkfs >> $seqres.full 2>&1
        _init_flakey
        _mount_flakey
    
        touch $SCRATCH_MNT/foo
        sync
    
        touch $SCRATCH_MNT/bar
        xfs_io -c "fsync" $SCRATCH_MNT
        xfs_io -c "fsync" $SCRATCH_MNT/bar
    
        _load_flakey_table $FLAKEY_DROP_WRITES
        _unmount_flakey
    
        _load_flakey_table $FLAKEY_ALLOW_WRITES
        _mount_flakey
    
        [ -f $SCRATCH_MNT/foo ] || echo "file foo is missing"
        [ -f $SCRATCH_MNT/bar ] || echo "file bar is missing"
    
        _unmount_flakey
        _check_scratch_fs $FLAKEY_DEV
    
    The filesystem check at the end failed with the message:
    "root 5 root dir 256 error".
    
    A test case for xfstests follows.
    Signed-off-by: NFilipe Manana <fdmanana@suse.com>
    Signed-off-by: NChris Mason <clm@fb.com>
    a2cc11db
tree-log.c 117.5 KB