]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm-gup-fix-potential-pgmap-refcnt-leak-in-__gup_device_huge-fix-fix
authorAndrew Morton <akpm@linux-foundation.org>
Mon, 23 Aug 2021 23:59:09 +0000 (09:59 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Wed, 25 Aug 2021 23:33:42 +0000 (09:33 +1000)
fix return value

Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
mm/gup.c

index 41fd86ec362c0dad5c250236d94cc54abcf1bf42..a10c48ef613c9377b64c76014c80a8d0b878ca4c 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -2240,6 +2240,7 @@ static int __gup_device_huge(unsigned long pfn, unsigned long addr,
 {
        int nr_start = *nr;
        struct dev_pagemap *pgmap = NULL;
+       int ret = 1;
 
        do {
                struct page *page = pfn_to_page(pfn);
@@ -2247,12 +2248,14 @@ static int __gup_device_huge(unsigned long pfn, unsigned long addr,
                pgmap = get_dev_pagemap(pfn, pgmap);
                if (unlikely(!pgmap)) {
                        undo_dev_pagemap(nr, nr_start, flags, pages);
+                       ret = 0;
                        break;
                }
                SetPageReferenced(page);
                pages[*nr] = page;
                if (unlikely(!try_grab_page(page, flags))) {
                        undo_dev_pagemap(nr, nr_start, flags, pages);
+                       ret = 0;
                        break;
                }
                (*nr)++;
@@ -2260,7 +2263,7 @@ static int __gup_device_huge(unsigned long pfn, unsigned long addr,
        } while (addr += PAGE_SIZE, addr != end);
 
        put_dev_pagemap(pgmap);
-       return 1;
+       return ret;
 }
 
 static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr,