On Mon, 27 Jun 2016 10:09:18 +0800 Minfei Huang <mnghuan@xxxxxxxxx> wrote: > The error number -ENOENT or 0 will be returned, if we can not allocate > more memory in function init_vq. If host can support multiple virtual > queues, and we fails to allocate necessary memory structures for vq, > kernel may crash due to incorrect returning. > > To fix it, kernel will return correct value in init_vq. > > Signed-off-by: Minfei Huang <mnghuan@xxxxxxxxx> > Signed-off-by: Minfei Huang <minfei.hmf@xxxxxxxxxxxxxxx> > --- > drivers/block/virtio_blk.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c > index 42758b5..40ecb2b 100644 > --- a/drivers/block/virtio_blk.c > +++ b/drivers/block/virtio_blk.c > @@ -393,11 +393,10 @@ static int init_vq(struct virtio_blk *vblk) > if (err) > num_vqs = 1; > > + err = -ENOMEM; > vblk->vqs = kmalloc(sizeof(*vblk->vqs) * num_vqs, GFP_KERNEL); > - if (!vblk->vqs) { > - err = -ENOMEM; > + if (!vblk->vqs) > goto out; > - } > > names = kmalloc(sizeof(*names) * num_vqs, GFP_KERNEL); > if (!names) The error handling in this function looks horrible. When mq was introduced, init_vq started mixing up several things: - The mq feature is not available - which is not an error, and therefore should not have any influence on the return code. - One of the several memory allocations failed - only ->vqs gets special treatment, however. - The ->find_vqs callback failed. Your patch fixes the code, but it is still very convoluted due to the temporary arrays. May it be worthwile to introduce a helper for setting up the virtqueues where all virtqueues are essentially the same and just get a consecutive number? Michael? _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization