diff options
-rw-r--r-- | fs/btrfs/extent_io.c | 5 | ||||
-rw-r--r-- | fs/btrfs/extent_io.h | 1 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 3 |
3 files changed, 8 insertions, 1 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index bf3f424e0013..420fe26d32d5 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -1746,6 +1746,9 @@ int extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, | |||
1746 | if (page_ops == 0) | 1746 | if (page_ops == 0) |
1747 | return 0; | 1747 | return 0; |
1748 | 1748 | ||
1749 | if ((page_ops & PAGE_SET_ERROR) && nr_pages > 0) | ||
1750 | mapping_set_error(inode->i_mapping, -EIO); | ||
1751 | |||
1749 | while (nr_pages > 0) { | 1752 | while (nr_pages > 0) { |
1750 | ret = find_get_pages_contig(inode->i_mapping, index, | 1753 | ret = find_get_pages_contig(inode->i_mapping, index, |
1751 | min_t(unsigned long, | 1754 | min_t(unsigned long, |
@@ -1763,6 +1766,8 @@ int extent_clear_unlock_delalloc(struct inode *inode, u64 start, u64 end, | |||
1763 | clear_page_dirty_for_io(pages[i]); | 1766 | clear_page_dirty_for_io(pages[i]); |
1764 | if (page_ops & PAGE_SET_WRITEBACK) | 1767 | if (page_ops & PAGE_SET_WRITEBACK) |
1765 | set_page_writeback(pages[i]); | 1768 | set_page_writeback(pages[i]); |
1769 | if (page_ops & PAGE_SET_ERROR) | ||
1770 | SetPageError(pages[i]); | ||
1766 | if (page_ops & PAGE_END_WRITEBACK) | 1771 | if (page_ops & PAGE_END_WRITEBACK) |
1767 | end_page_writeback(pages[i]); | 1772 | end_page_writeback(pages[i]); |
1768 | if (page_ops & PAGE_UNLOCK) | 1773 | if (page_ops & PAGE_UNLOCK) |
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 6d4b938be986..ece9ce87edff 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h | |||
@@ -49,6 +49,7 @@ | |||
49 | #define PAGE_SET_WRITEBACK (1 << 2) | 49 | #define PAGE_SET_WRITEBACK (1 << 2) |
50 | #define PAGE_END_WRITEBACK (1 << 3) | 50 | #define PAGE_END_WRITEBACK (1 << 3) |
51 | #define PAGE_SET_PRIVATE2 (1 << 4) | 51 | #define PAGE_SET_PRIVATE2 (1 << 4) |
52 | #define PAGE_SET_ERROR (1 << 5) | ||
52 | 53 | ||
53 | /* | 54 | /* |
54 | * page->private values. Every page that is controlled by the extent | 55 | * page->private values. Every page that is controlled by the extent |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d23362f4464e..fcb9a38fc9d3 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -832,7 +832,8 @@ out_free: | |||
832 | NULL, EXTENT_LOCKED | EXTENT_DELALLOC | | 832 | NULL, EXTENT_LOCKED | EXTENT_DELALLOC | |
833 | EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING, | 833 | EXTENT_DEFRAG | EXTENT_DO_ACCOUNTING, |
834 | PAGE_UNLOCK | PAGE_CLEAR_DIRTY | | 834 | PAGE_UNLOCK | PAGE_CLEAR_DIRTY | |
835 | PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK); | 835 | PAGE_SET_WRITEBACK | PAGE_END_WRITEBACK | |
836 | PAGE_SET_ERROR); | ||
836 | kfree(async_extent); | 837 | kfree(async_extent); |
837 | goto again; | 838 | goto again; |
838 | } | 839 | } |