diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-09-15 20:35:32 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-09-15 20:35:32 -0700 |
commit | 2856db70990f2fb454c7982e76465b2744753f44 (patch) | |
tree | be9c747bdc3a3c84d85c100e2761e16fa00297a9 | |
parent | 2324067fa9a41b2d0b6ddbc7ac0497d105593b76 (diff) | |
parent | f49819560f53b7f3a596a8ea2e6764dc86695b62 (diff) |
Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux
Pull virtio fixes from Rusty Russell:
"virtio-rng corner case fixes, with cc:stable.
Survived a few days in linux-next"
* tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux:
virtio-rng: skip reading when we start to remove the device
virtio-rng: fix stuck of hot-unplugging busy device
-rw-r--r-- | drivers/char/hw_random/virtio-rng.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index 2e3139eda93b..132c9ccfdc62 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c @@ -36,6 +36,7 @@ struct virtrng_info { int index; bool busy; bool hwrng_register_done; + bool hwrng_removed; }; @@ -68,6 +69,9 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) int ret; struct virtrng_info *vi = (struct virtrng_info *)rng->priv; + if (vi->hwrng_removed) + return -ENODEV; + if (!vi->busy) { vi->busy = true; init_completion(&vi->have_data); @@ -137,6 +141,9 @@ static void remove_common(struct virtio_device *vdev) { struct virtrng_info *vi = vdev->priv; + vi->hwrng_removed = true; + vi->data_avail = 0; + complete(&vi->have_data); vdev->config->reset(vdev); vi->busy = false; if (vi->hwrng_register_done) |