lkml.org 
[lkml]   [2013]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 092/133] virtio: console: return -ENODEV on all read operations after unplug
    Date
    3.8.13.7 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Amit Shah <amit.shah@redhat.com>

    commit 96f97a83910cdb9d89d127c5ee523f8fc040a804 upstream.

    If a port gets unplugged while a user is blocked on read(), -ENODEV is
    returned. However, subsequent read()s returned 0, indicating there's no
    host-side connection (but not indicating the device went away).

    This also happened when a port was unplugged and the user didn't have
    any blocking operation pending. If the user didn't monitor the SIGIO
    signal, they won't have a chance to find out if the port went away.

    Fix by returning -ENODEV on all read()s after the port gets unplugged.
    write() already behaves this way.

    Signed-off-by: Amit Shah <amit.shah@redhat.com>
    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/char/virtio_console.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
    index 62834bc..12829ae 100644
    --- a/drivers/char/virtio_console.c
    +++ b/drivers/char/virtio_console.c
    @@ -755,6 +755,10 @@ static ssize_t port_fops_read(struct file *filp, char __user *ubuf,

    port = filp->private_data;

    + /* Port is hot-unplugged. */
    + if (!port->guest_connected)
    + return -ENODEV;
    +
    if (!port_has_data(port)) {
    /*
    * If nothing's connected on the host just return 0 in
    @@ -771,7 +775,7 @@ static ssize_t port_fops_read(struct file *filp, char __user *ubuf,
    if (ret < 0)
    return ret;
    }
    - /* Port got hot-unplugged. */
    + /* Port got hot-unplugged while we were waiting above. */
    if (!port->guest_connected)
    return -ENODEV;
    /*
    --
    1.8.1.2


    \
     
     \ /
      Last update: 2013-08-17 07:21    [W:4.015 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site