]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: wait for delayed iputs on no space
authorZhao Lei <zhaolei@cn.fujitsu.com>
Thu, 9 Apr 2015 04:34:43 +0000 (12:34 +0800)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 26 May 2016 22:45:57 +0000 (15:45 -0700)
Orabug: 23331038

[ Upstream commit 9a4e7276d39071576d369e607d7accb84b41d0b4 ]

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: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
(cherry picked from commit 42bd8f4fda813558c3045c60ad6436b1c7430ec7)

Signed-off-by: Dan Duval <dan.duval@oracle.com>
fs/btrfs/extent-tree.c

index 3c1938000a5dc61bfb09a5eaf729ac7768561b94..98a4d5274d7dbe7aa821711b3b5aed7375017ad2 100644 (file)
@@ -3975,6 +3975,9 @@ commit_trans:
                    !atomic_read(&root->fs_info->open_ioctl_trans)) {
                        need_commit--;
 
+                       if (need_commit > 0)
+                               btrfs_wait_ordered_roots(fs_info, -1);
+
                        trans = btrfs_join_transaction(root);
                        if (IS_ERR(trans))
                                return PTR_ERR(trans);