diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2014-06-04 07:34:56 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-06-25 07:29:33 -0400 |
commit | cdda0e5acbb78f7b777049f8c27899e5c5bb368f (patch) | |
tree | d756a766d693bb664880abcb2a1b10a3e42a0601 | |
parent | 7114aae02742d6b5c5a0d39a41deb61d415d3717 (diff) |
virtio-scsi: avoid cancelling uninitialized work items
Calling the workqueue interface on uninitialized work items isn't a
good idea even if they're zeroed. It's not failing catastrophically only
through happy accidents.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r-- | drivers/scsi/virtio_scsi.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index 89ee5929eb6d..bcad917fd89a 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c | |||
@@ -253,6 +253,8 @@ static void virtscsi_ctrl_done(struct virtqueue *vq) | |||
253 | virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free); | 253 | virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free); |
254 | }; | 254 | }; |
255 | 255 | ||
256 | static void virtscsi_handle_event(struct work_struct *work); | ||
257 | |||
256 | static int virtscsi_kick_event(struct virtio_scsi *vscsi, | 258 | static int virtscsi_kick_event(struct virtio_scsi *vscsi, |
257 | struct virtio_scsi_event_node *event_node) | 259 | struct virtio_scsi_event_node *event_node) |
258 | { | 260 | { |
@@ -260,6 +262,7 @@ static int virtscsi_kick_event(struct virtio_scsi *vscsi, | |||
260 | struct scatterlist sg; | 262 | struct scatterlist sg; |
261 | unsigned long flags; | 263 | unsigned long flags; |
262 | 264 | ||
265 | INIT_WORK(&event_node->work, virtscsi_handle_event); | ||
263 | sg_init_one(&sg, &event_node->event, sizeof(struct virtio_scsi_event)); | 266 | sg_init_one(&sg, &event_node->event, sizeof(struct virtio_scsi_event)); |
264 | 267 | ||
265 | spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags); | 268 | spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags); |
@@ -377,7 +380,6 @@ static void virtscsi_complete_event(struct virtio_scsi *vscsi, void *buf) | |||
377 | { | 380 | { |
378 | struct virtio_scsi_event_node *event_node = buf; | 381 | struct virtio_scsi_event_node *event_node = buf; |
379 | 382 | ||
380 | INIT_WORK(&event_node->work, virtscsi_handle_event); | ||
381 | schedule_work(&event_node->work); | 383 | schedule_work(&event_node->work); |
382 | } | 384 | } |
383 | 385 | ||