aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolay Borisov <nborisov@suse.com>2017-02-20 06:50:56 -0500
committerDavid Sterba <dsterba@suse.com>2017-02-28 05:30:10 -0500
commitb30cb441fcf8786773dab590739ca4ebc2b4628b (patch)
tree6a5f4728e77305e25db3e6b22e7c448c4896206c
parent9d4f7f8ad69112137da0bbe4036b94739ae25f78 (diff)
btrfs: make clean_io_failure take btrfs_inode
Signed-off-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/extent_io.c21
-rw-r--r--fs/btrfs/extent_io.h4
-rw-r--r--fs/btrfs/inode.c4
3 files changed, 15 insertions, 14 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index e99e8dad3cc7..b08fa96678ee 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2090,23 +2090,23 @@ int repair_eb_io_failure(struct btrfs_fs_info *fs_info,
2090 * each time an IO finishes, we do a fast check in the IO failure tree 2090 * each time an IO finishes, we do a fast check in the IO failure tree
2091 * to see if we need to process or clean up an io_failure_record 2091 * to see if we need to process or clean up an io_failure_record
2092 */ 2092 */
2093int clean_io_failure(struct inode *inode, u64 start, struct page *page, 2093int clean_io_failure(struct btrfs_inode *inode, u64 start, struct page *page,
2094 unsigned int pg_offset) 2094 unsigned int pg_offset)
2095{ 2095{
2096 u64 private; 2096 u64 private;
2097 struct io_failure_record *failrec; 2097 struct io_failure_record *failrec;
2098 struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; 2098 struct btrfs_fs_info *fs_info = inode->root->fs_info;
2099 struct extent_state *state; 2099 struct extent_state *state;
2100 int num_copies; 2100 int num_copies;
2101 int ret; 2101 int ret;
2102 2102
2103 private = 0; 2103 private = 0;
2104 ret = count_range_bits(&BTRFS_I(inode)->io_failure_tree, &private, 2104 ret = count_range_bits(&inode->io_failure_tree, &private,
2105 (u64)-1, 1, EXTENT_DIRTY, 0); 2105 (u64)-1, 1, EXTENT_DIRTY, 0);
2106 if (!ret) 2106 if (!ret)
2107 return 0; 2107 return 0;
2108 2108
2109 ret = get_state_failrec(&BTRFS_I(inode)->io_failure_tree, start, 2109 ret = get_state_failrec(&inode->io_failure_tree, start,
2110 &failrec); 2110 &failrec);
2111 if (ret) 2111 if (ret)
2112 return 0; 2112 return 0;
@@ -2123,25 +2123,25 @@ int clean_io_failure(struct inode *inode, u64 start, struct page *page,
2123 if (fs_info->sb->s_flags & MS_RDONLY) 2123 if (fs_info->sb->s_flags & MS_RDONLY)
2124 goto out; 2124 goto out;
2125 2125
2126 spin_lock(&BTRFS_I(inode)->io_tree.lock); 2126 spin_lock(&inode->io_tree.lock);
2127 state = find_first_extent_bit_state(&BTRFS_I(inode)->io_tree, 2127 state = find_first_extent_bit_state(&inode->io_tree,
2128 failrec->start, 2128 failrec->start,
2129 EXTENT_LOCKED); 2129 EXTENT_LOCKED);
2130 spin_unlock(&BTRFS_I(inode)->io_tree.lock); 2130 spin_unlock(&inode->io_tree.lock);
2131 2131
2132 if (state && state->start <= failrec->start && 2132 if (state && state->start <= failrec->start &&
2133 state->end >= failrec->start + failrec->len - 1) { 2133 state->end >= failrec->start + failrec->len - 1) {
2134 num_copies = btrfs_num_copies(fs_info, failrec->logical, 2134 num_copies = btrfs_num_copies(fs_info, failrec->logical,
2135 failrec->len); 2135 failrec->len);
2136 if (num_copies > 1) { 2136 if (num_copies > 1) {
2137 repair_io_failure(BTRFS_I(inode), start, failrec->len, 2137 repair_io_failure(inode, start, failrec->len,
2138 failrec->logical, page, 2138 failrec->logical, page,
2139 pg_offset, failrec->failed_mirror); 2139 pg_offset, failrec->failed_mirror);
2140 } 2140 }
2141 } 2141 }
2142 2142
2143out: 2143out:
2144 free_io_failure(BTRFS_I(inode), failrec); 2144 free_io_failure(inode, failrec);
2145 2145
2146 return 0; 2146 return 0;
2147} 2147}
@@ -2577,7 +2577,8 @@ static void end_bio_extent_readpage(struct bio *bio)
2577 if (ret) 2577 if (ret)
2578 uptodate = 0; 2578 uptodate = 0;
2579 else 2579 else
2580 clean_io_failure(inode, start, page, 0); 2580 clean_io_failure(BTRFS_I(inode), start,
2581 page, 0);
2581 } 2582 }
2582 2583
2583 if (likely(uptodate)) 2584 if (likely(uptodate))
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 039a6daa392b..0f67222f4464 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -456,8 +456,8 @@ struct btrfs_inode;
456int repair_io_failure(struct btrfs_inode *inode, u64 start, u64 length, 456int repair_io_failure(struct btrfs_inode *inode, u64 start, u64 length,
457 u64 logical, struct page *page, 457 u64 logical, struct page *page,
458 unsigned int pg_offset, int mirror_num); 458 unsigned int pg_offset, int mirror_num);
459int clean_io_failure(struct inode *inode, u64 start, struct page *page, 459int clean_io_failure(struct btrfs_inode *inode, u64 start,
460 unsigned int pg_offset); 460 struct page *page, unsigned int pg_offset);
461void end_extent_writepage(struct page *page, int err, u64 start, u64 end); 461void end_extent_writepage(struct page *page, int err, u64 start, u64 end);
462int repair_eb_io_failure(struct btrfs_fs_info *fs_info, 462int repair_eb_io_failure(struct btrfs_fs_info *fs_info,
463 struct extent_buffer *eb, int mirror_num); 463 struct extent_buffer *eb, int mirror_num);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index fc00117a0dd0..4498921bb608 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -7914,7 +7914,7 @@ static void btrfs_retry_endio_nocsum(struct bio *bio)
7914 7914
7915 done->uptodate = 1; 7915 done->uptodate = 1;
7916 bio_for_each_segment_all(bvec, bio, i) 7916 bio_for_each_segment_all(bvec, bio, i)
7917 clean_io_failure(done->inode, done->start, bvec->bv_page, 0); 7917 clean_io_failure(BTRFS_I(done->inode), done->start, bvec->bv_page, 0);
7918end: 7918end:
7919 complete(&done->done); 7919 complete(&done->done);
7920 bio_put(bio); 7920 bio_put(bio);
@@ -8000,7 +8000,7 @@ static void btrfs_retry_endio(struct bio *bio)
8000 bvec->bv_page, bvec->bv_offset, 8000 bvec->bv_page, bvec->bv_offset,
8001 done->start, bvec->bv_len); 8001 done->start, bvec->bv_len);
8002 if (!ret) 8002 if (!ret)
8003 clean_io_failure(done->inode, done->start, 8003 clean_io_failure(BTRFS_I(done->inode), done->start,
8004 bvec->bv_page, bvec->bv_offset); 8004 bvec->bv_page, bvec->bv_offset);
8005 else 8005 else
8006 uptodate = 0; 8006 uptodate = 0;