diff --git a/fs/io_uring.c b/fs/io_uring.c index 1eb815660fe84bd1572e297e460df79ae2cfcb91..e9a2f8f39eb32c3ec63bce820288ff3aadae8e65 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -8093,25 +8093,27 @@ static unsigned long rings_size(unsigned sq_entries, unsigned cq_entries, return off; } +static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf *imu) +{ + unsigned int i; + + for (i = 0; i < imu->nr_bvecs; i++) + unpin_user_page(imu->bvec[i].bv_page); + if (imu->acct_pages) + io_unaccount_mem(ctx, imu->acct_pages); + kvfree(imu->bvec); + imu->nr_bvecs = 0; +} + static int io_sqe_buffers_unregister(struct io_ring_ctx *ctx) { - int i, j; + unsigned int i; if (!ctx->user_bufs) return -ENXIO; - for (i = 0; i < ctx->nr_user_bufs; i++) { - struct io_mapped_ubuf *imu = &ctx->user_bufs[i]; - - for (j = 0; j < imu->nr_bvecs; j++) - unpin_user_page(imu->bvec[j].bv_page); - - if (imu->acct_pages) - io_unaccount_mem(ctx, imu->acct_pages); - kvfree(imu->bvec); - imu->nr_bvecs = 0; - } - + for (i = 0; i < ctx->nr_user_bufs; i++) + io_buffer_unmap(ctx, &ctx->user_bufs[i]); kfree(ctx->user_bufs); ctx->user_bufs = NULL; ctx->nr_user_bufs = 0;