Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion block/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,9 +301,12 @@ EXPORT_SYMBOL(bio_init);
*/
void bio_reset(struct bio *bio, struct block_device *bdev, blk_opf_t opf)
{
struct bio_vec *bv = bio->bi_io_vec;

bio_uninit(bio);
memset(bio, 0, BIO_RESET_BYTES);
atomic_set(&bio->__bi_remaining, 1);
bio->bi_io_vec = bv;
bio->bi_bdev = bdev;
if (bio->bi_bdev)
bio_associate_blkg(bio);
Expand Down Expand Up @@ -1162,8 +1165,8 @@ void bio_iov_bvec_set(struct bio *bio, const struct iov_iter *iter)
{
WARN_ON_ONCE(bio->bi_max_vecs);

bio->bi_vcnt = iter->nr_segs;
bio->bi_io_vec = (struct bio_vec *)iter->bvec;
bio->bi_iter.bi_idx = 0;
bio->bi_iter.bi_bvec_done = iter->iov_offset;
bio->bi_iter.bi_size = iov_iter_count(iter);
bio_set_flag(bio, BIO_CLONED);
Expand Down
12 changes: 9 additions & 3 deletions block/blk.h
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,18 @@ struct bio *bio_split_zone_append(struct bio *bio,
static inline bool bio_may_need_split(struct bio *bio,
const struct queue_limits *lim)
{
const struct bio_vec *bv;

if (lim->chunk_sectors)
return true;
if (bio->bi_vcnt != 1)

if (!bio->bi_io_vec)
return true;

bv = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter);
if (bio->bi_iter.bi_size > bv->bv_len)
return true;
return bio->bi_io_vec->bv_len + bio->bi_io_vec->bv_offset >
lim->max_fast_segment_size;
return bv->bv_len + bv->bv_offset > lim->max_fast_segment_size;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions include/linux/blk_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,8 @@ struct bio {

atomic_t __bi_remaining;

/* The actual vec list, preserved by bio_reset() */
struct bio_vec *bi_io_vec;
struct bvec_iter bi_iter;

union {
Expand Down Expand Up @@ -275,8 +277,6 @@ struct bio {

atomic_t __bi_cnt; /* pin count */

struct bio_vec *bi_io_vec; /* the actual vec list */

struct bio_set *bi_pool;
};

Expand Down
11 changes: 0 additions & 11 deletions io_uring/rsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1055,17 +1055,6 @@ static int io_import_kbuf(int ddir, struct iov_iter *iter,

iov_iter_bvec(iter, ddir, imu->bvec, imu->nr_bvecs, count);
iov_iter_advance(iter, offset);

if (count < imu->len) {
const struct bio_vec *bvec = iter->bvec;

len += iter->iov_offset;
while (len > bvec->bv_len) {
len -= bvec->bv_len;
bvec++;
}
iter->nr_segs = 1 + bvec - iter->bvec;
}
return 0;
}

Expand Down