diff options
author | Nikolay Borisov <nborisov@suse.com> | 2017-02-20 06:50:56 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2017-02-28 05:30:10 -0500 |
commit | b30cb441fcf8786773dab590739ca4ebc2b4628b (patch) | |
tree | 6a5f4728e77305e25db3e6b22e7c448c4896206c | |
parent | 9d4f7f8ad69112137da0bbe4036b94739ae25f78 (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.c | 21 | ||||
-rw-r--r-- | fs/btrfs/extent_io.h | 4 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 4 |
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 | */ |
2093 | int clean_io_failure(struct inode *inode, u64 start, struct page *page, | 2093 | int 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 | ||
2143 | out: | 2143 | out: |
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; | |||
456 | int repair_io_failure(struct btrfs_inode *inode, u64 start, u64 length, | 456 | int 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); |
459 | int clean_io_failure(struct inode *inode, u64 start, struct page *page, | 459 | int clean_io_failure(struct btrfs_inode *inode, u64 start, |
460 | unsigned int pg_offset); | 460 | struct page *page, unsigned int pg_offset); |
461 | void end_extent_writepage(struct page *page, int err, u64 start, u64 end); | 461 | void end_extent_writepage(struct page *page, int err, u64 start, u64 end); |
462 | int repair_eb_io_failure(struct btrfs_fs_info *fs_info, | 462 | int 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); |
7918 | end: | 7918 | end: |
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; |