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 = kmalloc(sizeof(struct foo) + count * sizeof(struct boo), GFP_KERNEL);

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

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

Signed-off-by: xiaolinkui <xiaolin...@kylinos.cn>
---
 block/bio.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 683cbb4..847ac60 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -436,9 +436,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int 
nr_iovecs,
                if (nr_iovecs > UIO_MAXIOV)
                        return NULL;
 
-               p = kmalloc(sizeof(struct bio) +
-                           nr_iovecs * sizeof(struct bio_vec),
-                           gfp_mask);
+               p = kmalloc(struct_size(bio, bi_io_vec, nr_iovecs), gfp_mask);
                front_pad = 0;
                inline_vecs = nr_iovecs;
        } else {
@@ -1120,8 +1118,7 @@ static struct bio_map_data *bio_alloc_map_data(struct 
iov_iter *data,
        if (data->nr_segs > UIO_MAXIOV)
                return NULL;
 
-       bmd = kmalloc(sizeof(struct bio_map_data) +
-                      sizeof(struct iovec) * data->nr_segs, gfp_mask);
+       bmd = kmalloc(struct_size(bmd, iov, data->nr_segs), gfp_mask);
        if (!bmd)
                return NULL;
        memcpy(bmd->iov, data->iov, sizeof(struct iovec) * data->nr_segs);
-- 
2.7.4



Reply via email to