The function kvmalloc_node limits the allocation size to INT_MAX. This
limit will be overflowed if dm-writecache attempts to map a device with
1TiB or larger length. This commit changes kvmalloc_array to vmalloc_array
to avoid the limit.

The commit also changes vmalloc(array_size()) to vmalloc_array().

Signed-off-by: Mikulas Patocka <[email protected]>

---
 drivers/md/dm-writecache.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Index: linux-2.6/drivers/md/dm-writecache.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-writecache.c   2023-09-05 14:45:58.000000000 
+0200
+++ linux-2.6/drivers/md/dm-writecache.c        2024-01-08 22:22:22.000000000 
+0100
@@ -299,7 +299,7 @@ static int persistent_memory_claim(struc
                long i;
 
                wc->memory_map = NULL;
-               pages = kvmalloc_array(p, sizeof(struct page *), GFP_KERNEL);
+               pages = vmalloc_array(p, sizeof(struct page *));
                if (!pages) {
                        r = -ENOMEM;
                        goto err2;
@@ -330,7 +330,7 @@ static int persistent_memory_claim(struc
                        r = -ENOMEM;
                        goto err3;
                }
-               kvfree(pages);
+               vfree(pages);
                wc->memory_vmapped = true;
        }
 
@@ -341,7 +341,7 @@ static int persistent_memory_claim(struc
 
        return 0;
 err3:
-       kvfree(pages);
+       vfree(pages);
 err2:
        dax_read_unlock(id);
 err1:
@@ -962,7 +962,7 @@ static int writecache_alloc_entries(stru
 
        if (wc->entries)
                return 0;
-       wc->entries = vmalloc(array_size(sizeof(struct wc_entry), 
wc->n_blocks));
+       wc->entries = vmalloc_array(wc->n_blocks, sizeof(struct wc_entry));
        if (!wc->entries)
                return -ENOMEM;
        for (b = 0; b < wc->n_blocks; b++) {


Reply via email to