Skip to content

Commit

Permalink
bio: add a helper calculating nr segments to alloc
Browse files Browse the repository at this point in the history
Add a helper function calculating the number of bvec segments we need to
allocate to construct a bio. It doesn't change anything functionally,
but will be used to not duplicate special cases in the future.

Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Pavel Begunkov <[email protected]>
Reviewed-by: Ming Lei <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
isilence authored and axboe committed Jan 25, 2021
1 parent 54c8195 commit 3e1a88e
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 8 deletions.
7 changes: 4 additions & 3 deletions fs/block_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
dio->size += bio->bi_iter.bi_size;
pos += bio->bi_iter.bi_size;

nr_pages = iov_iter_npages(iter, BIO_MAX_PAGES);
nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_PAGES);
if (!nr_pages) {
bool polled = false;

Expand Down Expand Up @@ -481,9 +481,10 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
{
int nr_pages;

nr_pages = iov_iter_npages(iter, BIO_MAX_PAGES + 1);
if (!nr_pages)
if (!iov_iter_count(iter))
return 0;

nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_PAGES + 1);
if (is_sync_kiocb(iocb) && nr_pages <= BIO_MAX_PAGES)
return __blkdev_direct_IO_simple(iocb, iter, nr_pages);

Expand Down
9 changes: 4 additions & 5 deletions fs/iomap/direct-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,11 +250,8 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
orig_count = iov_iter_count(dio->submit.iter);
iov_iter_truncate(dio->submit.iter, length);

nr_pages = iov_iter_npages(dio->submit.iter, BIO_MAX_PAGES);
if (nr_pages <= 0) {
ret = nr_pages;
if (!iov_iter_count(dio->submit.iter))
goto out;
}

if (need_zeroout) {
/* zero out from the start of the block to the write offset */
Expand All @@ -263,6 +260,7 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
iomap_dio_zero(dio, iomap, pos - pad, pad);
}

nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter, BIO_MAX_PAGES);
do {
size_t n;
if (dio->error) {
Expand Down Expand Up @@ -308,7 +306,8 @@ iomap_dio_bio_actor(struct inode *inode, loff_t pos, loff_t length,
dio->size += n;
copied += n;

nr_pages = iov_iter_npages(dio->submit.iter, BIO_MAX_PAGES);
nr_pages = bio_iov_vecs_to_alloc(dio->submit.iter,
BIO_MAX_PAGES);
iomap_dio_submit_bio(dio, iomap, bio, pos);
pos += n;
} while (nr_pages);
Expand Down
10 changes: 10 additions & 0 deletions include/linux/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <linux/ioprio.h>
/* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */
#include <linux/blk_types.h>
#include <linux/uio.h>

#define BIO_DEBUG

Expand Down Expand Up @@ -441,6 +442,15 @@ static inline void bio_wouldblock_error(struct bio *bio)
bio_endio(bio);
}

/*
* Calculate number of bvec segments that should be allocated to fit data
* pointed by @iter.
*/
static inline int bio_iov_vecs_to_alloc(struct iov_iter *iter, int max_segs)
{
return iov_iter_npages(iter, max_segs);
}

struct request_queue;

extern int submit_bio_wait(struct bio *bio);
Expand Down

0 comments on commit 3e1a88e

Please sign in to comment.