diff options
Diffstat (limited to 'drivers/char/virtio_console.c')
| -rw-r--r-- | drivers/char/virtio_console.c | 37 | 
1 files changed, 9 insertions, 28 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 6c1b676643a..896a2ced1d2 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -1547,31 +1547,16 @@ static int init_vqs(struct ports_device *portdev)  	nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;  	vqs = kmalloc(nr_queues * sizeof(struct virtqueue *), GFP_KERNEL); -	if (!vqs) { -		err = -ENOMEM; -		goto fail; -	}  	io_callbacks = kmalloc(nr_queues * sizeof(vq_callback_t *), GFP_KERNEL); -	if (!io_callbacks) { -		err = -ENOMEM; -		goto free_vqs; -	}  	io_names = kmalloc(nr_queues * sizeof(char *), GFP_KERNEL); -	if (!io_names) { -		err = -ENOMEM; -		goto free_callbacks; -	}  	portdev->in_vqs = kmalloc(nr_ports * sizeof(struct virtqueue *),  				  GFP_KERNEL); -	if (!portdev->in_vqs) { -		err = -ENOMEM; -		goto free_names; -	}  	portdev->out_vqs = kmalloc(nr_ports * sizeof(struct virtqueue *),  				   GFP_KERNEL); -	if (!portdev->out_vqs) { +	if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs || +			!portdev->out_vqs) {  		err = -ENOMEM; -		goto free_invqs; +		goto free;  	}  	/* @@ -1605,7 +1590,7 @@ static int init_vqs(struct ports_device *portdev)  					      io_callbacks,  					      (const char **)io_names);  	if (err) -		goto free_outvqs; +		goto free;  	j = 0;  	portdev->in_vqs[0] = vqs[0]; @@ -1621,23 +1606,19 @@ static int init_vqs(struct ports_device *portdev)  			portdev->out_vqs[i] = vqs[j + 1];  		}  	} -	kfree(io_callbacks);  	kfree(io_names); +	kfree(io_callbacks);  	kfree(vqs);  	return 0; -free_names: -	kfree(io_names); -free_callbacks: -	kfree(io_callbacks); -free_outvqs: +free:  	kfree(portdev->out_vqs); -free_invqs:  	kfree(portdev->in_vqs); -free_vqs: +	kfree(io_names); +	kfree(io_callbacks);  	kfree(vqs); -fail: +  	return err;  }  |