nvmet-fc: use zero-sized array and struct_size() in kzalloc()
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>
This commit is contained in:
parent
cfe03c2ec4
commit
6b80f1d2cc
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue