diff options
| -rw-r--r-- | fs/aio.c | 12 |
1 files changed, 6 insertions, 6 deletions
| @@ -1033,6 +1033,11 @@ static inline struct aio_kiocb *aio_get_req(struct kioctx *ctx) | |||
| 1033 | if (unlikely(!req)) | 1033 | if (unlikely(!req)) |
| 1034 | return NULL; | 1034 | return NULL; |
| 1035 | 1035 | ||
| 1036 | if (unlikely(!get_reqs_available(ctx))) { | ||
| 1037 | kfree(req); | ||
| 1038 | return NULL; | ||
| 1039 | } | ||
| 1040 | |||
| 1036 | percpu_ref_get(&ctx->reqs); | 1041 | percpu_ref_get(&ctx->reqs); |
| 1037 | req->ki_ctx = ctx; | 1042 | req->ki_ctx = ctx; |
| 1038 | INIT_LIST_HEAD(&req->ki_list); | 1043 | INIT_LIST_HEAD(&req->ki_list); |
| @@ -1793,13 +1798,9 @@ static int __io_submit_one(struct kioctx *ctx, const struct iocb *iocb, | |||
| 1793 | return -EINVAL; | 1798 | return -EINVAL; |
| 1794 | } | 1799 | } |
| 1795 | 1800 | ||
| 1796 | if (!get_reqs_available(ctx)) | ||
| 1797 | return -EAGAIN; | ||
| 1798 | |||
| 1799 | ret = -EAGAIN; | ||
| 1800 | req = aio_get_req(ctx); | 1801 | req = aio_get_req(ctx); |
| 1801 | if (unlikely(!req)) | 1802 | if (unlikely(!req)) |
| 1802 | goto out_put_reqs_available; | 1803 | return -EAGAIN; |
| 1803 | 1804 | ||
| 1804 | req->ki_filp = fget(iocb->aio_fildes); | 1805 | req->ki_filp = fget(iocb->aio_fildes); |
| 1805 | ret = -EBADF; | 1806 | ret = -EBADF; |
| @@ -1874,7 +1875,6 @@ static int __io_submit_one(struct kioctx *ctx, const struct iocb *iocb, | |||
| 1874 | 1875 | ||
| 1875 | out_put_req: | 1876 | out_put_req: |
| 1876 | iocb_destroy(req); | 1877 | iocb_destroy(req); |
| 1877 | out_put_reqs_available: | ||
| 1878 | put_reqs_available(ctx, 1); | 1878 | put_reqs_available(ctx, 1); |
| 1879 | return ret; | 1879 | return ret; |
| 1880 | } | 1880 | } |
