|
@@ -791,40 +791,30 @@ EXPORT_SYMBOL(wait_on_sync_kiocb);
|
|
|
*/
|
|
|
void exit_aio(struct mm_struct *mm)
|
|
|
{
|
|
|
- struct kioctx_table *table;
|
|
|
- struct kioctx *ctx;
|
|
|
- unsigned i = 0;
|
|
|
-
|
|
|
- while (1) {
|
|
|
- rcu_read_lock();
|
|
|
- table = rcu_dereference(mm->ioctx_table);
|
|
|
-
|
|
|
- do {
|
|
|
- if (!table || i >= table->nr) {
|
|
|
- rcu_read_unlock();
|
|
|
- rcu_assign_pointer(mm->ioctx_table, NULL);
|
|
|
- if (table)
|
|
|
- kfree(table);
|
|
|
- return;
|
|
|
- }
|
|
|
+ struct kioctx_table *table = rcu_dereference_raw(mm->ioctx_table);
|
|
|
+ int i;
|
|
|
|
|
|
- ctx = table->table[i++];
|
|
|
- } while (!ctx);
|
|
|
+ if (!table)
|
|
|
+ return;
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
+ for (i = 0; i < table->nr; ++i) {
|
|
|
+ struct kioctx *ctx = table->table[i];
|
|
|
|
|
|
+ if (!ctx)
|
|
|
+ continue;
|
|
|
/*
|
|
|
- * We don't need to bother with munmap() here -
|
|
|
- * exit_mmap(mm) is coming and it'll unmap everything.
|
|
|
- * Since aio_free_ring() uses non-zero ->mmap_size
|
|
|
- * as indicator that it needs to unmap the area,
|
|
|
- * just set it to 0; aio_free_ring() is the only
|
|
|
- * place that uses ->mmap_size, so it's safe.
|
|
|
+ * We don't need to bother with munmap() here - exit_mmap(mm)
|
|
|
+ * is coming and it'll unmap everything. And we simply can't,
|
|
|
+ * this is not necessarily our ->mm.
|
|
|
+ * Since kill_ioctx() uses non-zero ->mmap_size as indicator
|
|
|
+ * that it needs to unmap the area, just set it to 0.
|
|
|
*/
|
|
|
ctx->mmap_size = 0;
|
|
|
-
|
|
|
kill_ioctx(mm, ctx, NULL);
|
|
|
}
|
|
|
+
|
|
|
+ RCU_INIT_POINTER(mm->ioctx_table, NULL);
|
|
|
+ kfree(table);
|
|
|
}
|
|
|
|
|
|
static void put_reqs_available(struct kioctx *ctx, unsigned nr)
|