diff options
| author | James Morris <james.l.morris@oracle.com> | 2012-05-04 12:46:40 +1000 | 
|---|---|---|
| committer | James Morris <james.l.morris@oracle.com> | 2012-05-04 12:46:40 +1000 | 
| commit | 898bfc1d46bd76f8ea2a0fbd239dd2073efe2aa3 (patch) | |
| tree | e6e666085abe674dbf6292555961fe0a0f2e2d2f /fs/aio.c | |
| parent | 08162e6a23d476544adfe1164afe9ea8b34ab859 (diff) | |
| parent | 69964ea4c7b68c9399f7977aa5b9aa6539a6a98a (diff) | |
| download | olio-linux-3.10-898bfc1d46bd76f8ea2a0fbd239dd2073efe2aa3.tar.xz olio-linux-3.10-898bfc1d46bd76f8ea2a0fbd239dd2073efe2aa3.zip  | |
Merge tag 'v3.4-rc5' into next
Linux 3.4-rc5
Merge to pull in prerequisite change for Smack:
86812bb0de1a3758dc6c7aa01a763158a7c0638a
Requested by Casey.
Diffstat (limited to 'fs/aio.c')
| -rw-r--r-- | fs/aio.c | 16 | 
1 files changed, 13 insertions, 3 deletions
@@ -93,9 +93,8 @@ static void aio_free_ring(struct kioctx *ctx)  		put_page(info->ring_pages[i]);  	if (info->mmap_size) { -		down_write(&ctx->mm->mmap_sem); -		do_munmap(ctx->mm, info->mmap_base, info->mmap_size); -		up_write(&ctx->mm->mmap_sem); +		BUG_ON(ctx->mm != current->mm); +		vm_munmap(info->mmap_base, info->mmap_size);  	}  	if (info->ring_pages && info->ring_pages != info->internal_pages) @@ -389,6 +388,17 @@ void exit_aio(struct mm_struct *mm)  				"exit_aio:ioctx still alive: %d %d %d\n",  				atomic_read(&ctx->users), ctx->dead,  				ctx->reqs_active); +		/* +		 * 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. +		 * That way we get all munmap done to current->mm - +		 * all other callers have ctx->mm == current->mm. +		 */ +		ctx->ring_info.mmap_size = 0;  		put_ioctx(ctx);  	}  }  |