[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V3] Correctly return success from IOCTL_PRIVCMD_MMAPBATCH
On 16/11/12 18:36, Mats Petersson wrote: > This is a regression introduced by ceb90fa0 (xen/privcmd: add > PRIVCMD_MMAPBATCH_V2 ioctl). It broke xentrace as it used > xc_map_foreign() instead of xc_map_foreign_bulk(). Konrad, This is a regression introduced in 3.7-rc1. Can you pick this one up for 3.7? Thanks. David > > Most code-paths prefer the MMAPBATCH_V2, so this wasn't very obvious > that it broke. The return value is set early on to -EINVAL, and if all > goes well, the "set top bits of the MFN's" never gets called, so the > return value is still EINVAL when the function gets to the end, causing > the caller to think it went wrong (which it didn't!) > > Now also including Andres "move the ret = -EINVAL into the error handling > path, as this avoids other similar errors in future. > > Signed off by: Mats Petersson <mats.petersson@xxxxxxxxxx> > Acked-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> > Acked-by: David Vrabel <david.vrabel@xxxxxxxxxx> > --- > drivers/xen/privcmd.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c > index 8adb9cc..71f5c45 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) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |