Unified · Split
| @@ -1270,7 +1270,6 @@ static void io_destroy(struct kioctx *ioctx) · 1269 unmodified lines | |||
| 1270 | * locking done by the above calls to ensure this consistency. | 1270 | * locking done by the above calls to ensure this consistency. |
| 1271 | */ | 1271 | */ |
| 1272 | wake_up_all(&ioctx->wait); | 1272 | wake_up_all(&ioctx->wait); |
| 1273 | put_ioctx(ioctx); /* once for the lookup */ | ||
| 1274 | } | 1273 | } |
| 1275 | 1274 | ||
| 1276 | /* sys_io_setup: | 1275 | /* sys_io_setup: |
| @@ -1307,11 +1306,9 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp) · 30 unmodified lines | |||
| 1307 | ret = PTR_ERR(ioctx); | 1306 | ret = PTR_ERR(ioctx); |
| 1308 | if (!IS_ERR(ioctx)) { | 1307 | if (!IS_ERR(ioctx)) { |
| 1309 | ret = put_user(ioctx->user_id, ctxp); | 1308 | ret = put_user(ioctx->user_id, ctxp); |
| 1310 | if (!ret) { | 1309 | if (ret) |
| 1311 | put_ioctx(ioctx); | 1310 | io_destroy(ioctx); |
| 1312 | return 0; | 1311 | put_ioctx(ioctx); |
| 1313 | } | ||
| 1314 | io_destroy(ioctx); | ||
| 1315 | } | 1312 | } |
| 1316 | 1313 | ||
| 1317 | out: | 1314 | out: |
| @@ -1329,6 +1326,7 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx) · 11 unmodified lines | |||
| 1329 | struct kioctx *ioctx = lookup_ioctx(ctx); | 1326 | struct kioctx *ioctx = lookup_ioctx(ctx); |
| 1330 | if (likely(NULL != ioctx)) { | 1327 | if (likely(NULL != ioctx)) { |
| 1331 | io_destroy(ioctx); | 1328 | io_destroy(ioctx); |
| 1329 | put_ioctx(ioctx); | ||
| 1332 | return 0; | 1330 | return 0; |
| 1333 | } | 1331 | } |
| 1334 | pr_debug("EINVAL: io_destroy: invalid context id\n"); | 1332 | pr_debug("EINVAL: io_destroy: invalid context id\n"); |