| From 1d52c78afbbf80b58299e076a159617d6b42fe3c Mon Sep 17 00:00:00 2001 |
| From: Josef Bacik <jbacik@fb.com> |
| Date: Thu, 18 Sep 2014 11:30:44 -0400 |
| Subject: Btrfs: try not to ENOSPC on log replay |
| |
| From: Josef Bacik <jbacik@fb.com> |
| |
| commit 1d52c78afbbf80b58299e076a159617d6b42fe3c upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/inode.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/fs/btrfs/inode.c |
| +++ b/fs/btrfs/inode.c |
| @@ -3545,7 +3545,8 @@ noinline int btrfs_update_inode(struct b |
| * 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); |