Addressing "this function needs a cleanup block, lots of free(blah); return (0)"
comment for vioblk_notifyq() and doing the same for vionet_enq_rx().
Index: virtio.c
===================================================================
RCS file: /home/nayden/cvsync/src/usr.sbin/vmd/virtio.c,v
retrieving revision 1.17
diff -u -p -r1.17 virtio.c
--- virtio.c 17 Aug 2016 05:07:13 -0000 1.17
+++ virtio.c 31 Aug 2016 10:35:55 -0000
@@ -353,8 +353,7 @@ vioblk_do_write(struct vioblk_dev *dev,
}
/*
- * XXX this function needs a cleanup block, lots of free(blah); return (0)
- * in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
+ * XXX in various cases, ds should be set to VIRTIO_BLK_S_IOERR, if we can
* XXX cant trust ring data from VM, be extra cautious.
*/
int
@@ -390,8 +389,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
if (read_mem(q_gpa, vr, vr_sz)) {
log_warnx("error reading gpa 0x%llx", q_gpa);
- free(vr);
- return (0);
+ goto out;
}
/* Compute offsets in ring of descriptors, avail ring, and used ring */
@@ -406,8 +404,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
if ((avail->idx & VIOBLK_QUEUE_MASK) == idx) {
log_warnx("vioblk queue notify - nothing to do?");
- free(vr);
- return (0);
+ goto out;
}
cmd_desc_idx = avail->ring[idx] & VIOBLK_QUEUE_MASK;
@@ -416,16 +413,14 @@ vioblk_notifyq(struct vioblk_dev *dev)
if ((cmd_desc->flags & VRING_DESC_F_NEXT) == 0) {
log_warnx("unchained vioblk cmd descriptor received "
"(idx %d)", cmd_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
/* Read command from descriptor ring */
if (read_mem(cmd_desc->addr, &cmd, cmd_desc->len)) {
log_warnx("vioblk: command read_mem error @ 0x%llx",
cmd_desc->addr);
- free(vr);
- return (0);
+ goto out;
}
switch (cmd.type) {
@@ -437,8 +432,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
if ((secdata_desc->flags & VRING_DESC_F_NEXT) == 0) {
log_warnx("unchained vioblk data descriptor "
"received (idx %d)", cmd_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
secbias = 0;
@@ -453,8 +447,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
if (secdata == NULL) {
log_warnx("vioblk: block read error, "
"sector %lld", cmd.sector);
- free(vr);
- return (0);
+ goto out;
}
if (write_mem(secdata_desc->addr, secdata,
@@ -463,9 +456,8 @@ vioblk_notifyq(struct vioblk_dev *dev)
"data to gpa @ 0x%llx",
secdata_desc->addr);
dump_descriptor_chain(desc, cmd_desc_idx);
- free(vr);
free(secdata);
- return (0);
+ goto out;
}
free(secdata);
@@ -484,8 +476,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
log_warnx("can't write device status data @ "
"0x%llx", ds_desc->addr);
dump_descriptor_chain(desc, cmd_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
@@ -509,16 +500,14 @@ vioblk_notifyq(struct vioblk_dev *dev)
if ((secdata_desc->flags & VRING_DESC_F_NEXT) == 0) {
log_warnx("wr vioblk: unchained vioblk data "
"descriptor received (idx %d)", cmd_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
secdata = malloc(MAXPHYS);
if (secdata == NULL) {
log_warn("wr vioblk: malloc error, len %d",
secdata_desc->len);
- free(vr);
- return (0);
+ goto out;
}
secbias = 0;
@@ -529,17 +518,15 @@ vioblk_notifyq(struct vioblk_dev *dev)
"sector data @ 0x%llx",
secdata_desc->addr);
dump_descriptor_chain(desc, cmd_desc_idx);
- free(vr);
free(secdata);
- return (0);
+ goto out;
}
if (vioblk_do_write(dev, cmd.sector + secbias,
secdata, (ssize_t)secdata_desc->len)) {
log_warnx("wr vioblk: disk write error");
- free(vr);
free(secdata);
- return (0);
+ goto out;
}
secbias += secdata_desc->len / VIRTIO_BLK_SECTOR_SIZE;
@@ -559,8 +546,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
log_warnx("wr vioblk: can't write device status "
"data @ 0x%llx", ds_desc->addr);
dump_descriptor_chain(desc, cmd_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
ret = 1;
@@ -584,8 +570,7 @@ vioblk_notifyq(struct vioblk_dev *dev)
log_warnx("fl vioblk: can't write device status "
"data @ 0x%llx", ds_desc->addr);
dump_descriptor_chain(desc, cmd_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
ret = 1;
@@ -601,9 +586,8 @@ vioblk_notifyq(struct vioblk_dev *dev)
}
break;
}
-
+out:
free(vr);
-
return (ret);
}
@@ -810,8 +794,7 @@ vionet_enq_rx(struct vionet_dev *dev, ch
if (read_mem(q_gpa, vr, vr_sz)) {
log_warnx("rx enq: error reading gpa 0x%llx", q_gpa);
- free(vr);
- return (0);
+ goto out;
}
/* Compute offsets in ring of descriptors, avail ring, and used ring */
@@ -825,8 +808,7 @@ vionet_enq_rx(struct vionet_dev *dev, ch
if ((dev->vq[0].notified_avail & VIONET_QUEUE_MASK) == idx) {
log_warnx("vionet queue notify - no space, dropping packet");
- free(vr);
- return (0);
+ goto out;
}
hdr_desc_idx = avail->ring[idx] & VIONET_QUEUE_MASK;
@@ -839,16 +821,14 @@ vionet_enq_rx(struct vionet_dev *dev, ch
if ((pkt_desc->flags & VRING_DESC_F_WRITE) == 0) {
log_warnx("unexpected readable rx descriptor %d",
pkt_desc_idx);
- free(vr);
- return (0);
+ goto out;
}
/* Write packet to descriptor ring */
if (write_mem(pkt_desc->addr, pkt, sz)) {
log_warnx("vionet: rx enq packet write_mem error @ "
"0x%llx", pkt_desc->addr);
- free(vr);
- return (0);
+ goto out;
}
ret = 1;
@@ -868,9 +848,8 @@ vionet_enq_rx(struct vionet_dev *dev, ch
if (write_mem(q_gpa + off, &used->idx, sizeof used->idx))
log_warnx("vionet: error writing vio ring");
}
-
+out:
free(vr);
-
return (ret);
}