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
This commit is contained in:
@@ -36,6 +36,7 @@ struct virtrng_info {
|
|||||||
int index;
|
int index;
|
||||||
bool busy;
|
bool busy;
|
||||||
bool hwrng_register_done;
|
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;
|
int ret;
|
||||||
struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
|
struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
|
||||||
|
|
||||||
|
if (vi->hwrng_removed)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (!vi->busy) {
|
if (!vi->busy) {
|
||||||
vi->busy = true;
|
vi->busy = true;
|
||||||
init_completion(&vi->have_data);
|
init_completion(&vi->have_data);
|
||||||
@@ -137,6 +141,9 @@ static void remove_common(struct virtio_device *vdev)
|
|||||||
{
|
{
|
||||||
struct virtrng_info *vi = vdev->priv;
|
struct virtrng_info *vi = vdev->priv;
|
||||||
|
|
||||||
|
vi->hwrng_removed = true;
|
||||||
|
vi->data_avail = 0;
|
||||||
|
complete(&vi->have_data);
|
||||||
vdev->config->reset(vdev);
|
vdev->config->reset(vdev);
|
||||||
vi->busy = false;
|
vi->busy = false;
|
||||||
if (vi->hwrng_register_done)
|
if (vi->hwrng_register_done)
|
||||||
|
Reference in New Issue
Block a user