• Zhao Lei's avatar
    btrfs: wait for delayed iputs on no space · 42bd8f4f
    Zhao Lei authored
    [ Upstream commit 9a4e7276 ]
    
    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>
    Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
    42bd8f4f
extent-tree.c 273 KB