ret = sg_alloc_table_from_pages(&mem->page_sg_table, pages, nr_pages,
0, (unsigned long)nr_pages << PAGE_SHIFT,
GFP_KERNEL_ACCOUNT);
- if (ret) {
- unpin_user_pages(pages, nr_pages);
- kvfree(pages);
- return ret;
- }
+ if (ret)
+ goto out_err;
mem->account_pages = io_count_account_pages(pages, nr_pages);
ret = io_account_mem(ifq->user, ifq->mm_account, mem->account_pages);
- if (ret < 0)
+ if (ret < 0) {
mem->account_pages = 0;
+ goto out_err;
+ }
mem->sgt = &mem->page_sg_table;
mem->pages = pages;
mem->nr_folios = nr_pages;
mem->size = area_reg->len;
return ret;
+out_err:
+ sg_free_table(&mem->page_sg_table);
+ unpin_user_pages(pages, nr_pages);
+ kvfree(pages);
+ return ret;
}
static void io_release_area_mem(struct io_zcrx_mem *mem)