diff options
| author | Michael S. Tsirkin <mst@redhat.com> | 2010-07-26 03:25:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-26 11:05:31 -0400 |
| commit | 1fe9b6fef11771461e69ecd1bc8935a1c7c90cb5 (patch) | |
| tree | 3ecc82deed99dc11c67d64bfea2737fc68d769d3 | |
| parent | 2e65a2075cc740b485ab203430bdf3459d5551b6 (diff) | |
virtio: fix oops on OOM
virtio ring was changed to return an error code on OOM,
but one caller was missed and still checks for vq->vring.num.
The fix is just to check for <0 error code.
Long term it might make sense to change goto add_head to
just return an error on oom instead, but let's apply
a minimal fix for 2.6.35.
Reported-by: Chris Mason <chris.mason@oracle.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Tested-by: Chris Mason <chris.mason@oracle.com>
Cc: stable@kernel.org # .34.x
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/virtio/virtio_ring.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index afe7e21dd0ae..1475ed6b575f 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
| @@ -164,7 +164,8 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq, | |||
| 164 | gfp_t gfp) | 164 | gfp_t gfp) |
| 165 | { | 165 | { |
| 166 | struct vring_virtqueue *vq = to_vvq(_vq); | 166 | struct vring_virtqueue *vq = to_vvq(_vq); |
| 167 | unsigned int i, avail, head, uninitialized_var(prev); | 167 | unsigned int i, avail, uninitialized_var(prev); |
| 168 | int head; | ||
| 168 | 169 | ||
| 169 | START_USE(vq); | 170 | START_USE(vq); |
| 170 | 171 | ||
| @@ -174,7 +175,7 @@ int virtqueue_add_buf_gfp(struct virtqueue *_vq, | |||
| 174 | * buffers, then go indirect. FIXME: tune this threshold */ | 175 | * buffers, then go indirect. FIXME: tune this threshold */ |
| 175 | if (vq->indirect && (out + in) > 1 && vq->num_free) { | 176 | if (vq->indirect && (out + in) > 1 && vq->num_free) { |
| 176 | head = vring_add_indirect(vq, sg, out, in, gfp); | 177 | head = vring_add_indirect(vq, sg, out, in, gfp); |
| 177 | if (head != vq->vring.num) | 178 | if (likely(head >= 0)) |
| 178 | goto add_head; | 179 | goto add_head; |
| 179 | } | 180 | } |
| 180 | 181 | ||
