Skip to content

Commit

Permalink
Btrfs: fix inode cache writeout
Browse files Browse the repository at this point in the history
The code to fix stalls during free spache cache IO wasn't using
the correct root when waiting on the IO for inode caches.  This
is only a problem when the inode cache is enabled with

mount -o inode_cache

This fixes the inode cache writeout to preserve any error values and
makes sure not to override the root when inode cache writeout is done.

Reported-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Chris Mason <clm@fb.com>
  • Loading branch information
Chris Mason committed Apr 24, 2015
1 parent e082f56 commit 85db36c
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions fs/btrfs/free-space-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1149,7 +1149,8 @@ int btrfs_wait_cache_io(struct btrfs_root *root,
if (!inode)
return 0;

root = root->fs_info->tree_root;
if (block_group)
root = root->fs_info->tree_root;

/* Flush the dirty pages in the cache file. */
ret = flush_dirty_cache(inode);
Expand Down Expand Up @@ -3463,9 +3464,12 @@ int btrfs_write_out_ino_cache(struct btrfs_root *root,
if (!btrfs_test_opt(root, INODE_MAP_CACHE))
return 0;

memset(&io_ctl, 0, sizeof(io_ctl));
ret = __btrfs_write_out_cache(root, inode, ctl, NULL, &io_ctl,
trans, path, 0) ||
btrfs_wait_cache_io(root, trans, NULL, &io_ctl, path, 0);
trans, path, 0);
if (!ret)
ret = btrfs_wait_cache_io(root, trans, NULL, &io_ctl, path, 0);

if (ret) {
btrfs_delalloc_release_metadata(inode, inode->i_size);
#ifdef DEBUG
Expand Down

0 comments on commit 85db36c

Please sign in to comment.