]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nvme-pci: Use size_t for length fields to handle larger sizes
authorLeon Romanovsky <leonro@nvidia.com>
Wed, 17 Dec 2025 09:41:23 +0000 (11:41 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 6 Jan 2026 12:47:54 +0000 (05:47 -0700)
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>
block/blk-mq-dma.c
drivers/nvme/host/pci.c

index fb018fffffdcc5f411f1f287d718f0b114d179a7..a2bedc8f8666d540be2965f265a0f2f3f97c8746 100644 (file)
@@ -8,7 +8,7 @@
 
 struct phys_vec {
        phys_addr_t     paddr;
-       u32             len;
+       size_t          len;
 };
 
 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,
                struct phys_vec *vec)
 {
        enum dma_data_direction dir = rq_dma_dir(req);
-       unsigned int mapped = 0;
        unsigned int attrs = 0;
+       size_t mapped = 0;
        int error;
 
        iter->addr = state->addr;
@@ -297,6 +297,8 @@ int __blk_rq_map_sg(struct request *rq, struct scatterlist *sglist,
        blk_rq_map_iter_init(rq, &iter);
        while (blk_map_iter_next(rq, &iter, &vec)) {
                *last_sg = blk_next_sg(last_sg, sglist);
+
+               WARN_ON_ONCE(overflows_type(vec.len, unsigned int));
                sg_set_page(*last_sg, phys_to_page(vec.paddr), vec.len,
                                offset_in_page(vec.paddr));
                nsegs++;
@@ -417,6 +419,8 @@ int blk_rq_map_integrity_sg(struct request *rq, struct scatterlist *sglist)
 
        while (blk_map_iter_next(rq, &iter, &vec)) {
                sg = blk_next_sg(&sg, sglist);
+
+               WARN_ON_ONCE(overflows_type(vec.len, unsigned int));
                sg_set_page(sg, phys_to_page(vec.paddr), vec.len,
                                offset_in_page(vec.paddr));
                segments++;
index 0e4caeab739c7489292987e8023b86c5c153dff9..3b528369f54546f2c8f2d36cd3643433d2d13266 100644 (file)
@@ -290,14 +290,14 @@ struct nvme_iod {
        u8 flags;
        u8 nr_descriptors;
 
-       unsigned int total_len;
+       size_t total_len;
        struct dma_iova_state dma_state;
        void *descriptors[NVME_MAX_NR_DESCRIPTORS];
        struct nvme_dma_vec *dma_vecs;
        unsigned int nr_dma_vecs;
 
        dma_addr_t meta_dma;
-       unsigned int meta_total_len;
+       size_t meta_total_len;
        struct dma_iova_state meta_dma_state;
        struct nvme_sgl_desc *meta_descriptor;
 };