Skip to content

Commit 168145f

Browse files
Kent Overstreetaxboe
authored andcommitted
block: Allow bio_iov_iter_get_pages() with bio->bi_bdev unset
bio_iov_iter_get_pages() trims the IO based on the block size of the block device the IO will be issued to. However, bcachefs is a multi device filesystem; when we're creating the bio we don't yet know which block device the bio will be submitted to - we have to handle the alignment checks elsewhere. Thus this is needed to avoid a null ptr deref. Signed-off-by: Kent Overstreet <[email protected]> Cc: Jens Axboe <[email protected]> Cc: [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 7ba3792 commit 168145f

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

block/bio.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,7 +1231,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
12311231
struct page **pages = (struct page **)bv;
12321232
ssize_t size, left;
12331233
unsigned len, i = 0;
1234-
size_t offset, trim;
1234+
size_t offset;
12351235
int ret = 0;
12361236

12371237
/*
@@ -1260,10 +1260,12 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter)
12601260

12611261
nr_pages = DIV_ROUND_UP(offset + size, PAGE_SIZE);
12621262

1263-
trim = size & (bdev_logical_block_size(bio->bi_bdev) - 1);
1264-
iov_iter_revert(iter, trim);
1263+
if (bio->bi_bdev) {
1264+
size_t trim = size & (bdev_logical_block_size(bio->bi_bdev) - 1);
1265+
iov_iter_revert(iter, trim);
1266+
size -= trim;
1267+
}
12651268

1266-
size -= trim;
12671269
if (unlikely(!size)) {
12681270
ret = -EFAULT;
12691271
goto out;

0 commit comments

Comments
 (0)