mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
btrfs: pass a physical address to btrfs_repair_io_failure()
Using physical address has the following advantages: - All involved callers only need a single pointer Instead of the old @folio + @offset pair. - No complex poking into the bio_vec structure As a bio_vec can be single or multiple paged, grabbing the real page can be quite complex if the bio_vec is a multi-page one. Instead bvec_phys() will always give a single physical address, and it cab be easily converted to a page. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
f6b2d8b134
commit
3240b2c97b
|
|
@ -192,7 +192,7 @@ static void btrfs_end_repair_bio(struct btrfs_bio *repair_bbio,
|
|||
btrfs_repair_io_failure(fs_info, btrfs_ino(inode),
|
||||
repair_bbio->file_offset, fs_info->sectorsize,
|
||||
repair_bbio->saved_iter.bi_sector << SECTOR_SHIFT,
|
||||
page_folio(bv->bv_page), bv->bv_offset, mirror);
|
||||
bvec_phys(bv), mirror);
|
||||
} while (mirror != fbio->bbio->mirror_num);
|
||||
|
||||
done:
|
||||
|
|
@ -803,8 +803,7 @@ void btrfs_submit_bbio(struct btrfs_bio *bbio, int mirror_num)
|
|||
* freeing the bio.
|
||||
*/
|
||||
int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
|
||||
u64 length, u64 logical, struct folio *folio,
|
||||
unsigned int folio_offset, int mirror_num)
|
||||
u64 length, u64 logical, phys_addr_t paddr, int mirror_num)
|
||||
{
|
||||
struct btrfs_io_stripe smap = { 0 };
|
||||
struct bio_vec bvec;
|
||||
|
|
@ -835,8 +834,7 @@ int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
|
|||
|
||||
bio_init(&bio, smap.dev->bdev, &bvec, 1, REQ_OP_WRITE | REQ_SYNC);
|
||||
bio.bi_iter.bi_sector = smap.physical >> SECTOR_SHIFT;
|
||||
ret = bio_add_folio(&bio, folio, length, folio_offset);
|
||||
ASSERT(ret);
|
||||
__bio_add_page(&bio, phys_to_page(paddr), length, offset_in_page(paddr));
|
||||
ret = submit_bio_wait(&bio);
|
||||
if (ret) {
|
||||
/* try to remap that extent elsewhere? */
|
||||
|
|
|
|||
|
|
@ -110,7 +110,6 @@ void btrfs_bio_end_io(struct btrfs_bio *bbio, blk_status_t status);
|
|||
void btrfs_submit_bbio(struct btrfs_bio *bbio, int mirror_num);
|
||||
void btrfs_submit_repair_write(struct btrfs_bio *bbio, int mirror_num, bool dev_replace);
|
||||
int btrfs_repair_io_failure(struct btrfs_fs_info *fs_info, u64 ino, u64 start,
|
||||
u64 length, u64 logical, struct folio *folio,
|
||||
unsigned int folio_offset, int mirror_num);
|
||||
u64 length, u64 logical, phys_addr_t paddr, int mirror_num);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -193,10 +193,11 @@ static int btrfs_repair_eb_io_failure(const struct extent_buffer *eb,
|
|||
u64 end = min_t(u64, eb->start + eb->len,
|
||||
folio_pos(folio) + eb->folio_size);
|
||||
u32 len = end - start;
|
||||
phys_addr_t paddr = PFN_PHYS(folio_pfn(folio)) +
|
||||
offset_in_folio(folio, start);
|
||||
|
||||
ret = btrfs_repair_io_failure(fs_info, 0, start, len,
|
||||
start, folio, offset_in_folio(folio, start),
|
||||
mirror_num);
|
||||
ret = btrfs_repair_io_failure(fs_info, 0, start, len, start,
|
||||
paddr, mirror_num);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user