From 112a8b682d5ca5787400a5cc9cf2231cf1e7af15 Mon Sep 17 00:00:00 2001 From: paul luse Date: Sun, 19 May 2019 10:47:35 -0700 Subject: [PATCH] bdev/compress: fix issue with freeing mbufs in compress error path mbufs are freed with a single call to the first mbuf in the chain unless we hit an error before we chain them. So free them correctly when chained and loop through the array one at a time and free them that way if not. Signed-off-by: paul luse Change-Id: I80ebb86bc2147b42db89d24f8e985cacf7d4bceb Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/455019 Tested-by: SPDK CI Jenkins Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- lib/bdev/compress/vbdev_compress.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/bdev/compress/vbdev_compress.c b/lib/bdev/compress/vbdev_compress.c index ec238ad8c..f30df742a 100644 --- a/lib/bdev/compress/vbdev_compress.c +++ b/lib/bdev/compress/vbdev_compress.c @@ -511,17 +511,20 @@ _compress_operation(struct spdk_reduce_backing_dev *backing_dev, struct iovec *s /* We always expect 1 got queued, if 0 then we need to queue it up. */ if (rc == 1) { return 0; + } else { + /* we free mbufs differently depending on whether they were chained or not */ + rte_pktmbuf_free(comp_op->m_src); + rte_pktmbuf_free(comp_op->m_dst); + goto error_enqueue; } /* Error cleanup paths. */ - for (i = 0; i < dst_iovcnt; i++) { - rte_pktmbuf_free((struct rte_mbuf *)&dst_mbufs[i]); - } error_get_dst: for (i = 0; i < src_iovcnt; i++) { rte_pktmbuf_free((struct rte_mbuf *)&src_mbufs[i]); } error_get_src: +error_enqueue: rte_comp_op_free(comp_op); error_get_op: op_to_queue = calloc(1, sizeof(struct vbdev_comp_op));