|
@@ -286,12 +286,37 @@ static void aio_free_ring(struct kioctx *ctx)
|
|
|
|
|
|
static int aio_ring_mmap(struct file *file, struct vm_area_struct *vma)
|
|
|
{
|
|
|
+ vma->vm_flags |= VM_DONTEXPAND;
|
|
|
vma->vm_ops = &generic_file_vm_ops;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void aio_ring_remap(struct file *file, struct vm_area_struct *vma)
|
|
|
+{
|
|
|
+ struct mm_struct *mm = vma->vm_mm;
|
|
|
+ struct kioctx_table *table;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ spin_lock(&mm->ioctx_lock);
|
|
|
+ rcu_read_lock();
|
|
|
+ table = rcu_dereference(mm->ioctx_table);
|
|
|
+ for (i = 0; i < table->nr; i++) {
|
|
|
+ struct kioctx *ctx;
|
|
|
+
|
|
|
+ ctx = table->table[i];
|
|
|
+ if (ctx && ctx->aio_ring_file == file) {
|
|
|
+ ctx->user_id = ctx->mmap_base = vma->vm_start;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ rcu_read_unlock();
|
|
|
+ spin_unlock(&mm->ioctx_lock);
|
|
|
+}
|
|
|
+
|
|
|
static const struct file_operations aio_ring_fops = {
|
|
|
.mmap = aio_ring_mmap,
|
|
|
+ .mremap = aio_ring_remap,
|
|
|
};
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_MIGRATION)
|