mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
btrfs: store a pointer to a btrfs_bio in struct btrfs_bio_ctrl
The bio in struct btrfs_bio_ctrl must be a btrfs_bio, so store a pointer to the btrfs_bio for better type checking. Reviewed-by: Anand Jain <anand.jain@oracle.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
d733ea012d
commit
9dfde1b47b
@ -97,7 +97,7 @@ void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info)
|
|||||||
* how many bytes are there before stripe/ordered extent boundary.
|
* how many bytes are there before stripe/ordered extent boundary.
|
||||||
*/
|
*/
|
||||||
struct btrfs_bio_ctrl {
|
struct btrfs_bio_ctrl {
|
||||||
struct bio *bio;
|
struct btrfs_bio *bbio;
|
||||||
int mirror_num;
|
int mirror_num;
|
||||||
enum btrfs_compression_type compress_type;
|
enum btrfs_compression_type compress_type;
|
||||||
u32 len_to_oe_boundary;
|
u32 len_to_oe_boundary;
|
||||||
@ -123,37 +123,37 @@ struct btrfs_bio_ctrl {
|
|||||||
|
|
||||||
static void submit_one_bio(struct btrfs_bio_ctrl *bio_ctrl)
|
static void submit_one_bio(struct btrfs_bio_ctrl *bio_ctrl)
|
||||||
{
|
{
|
||||||
struct bio *bio = bio_ctrl->bio;
|
struct btrfs_bio *bbio = bio_ctrl->bbio;
|
||||||
int mirror_num = bio_ctrl->mirror_num;
|
int mirror_num = bio_ctrl->mirror_num;
|
||||||
|
|
||||||
if (!bio)
|
if (!bbio)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Caller should ensure the bio has at least some range added */
|
/* Caller should ensure the bio has at least some range added */
|
||||||
ASSERT(bio->bi_iter.bi_size);
|
ASSERT(bbio->bio.bi_iter.bi_size);
|
||||||
|
|
||||||
if (!is_data_inode(&btrfs_bio(bio)->inode->vfs_inode)) {
|
if (!is_data_inode(&bbio->inode->vfs_inode)) {
|
||||||
if (btrfs_op(bio) != BTRFS_MAP_WRITE) {
|
if (btrfs_op(&bbio->bio) != BTRFS_MAP_WRITE) {
|
||||||
/*
|
/*
|
||||||
* For metadata read, we should have the parent_check,
|
* For metadata read, we should have the parent_check,
|
||||||
* and copy it to bbio for metadata verification.
|
* and copy it to bbio for metadata verification.
|
||||||
*/
|
*/
|
||||||
ASSERT(bio_ctrl->parent_check);
|
ASSERT(bio_ctrl->parent_check);
|
||||||
memcpy(&btrfs_bio(bio)->parent_check,
|
memcpy(&bbio->parent_check,
|
||||||
bio_ctrl->parent_check,
|
bio_ctrl->parent_check,
|
||||||
sizeof(struct btrfs_tree_parent_check));
|
sizeof(struct btrfs_tree_parent_check));
|
||||||
}
|
}
|
||||||
bio->bi_opf |= REQ_META;
|
bbio->bio.bi_opf |= REQ_META;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (btrfs_op(bio) == BTRFS_MAP_READ &&
|
if (btrfs_op(&bbio->bio) == BTRFS_MAP_READ &&
|
||||||
bio_ctrl->compress_type != BTRFS_COMPRESS_NONE)
|
bio_ctrl->compress_type != BTRFS_COMPRESS_NONE)
|
||||||
btrfs_submit_compressed_read(btrfs_bio(bio), mirror_num);
|
btrfs_submit_compressed_read(bbio, mirror_num);
|
||||||
else
|
else
|
||||||
btrfs_submit_bio(btrfs_bio(bio), mirror_num);
|
btrfs_submit_bio(bbio, mirror_num);
|
||||||
|
|
||||||
/* The bio is owned by the end_io handler now */
|
/* The bbio is owned by the end_io handler now */
|
||||||
bio_ctrl->bio = NULL;
|
bio_ctrl->bbio = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -161,16 +161,16 @@ static void submit_one_bio(struct btrfs_bio_ctrl *bio_ctrl)
|
|||||||
*/
|
*/
|
||||||
static void submit_write_bio(struct btrfs_bio_ctrl *bio_ctrl, int ret)
|
static void submit_write_bio(struct btrfs_bio_ctrl *bio_ctrl, int ret)
|
||||||
{
|
{
|
||||||
struct bio *bio = bio_ctrl->bio;
|
struct btrfs_bio *bbio = bio_ctrl->bbio;
|
||||||
|
|
||||||
if (!bio)
|
if (!bbio)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ASSERT(ret < 0);
|
ASSERT(ret < 0);
|
||||||
btrfs_bio_end_io(btrfs_bio(bio), errno_to_blk_status(ret));
|
btrfs_bio_end_io(bbio, errno_to_blk_status(ret));
|
||||||
/* The bio is owned by the end_io handler now */
|
/* The bio is owned by the end_io handler now */
|
||||||
bio_ctrl->bio = NULL;
|
bio_ctrl->bbio = NULL;
|
||||||
} else {
|
} else {
|
||||||
submit_one_bio(bio_ctrl);
|
submit_one_bio(bio_ctrl);
|
||||||
}
|
}
|
||||||
@ -863,7 +863,7 @@ static bool btrfs_bio_is_contig(struct btrfs_bio_ctrl *bio_ctrl,
|
|||||||
struct page *page, u64 disk_bytenr,
|
struct page *page, u64 disk_bytenr,
|
||||||
unsigned int pg_offset)
|
unsigned int pg_offset)
|
||||||
{
|
{
|
||||||
struct bio *bio = bio_ctrl->bio;
|
struct bio *bio = &bio_ctrl->bbio->bio;
|
||||||
struct bio_vec *bvec = bio_last_bvec_all(bio);
|
struct bio_vec *bvec = bio_last_bvec_all(bio);
|
||||||
const sector_t sector = disk_bytenr >> SECTOR_SHIFT;
|
const sector_t sector = disk_bytenr >> SECTOR_SHIFT;
|
||||||
|
|
||||||
@ -902,7 +902,7 @@ static void alloc_new_bio(struct btrfs_inode *inode,
|
|||||||
bio_ctrl->end_io_func, NULL);
|
bio_ctrl->end_io_func, NULL);
|
||||||
bio->bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
|
bio->bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
|
||||||
btrfs_bio(bio)->file_offset = file_offset;
|
btrfs_bio(bio)->file_offset = file_offset;
|
||||||
bio_ctrl->bio = bio;
|
bio_ctrl->bbio = btrfs_bio(bio);
|
||||||
bio_ctrl->len_to_oe_boundary = U32_MAX;
|
bio_ctrl->len_to_oe_boundary = U32_MAX;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -942,8 +942,8 @@ static void alloc_new_bio(struct btrfs_inode *inode,
|
|||||||
* @pg_offset: offset of the new bio or to check whether we are adding
|
* @pg_offset: offset of the new bio or to check whether we are adding
|
||||||
* a contiguous page to the previous one
|
* a contiguous page to the previous one
|
||||||
*
|
*
|
||||||
* The will either add the page into the existing @bio_ctrl->bio, or allocate a
|
* The will either add the page into the existing @bio_ctrl->bbio, or allocate a
|
||||||
* new one in @bio_ctrl->bio.
|
* new one in @bio_ctrl->bbio.
|
||||||
* The mirror number for this IO should already be initizlied in
|
* The mirror number for this IO should already be initizlied in
|
||||||
* @bio_ctrl->mirror_num.
|
* @bio_ctrl->mirror_num.
|
||||||
*/
|
*/
|
||||||
@ -956,7 +956,7 @@ static void submit_extent_page(struct btrfs_bio_ctrl *bio_ctrl,
|
|||||||
ASSERT(pg_offset + size <= PAGE_SIZE);
|
ASSERT(pg_offset + size <= PAGE_SIZE);
|
||||||
ASSERT(bio_ctrl->end_io_func);
|
ASSERT(bio_ctrl->end_io_func);
|
||||||
|
|
||||||
if (bio_ctrl->bio &&
|
if (bio_ctrl->bbio &&
|
||||||
!btrfs_bio_is_contig(bio_ctrl, page, disk_bytenr, pg_offset))
|
!btrfs_bio_is_contig(bio_ctrl, page, disk_bytenr, pg_offset))
|
||||||
submit_one_bio(bio_ctrl);
|
submit_one_bio(bio_ctrl);
|
||||||
|
|
||||||
@ -964,7 +964,7 @@ static void submit_extent_page(struct btrfs_bio_ctrl *bio_ctrl,
|
|||||||
u32 len = size;
|
u32 len = size;
|
||||||
|
|
||||||
/* Allocate new bio if needed */
|
/* Allocate new bio if needed */
|
||||||
if (!bio_ctrl->bio) {
|
if (!bio_ctrl->bbio) {
|
||||||
alloc_new_bio(inode, bio_ctrl, disk_bytenr,
|
alloc_new_bio(inode, bio_ctrl, disk_bytenr,
|
||||||
page_offset(page) + pg_offset);
|
page_offset(page) + pg_offset);
|
||||||
}
|
}
|
||||||
@ -976,7 +976,7 @@ static void submit_extent_page(struct btrfs_bio_ctrl *bio_ctrl,
|
|||||||
len = bio_ctrl->len_to_oe_boundary;
|
len = bio_ctrl->len_to_oe_boundary;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bio_add_page(bio_ctrl->bio, page, len, pg_offset) != len) {
|
if (bio_add_page(&bio_ctrl->bbio->bio, page, len, pg_offset) != len) {
|
||||||
/* bio full: move on to a new one */
|
/* bio full: move on to a new one */
|
||||||
submit_one_bio(bio_ctrl);
|
submit_one_bio(bio_ctrl);
|
||||||
continue;
|
continue;
|
||||||
|
Loading…
Reference in New Issue
Block a user