io_uring: add cleanup for openat()/statx()
authorPavel Begunkov <asml.silence@gmail.com>
Fri, 7 Feb 2020 20:59:53 +0000 (23:59 +0300)
committerJens Axboe <axboe@kernel.dk>
Sat, 8 Feb 2020 20:06:58 +0000 (13:06 -0700)
openat() and statx() may have allocated ->open.filename, which should be
be put. Add cleanup handlers for them.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 5353e96029c77d2c9afb1890657592458dcdc46d..e6829d1bf4b425b665b544adb90c40b11f3bee67 100644 (file)
@@ -2537,6 +2537,7 @@ static int io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
                return ret;
        }
 
+       req->flags |= REQ_F_NEED_CLEANUP;
        return 0;
 }
 
@@ -2575,6 +2576,7 @@ static int io_openat2_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
                return ret;
        }
 
+       req->flags |= REQ_F_NEED_CLEANUP;
        return 0;
 }
 
@@ -2606,6 +2608,7 @@ static int io_openat2(struct io_kiocb *req, struct io_kiocb **nxt,
        }
 err:
        putname(req->open.filename);
+       req->flags &= ~REQ_F_NEED_CLEANUP;
        if (ret < 0)
                req_set_fail_links(req);
        io_cqring_add_event(req, ret);
@@ -2765,6 +2768,7 @@ static int io_statx_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
                return ret;
        }
 
+       req->flags |= REQ_F_NEED_CLEANUP;
        return 0;
 }
 
@@ -2802,6 +2806,7 @@ retry:
                ret = cp_statx(&stat, ctx->buffer);
 err:
        putname(ctx->filename);
+       req->flags &= ~REQ_F_NEED_CLEANUP;
        if (ret < 0)
                req_set_fail_links(req);
        io_cqring_add_event(req, ret);
@@ -4223,6 +4228,11 @@ static void io_cleanup_req(struct io_kiocb *req)
                if (io->msg.iov != io->msg.fast_iov)
                        kfree(io->msg.iov);
                break;
+       case IORING_OP_OPENAT:
+       case IORING_OP_OPENAT2:
+       case IORING_OP_STATX:
+               putname(req->open.filename);
+               break;
        }
 
        req->flags &= ~REQ_F_NEED_CLEANUP;