summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason2012-07-02 21:29:53 +0200
committerChris Mason2012-07-02 21:39:19 +0200
commitb6305567e7d31b0bec1b8cb9ec0cadd7f7086f5f (patch)
treedc41a37466e6bd6502765b860feb658f20a1e7cb
parentBtrfs: hold a ref on the inode during writepages (diff)
downloadkernel-qcow2-linux-b6305567e7d31b0bec1b8cb9ec0cadd7f7086f5f.tar.gz
kernel-qcow2-linux-b6305567e7d31b0bec1b8cb9ec0cadd7f7086f5f.tar.xz
kernel-qcow2-linux-b6305567e7d31b0bec1b8cb9ec0cadd7f7086f5f.zip
Btrfs: run delayed directory updates during log replay
While we are resolving directory modifications in the tree log, we are triggering delayed metadata updates to the filesystem btrees. This commit forces the delayed updates to run so the replay code can find any modifications done. It stops us from crashing because the directory deleltion replay expects items to be removed immediately from the tree. Signed-off-by: Chris Mason <chris.mason@fusionio.com> cc: stable@kernel.org
-rw-r--r--fs/btrfs/tree-log.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 2017d0ff511c..8abeae4224f9 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -690,6 +690,8 @@ static noinline int drop_one_dir_item(struct btrfs_trans_handle *trans,
kfree(name);
iput(inode);
+
+ btrfs_run_delayed_items(trans, root);
return ret;
}
@@ -895,6 +897,7 @@ again:
ret = btrfs_unlink_inode(trans, root, dir,
inode, victim_name,
victim_name_len);
+ btrfs_run_delayed_items(trans, root);
}
kfree(victim_name);
ptr = (unsigned long)(victim_ref + 1) + victim_name_len;
@@ -1475,6 +1478,9 @@ again:
ret = btrfs_unlink_inode(trans, root, dir, inode,
name, name_len);
BUG_ON(ret);
+
+ btrfs_run_delayed_items(trans, root);
+
kfree(name);
iput(inode);