Skip to content

Commit 073b9bf

Browse files
rleonaxboe
authored andcommitted
nvme-pci: Use size_t for length fields to handle larger sizes
This patch changes the length variables from unsigned int to size_t. Using size_t ensures that we can handle larger sizes, as size_t is always equal to or larger than the previously used u32 type. Originally, u32 was used because blk-mq-dma code evolved from scatter-gather implementation, which uses unsigned int to describe length. This change will also allow us to reuse the existing struct phys_vec in places that don't need scatter-gather. Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent f8f9c1f commit 073b9bf

2 files changed

Lines changed: 8 additions & 4 deletions

File tree

block/blk-mq-dma.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
struct phys_vec {
1010
phys_addr_t paddr;
11-
u32 len;
11+
size_t len;
1212
};
1313

1414
static bool __blk_map_iter_next(struct blk_map_iter *iter)
@@ -112,8 +112,8 @@ static bool blk_rq_dma_map_iova(struct request *req, struct device *dma_dev,
112112
struct phys_vec *vec)
113113
{
114114
enum dma_data_direction dir = rq_dma_dir(req);
115-
unsigned int mapped = 0;
116115
unsigned int attrs = 0;
116+
size_t mapped = 0;
117117
int error;
118118

119119
iter->addr = state->addr;
@@ -297,6 +297,8 @@ int __blk_rq_map_sg(struct request *rq, struct scatterlist *sglist,
297297
blk_rq_map_iter_init(rq, &iter);
298298
while (blk_map_iter_next(rq, &iter, &vec)) {
299299
*last_sg = blk_next_sg(last_sg, sglist);
300+
301+
WARN_ON_ONCE(overflows_type(vec.len, unsigned int));
300302
sg_set_page(*last_sg, phys_to_page(vec.paddr), vec.len,
301303
offset_in_page(vec.paddr));
302304
nsegs++;
@@ -417,6 +419,8 @@ int blk_rq_map_integrity_sg(struct request *rq, struct scatterlist *sglist)
417419

418420
while (blk_map_iter_next(rq, &iter, &vec)) {
419421
sg = blk_next_sg(&sg, sglist);
422+
423+
WARN_ON_ONCE(overflows_type(vec.len, unsigned int));
420424
sg_set_page(sg, phys_to_page(vec.paddr), vec.len,
421425
offset_in_page(vec.paddr));
422426
segments++;

drivers/nvme/host/pci.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,14 +290,14 @@ struct nvme_iod {
290290
u8 flags;
291291
u8 nr_descriptors;
292292

293-
unsigned int total_len;
293+
size_t total_len;
294294
struct dma_iova_state dma_state;
295295
void *descriptors[NVME_MAX_NR_DESCRIPTORS];
296296
struct nvme_dma_vec *dma_vecs;
297297
unsigned int nr_dma_vecs;
298298

299299
dma_addr_t meta_dma;
300-
unsigned int meta_total_len;
300+
size_t meta_total_len;
301301
struct dma_iova_state meta_dma_state;
302302
struct nvme_sgl_desc *meta_descriptor;
303303
};

0 commit comments

Comments
 (0)