• Zhao Lei's avatar
    btrfs: wait for delayed iputs on no space · 9a4e7276
    Zhao Lei authored
    btrfs will report no_space when we run following write and delete
    file loop:
     # FILE_SIZE_M=[ 75% of fs space ]
     # DEV=[ some dev ]
     # MNT=[ some dir ]
     #
     # mkfs.btrfs -f "$DEV"
     # mount -o nodatacow "$DEV" "$MNT"
     # for ((i = 0; i < 100; i++)); do dd if=/dev/zero of="$MNT"/file0 bs=1M count="$FILE_SIZE_M"; rm -f "$MNT"/file0; done
     #
    
    Reason:
     iput() and evict() is run after write pages to block device, if
     write pages work is not finished before next write, the "rm"ed space
     is not freed, and caused above bug.
    
    Fix:
     We can add "-o flushoncommit" mount option to avoid above bug, but
     it have performance problem. Actually, we can to wait for on-the-fly
     writes only when no-space happened, it is which this patch do.
    Signed-off-by: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    9a4e7276
extent-tree.c 271 KB