aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason2014-12-31 11:18:29 -0600
committerGreg Kroah-Hartman2015-01-16 08:59:34 -0600
commit3341738696e065a56ad26026056664a88fc5039d (patch)
treeb5a795c955c54f70fc66fc04ead7b46d505ec785
parent852cacf6bd83dd335d4138746dccb0497adfd3aa (diff)
downloadkernel-audio-3341738696e065a56ad26026056664a88fc5039d.tar.gz
kernel-audio-3341738696e065a56ad26026056664a88fc5039d.tar.xz
kernel-audio-3341738696e065a56ad26026056664a88fc5039d.zip
Btrfs: don't delay inode ref updates during log replay
commit 6f8960541b1eb6054a642da48daae2320fddba93 upstream. Commit 1d52c78afbb (Btrfs: try not to ENOSPC on log replay) added a check to skip delayed inode updates during log replay because it confuses the enospc code. But the delayed processing will end up ignoring delayed refs from log replay because the inode itself wasn't put through the delayed code. This can end up triggering a warning at commit time: WARNING: CPU: 2 PID: 778 at fs/btrfs/delayed-inode.c:1410 btrfs_assert_delayed_root_empty+0x32/0x34() Which is repeated for each commit because we never process the delayed inode ref update. The fix used here is to change btrfs_delayed_delete_inode_ref to return an error if we're currently in log replay. The caller will do the ref deletion immediately and everything will work properly. Signed-off-by: Chris Mason <clm@fb.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/btrfs/delayed-inode.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
index 451b00c86f6c..12e35566d2fc 100644
--- a/fs/btrfs/delayed-inode.c
+++ b/fs/btrfs/delayed-inode.c
@@ -1854,6 +1854,14 @@ int btrfs_delayed_delete_inode_ref(struct inode *inode)
1854{ 1854{
1855 struct btrfs_delayed_node *delayed_node; 1855 struct btrfs_delayed_node *delayed_node;
1856 1856
1857 /*
1858 * we don't do delayed inode updates during log recovery because it
1859 * leads to enospc problems. This means we also can't do
1860 * delayed inode refs
1861 */
1862 if (BTRFS_I(inode)->root->fs_info->log_root_recovering)
1863 return -EAGAIN;
1864
1857 delayed_node = btrfs_get_or_create_delayed_node(inode); 1865 delayed_node = btrfs_get_or_create_delayed_node(inode);
1858 if (IS_ERR(delayed_node)) 1866 if (IS_ERR(delayed_node))
1859 return PTR_ERR(delayed_node); 1867 return PTR_ERR(delayed_node);