diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-11-20 18:52:01 -1000 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-11-20 18:52:01 -1000 |
commit | 74dcc3f9044320a0580673827a446c9e5593dfc7 (patch) | |
tree | f73d30f96cbd7e8167aa9ddd348c6c3b9f49d756 /drivers/xen | |
parent | 87885b700b9b697ce8601d415cb905862750c3b9 (diff) | |
parent | 68fa965dd923177eafad49b7a0045fc610917341 (diff) | |
download | linux-3.10-74dcc3f9044320a0580673827a446c9e5593dfc7.tar.gz linux-3.10-74dcc3f9044320a0580673827a446c9e5593dfc7.tar.bz2 linux-3.10-74dcc3f9044320a0580673827a446c9e5593dfc7.zip |
Merge tag 'stable/for-linus-3.7-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
Pull Xen bug-fix from Konrad Rzeszutek Wilk:
- Fix regression introduced by commit ceb90fa0a800 ("xen/privcmd: add
PRIVCMD_MMAPBATCH_V2 ioctl").
* tag 'stable/for-linus-3.7-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
xen/privcmd: Correctly return success from IOCTL_PRIVCMD_MMAPBATCH
Diffstat (limited to 'drivers/xen')
-rw-r--r-- | drivers/xen/privcmd.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index 8adb9cc267f..71f5c459b08 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c @@ -361,13 +361,13 @@ static long privcmd_ioctl_mmap_batch(void __user *udata, int version) down_write(&mm->mmap_sem); vma = find_vma(mm, m.addr); - ret = -EINVAL; if (!vma || vma->vm_ops != &privcmd_vm_ops || (m.addr != vma->vm_start) || ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || !privcmd_enforce_singleshot_mapping(vma)) { up_write(&mm->mmap_sem); + ret = -EINVAL; goto out; } @@ -383,12 +383,16 @@ static long privcmd_ioctl_mmap_batch(void __user *udata, int version) up_write(&mm->mmap_sem); - if (state.global_error && (version == 1)) { - /* Write back errors in second pass. */ - state.user_mfn = (xen_pfn_t *)m.arr; - state.err = err_array; - ret = traverse_pages(m.num, sizeof(xen_pfn_t), - &pagelist, mmap_return_errors_v1, &state); + if (version == 1) { + if (state.global_error) { + /* Write back errors in second pass. */ + state.user_mfn = (xen_pfn_t *)m.arr; + state.err = err_array; + ret = traverse_pages(m.num, sizeof(xen_pfn_t), + &pagelist, mmap_return_errors_v1, &state); + } else + ret = 0; + } else if (version == 2) { ret = __copy_to_user(m.err, err_array, m.num * sizeof(int)); if (ret) |