]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
nvmet-fc: use zero-sized array and struct_size() in kzalloc()
authorGustavo A. R. Silva <gustavo@embeddedor.com>
Sat, 23 Feb 2019 18:51:08 +0000 (12:51 -0600)
committerChristoph Hellwig <hch@lst.de>
Fri, 5 Apr 2019 06:07:57 +0000 (08:07 +0200)
Update the code to use a zero-sized array instead of a pointer in
structure nvmet_fc_tgt_queue and use struct_size() in kzalloc().

Notice that one of the more common cases of allocation size calculations
is finding the size of a structure that has a zero-sized array at the end,
along with memory for some number of elements for that array. For example:

struct foo {
int stuff;
struct boo entry[];
};

instance = kzalloc(sizeof(struct foo) + sizeof(struct boo) * count, GFP_KERNEL);

Instead of leaving these open-coded and prone to type mistakes, we can now
use the new struct_size() helper:

instance = kzalloc(struct_size(instance, entry, count), GFP_KERNEL);

This code was detected with the help of Coccinelle.

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Reviewed-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/fc.c

index 98b7b1f4ee96aae168f494c7808d50582fa77eb0..9369a11fe7a9025310d9eb2886f40b040a51097b 100644 (file)
@@ -128,12 +128,12 @@ struct nvmet_fc_tgt_queue {
        struct nvmet_cq                 nvme_cq;
        struct nvmet_sq                 nvme_sq;
        struct nvmet_fc_tgt_assoc       *assoc;
-       struct nvmet_fc_fcp_iod         *fod;           /* array of fcp_iods */
        struct list_head                fod_list;
        struct list_head                pending_cmd_list;
        struct list_head                avail_defer_list;
        struct workqueue_struct         *work_q;
        struct kref                     ref;
+       struct nvmet_fc_fcp_iod         fod[];          /* array of fcp_iods */
 } __aligned(sizeof(unsigned long long));
 
 struct nvmet_fc_tgt_assoc {
@@ -588,9 +588,7 @@ nvmet_fc_alloc_target_queue(struct nvmet_fc_tgt_assoc *assoc,
        if (qid > NVMET_NR_QUEUES)
                return NULL;
 
-       queue = kzalloc((sizeof(*queue) +
-                               (sizeof(struct nvmet_fc_fcp_iod) * sqsize)),
-                               GFP_KERNEL);
+       queue = kzalloc(struct_size(queue, fod, sqsize), GFP_KERNEL);
        if (!queue)
                return NULL;
 
@@ -603,7 +601,6 @@ nvmet_fc_alloc_target_queue(struct nvmet_fc_tgt_assoc *assoc,
        if (!queue->work_q)
                goto out_a_put;
 
-       queue->fod = (struct nvmet_fc_fcp_iod *)&queue[1];
        queue->qid = qid;
        queue->sqsize = sqsize;
        queue->assoc = assoc;