[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Re: [PATCH] xenbus: avoid zero returns from read()
On 09/09/2010 11:25 AM, Jeremy Fitzhardinge wrote: > On 09/10/2010 12:40 AM, Daniel De Graaf wrote: >> On 09/09/2010 05:27 AM, Jun Zhu (Intern) wrote: >>> Is it related to the following patch? The following patch fixes the problem >>> of queue deletion. >> Yes, this would have caused a zero return due to an empty item being left >> in the queue. It's likely my patch is not needed with this one applied; we >> are already careful to avoid adding zero-length elements to the queue, >> which was my original idea for the cause. > > No, that's a separate issue. This patch fixes the case where the > usermode buffer is near a page boundary so the copy to usermode is > truncated. > > Anyway, I've applied both. > > J One or both of these patches are needed in the 2.6.37 kernel; I have observed a zero return from a read() on xenbus on 2.6.37-rc8 that is fixed by this patch. >>> diff --git a/drivers/xen/xenfs/xenbus.c b/drivers/xen/xenfs/xenbus.c >>> index 64b3be4..763e90d 100644 >>> --- a/drivers/xen/xenfs/xenbus.c >>> +++ b/drivers/xen/xenfs/xenbus.c >>> @@ -143,7 +143,7 @@ static ssize_t xenbus_file_read(struct file *filp, >>> i += sz - ret; >>> rb->cons += sz - ret; >>> >>> - if (ret != sz) { >>> + if (ret != 0) { >>> if (i == 0) >>> i = -EFAULT; >>> goto out; >>> >>> Jun Zhu >>> Citrix Systems UK >>> ________________________________________ >>> From: Daniel De Graaf [dgdegra@xxxxxxxxxxxxx] >>> Sent: 08 September 2010 18:10 >>> To: Jeremy Fitzhardinge >>> Cc: xen-devel; Jun Zhu (Intern) >>> Subject: [PATCH] xenbus: avoid zero returns from read() >>> >>> It is possible to get a zero return from read() in instances where the >>> queue is not empty but has no elements with data to deliver to the user. >>> Since a zero return from read is an error indicator, resume waiting or >>> return -EAGAIN (for a nonblocking fd) in this case. >>> >>> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> >>> >>> --- >>> diff --git a/drivers/xen/xenfs/xenbus.c b/drivers/xen/xenfs/xenbus.c >>> index 88c87c9..0ddef43 100644 >>> --- a/drivers/xen/xenfs/xenbus.c >>> +++ b/drivers/xen/xenfs/xenbus.c >>> @@ -121,6 +121,7 @@ static ssize_t xenbus_file_read(struct file *filp, >>> int ret; >>> >>> mutex_lock(&u->reply_mutex); >>> +again: >>> while (list_empty(&u->read_buffers)) { >>> mutex_unlock(&u->reply_mutex); >>> if (filp->f_flags & O_NONBLOCK) >>> @@ -159,6 +160,8 @@ static ssize_t xenbus_file_read(struct file *filp, >>> struct read_buffer, list); >>> } >>> } >>> + if (i == 0) >>> + goto again; >>> >>> out: >>> mutex_unlock(&u->reply_mutex); >> > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel -- Daniel De Graaf National Security Agency _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |