summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fb.com>2014-09-18 19:30:44 +0400
committerChris Mason <clm@fb.com>2014-09-23 04:13:36 +0400
commit1d52c78afbbf80b58299e076a159617d6b42fe3c (patch)
tree38fb60aed5cdd37c8c60fe010475d14be47db63e
parentf6acfd50110b335c7af636cf1fc8e55319cae5fc (diff)
downloadlinux-1d52c78afbbf80b58299e076a159617d6b42fe3c.tar.xz
Btrfs: try not to ENOSPC on log replay
When doing log replay we may have to update inodes, which traditionally goes through our delayed inode stuff. This will try to move space over from the trans handle, but we don't reserve space in our trans handle on replay since we don't know how much we will need, so instead we try to flush. But because we have a trans handle open we won't flush anything, so if we are out of reserve space we will simply return ENOSPC. Since we know that if an operation made it into the log then we definitely had space before the box bought the farm then we don't need to worry about doing this space reservation. Use the fs_info->log_root_recovering flag to skip the delayed inode stuff and update the item directly. Thanks, Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r--fs/btrfs/inode.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index b1106d0dcd5c..344a322eb386 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3718,7 +3718,8 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans,
* without delay
*/
if (!btrfs_is_free_space_inode(inode)
- && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) {
+ && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID
+ && !root->fs_info->log_root_recovering) {
btrfs_update_root_times(trans, root);
ret = btrfs_delayed_update_inode(trans, root, inode);