aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ordered-data.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-10-25 16:13:35 -0400
committerChris Mason <chris.mason@fusionio.com>2013-11-11 22:07:35 -0500
commit0ef8b726075aa6931ddf1c16f5bae043eef184f9 (patch)
tree61c819e8541c69043a5d74182ac0f8d0060207e7 /fs/btrfs/ordered-data.c
parented2590953bd06b892f0411fc94e19175d32f197a (diff)
Btrfs: return an error from btrfs_wait_ordered_range
I noticed that if the free space cache has an error writing out it's data it won't actually error out, it will just carry on. This is because it doesn't check the return value of btrfs_wait_ordered_range, which didn't actually return anything. So fix this in order to keep us from making free space cache look valid when it really isnt. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/ordered-data.c')
-rw-r--r--fs/btrfs/ordered-data.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
index 1a36a0c3ee27..bbb1a3864686 100644
--- a/fs/btrfs/ordered-data.c
+++ b/fs/btrfs/ordered-data.c
@@ -734,8 +734,9 @@ void btrfs_start_ordered_extent(struct inode *inode,
734/* 734/*
735 * Used to wait on ordered extents across a large range of bytes. 735 * Used to wait on ordered extents across a large range of bytes.
736 */ 736 */
737void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) 737int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len)
738{ 738{
739 int ret = 0;
739 u64 end; 740 u64 end;
740 u64 orig_end; 741 u64 orig_end;
741 struct btrfs_ordered_extent *ordered; 742 struct btrfs_ordered_extent *ordered;
@@ -751,8 +752,9 @@ void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len)
751 /* start IO across the range first to instantiate any delalloc 752 /* start IO across the range first to instantiate any delalloc
752 * extents 753 * extents
753 */ 754 */
754 filemap_fdatawrite_range(inode->i_mapping, start, orig_end); 755 ret = filemap_fdatawrite_range(inode->i_mapping, start, orig_end);
755 756 if (ret)
757 return ret;
756 /* 758 /*
757 * So with compression we will find and lock a dirty page and clear the 759 * So with compression we will find and lock a dirty page and clear the
758 * first one as dirty, setup an async extent, and immediately return 760 * first one as dirty, setup an async extent, and immediately return
@@ -768,10 +770,15 @@ void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len)
768 * right and you are wrong. 770 * right and you are wrong.
769 */ 771 */
770 if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT, 772 if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
771 &BTRFS_I(inode)->runtime_flags)) 773 &BTRFS_I(inode)->runtime_flags)) {
772 filemap_fdatawrite_range(inode->i_mapping, start, orig_end); 774 ret = filemap_fdatawrite_range(inode->i_mapping, start,
773 775 orig_end);
774 filemap_fdatawait_range(inode->i_mapping, start, orig_end); 776 if (ret)
777 return ret;
778 }
779 ret = filemap_fdatawait_range(inode->i_mapping, start, orig_end);
780 if (ret)
781 return ret;
775 782
776 end = orig_end; 783 end = orig_end;
777 while (1) { 784 while (1) {
@@ -788,11 +795,14 @@ void btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len)
788 } 795 }
789 btrfs_start_ordered_extent(inode, ordered, 1); 796 btrfs_start_ordered_extent(inode, ordered, 1);
790 end = ordered->file_offset; 797 end = ordered->file_offset;
798 if (test_bit(BTRFS_ORDERED_IOERR, &ordered->flags))
799 ret = -EIO;
791 btrfs_put_ordered_extent(ordered); 800 btrfs_put_ordered_extent(ordered);
792 if (end == 0 || end == start) 801 if (ret || end == 0 || end == start)
793 break; 802 break;
794 end--; 803 end--;
795 } 804 }
805 return ret;
796} 806}
797 807
798/* 808/*