Skip to content

Commit

Permalink
virtio: console: return -ENODEV on all read operations after unplug
Browse files Browse the repository at this point in the history
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.

CC: <[email protected]>
Signed-off-by: Amit Shah <[email protected]>
Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
amit3s authored and rustyrussell committed Jul 29, 2013
1 parent 92d3453 commit 96f97a8
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion drivers/char/virtio_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -749,6 +749,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
Expand All @@ -765,7 +769,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;
/*
Expand Down

0 comments on commit 96f97a8

Please sign in to comment.