|
|
@@ -553,13 +553,12 @@ void kiocb_set_cancel_fn(struct kiocb *iocb, kiocb_cancel_fn *cancel)
|
|
|
struct kioctx *ctx = req->ki_ctx;
|
|
|
unsigned long flags;
|
|
|
|
|
|
- spin_lock_irqsave(&ctx->ctx_lock, flags);
|
|
|
-
|
|
|
- if (!req->ki_list.next)
|
|
|
- list_add(&req->ki_list, &ctx->active_reqs);
|
|
|
+ if (WARN_ON_ONCE(!list_empty(&req->ki_list)))
|
|
|
+ return;
|
|
|
|
|
|
+ spin_lock_irqsave(&ctx->ctx_lock, flags);
|
|
|
+ list_add_tail(&req->ki_list, &ctx->active_reqs);
|
|
|
req->ki_cancel = cancel;
|
|
|
-
|
|
|
spin_unlock_irqrestore(&ctx->ctx_lock, flags);
|
|
|
}
|
|
|
EXPORT_SYMBOL(kiocb_set_cancel_fn);
|
|
|
@@ -1039,7 +1038,7 @@ static inline struct aio_kiocb *aio_get_req(struct kioctx *ctx)
|
|
|
goto out_put;
|
|
|
|
|
|
percpu_ref_get(&ctx->reqs);
|
|
|
-
|
|
|
+ INIT_LIST_HEAD(&req->ki_list);
|
|
|
req->ki_ctx = ctx;
|
|
|
return req;
|
|
|
out_put:
|
|
|
@@ -1107,7 +1106,7 @@ static void aio_complete(struct kiocb *kiocb, long res, long res2)
|
|
|
file_end_write(file);
|
|
|
}
|
|
|
|
|
|
- if (iocb->ki_list.next) {
|
|
|
+ if (!list_empty_careful(&iocb->ki_list)) {
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(&ctx->ctx_lock, flags);
|