Commit 30e4fb85e8a54a770f5e1111be18f722e14f983b

Authored by Chris Mason
Committed by Greg Kroah-Hartman
1 parent 087e791172

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>

Showing 1 changed file with 8 additions and 0 deletions Side-by-side Diff

fs/btrfs/delayed-inode.c
... ... @@ -1857,6 +1857,14 @@
1857 1857 {
1858 1858 struct btrfs_delayed_node *delayed_node;
1859 1859  
  1860 + /*
  1861 + * we don't do delayed inode updates during log recovery because it
  1862 + * leads to enospc problems. This means we also can't do
  1863 + * delayed inode refs
  1864 + */
  1865 + if (BTRFS_I(inode)->root->fs_info->log_root_recovering)
  1866 + return -EAGAIN;
  1867 +
1860 1868 delayed_node = btrfs_get_or_create_delayed_node(inode);
1861 1869 if (IS_ERR(delayed_node))
1862 1870 return PTR_ERR(delayed_node);