|
@@ -476,14 +476,21 @@ static void kiocb_batch_init(struct kiocb_batch *batch, long total)
|
|
|
batch->count = total;
|
|
|
}
|
|
|
|
|
|
-static void kiocb_batch_free(struct kiocb_batch *batch)
|
|
|
+static void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch)
|
|
|
{
|
|
|
struct kiocb *req, *n;
|
|
|
|
|
|
+ if (list_empty(&batch->head))
|
|
|
+ return;
|
|
|
+
|
|
|
+ spin_lock_irq(&ctx->ctx_lock);
|
|
|
list_for_each_entry_safe(req, n, &batch->head, ki_batch) {
|
|
|
list_del(&req->ki_batch);
|
|
|
+ list_del(&req->ki_list);
|
|
|
kmem_cache_free(kiocb_cachep, req);
|
|
|
+ ctx->reqs_active--;
|
|
|
}
|
|
|
+ spin_unlock_irq(&ctx->ctx_lock);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1742,7 +1749,7 @@ long do_io_submit(aio_context_t ctx_id, long nr,
|
|
|
}
|
|
|
blk_finish_plug(&plug);
|
|
|
|
|
|
- kiocb_batch_free(&batch);
|
|
|
+ kiocb_batch_free(ctx, &batch);
|
|
|
put_ioctx(ctx);
|
|
|
return i ? i : ret;
|
|
|
}
|