From 251562118487254640175ce9767b0847ca840ec5 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Tue, 29 Mar 2022 16:07:19 +0900 Subject: [PATCH] bdev/delay: Find delay_bdev directly from g_delay_node list spdk_bdev_get_by_name() uses RB tree and is fast. However it is not secure from race condition. We can use spdk_bdev_open_ext() instead but what we want to get is not spdk_bdev but vbdev_delay. vbdev_delay is managed by the g_delay_nodes list. The g_delay_nodes includes only vbdev_delay. Even if its performance is O(N), it is more intutive, more secure, and small list. So replace spdk_bdev_get_by_name() by simple list traversal. Signed-off-by: Shuhei Matsumoto Change-Id: I3e184066e237e10132523591133900231055b5af Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12069 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- module/bdev/delay/vbdev_delay.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/module/bdev/delay/vbdev_delay.c b/module/bdev/delay/vbdev_delay.c index 6e2eaaf9a..2cc28d453 100644 --- a/module/bdev/delay/vbdev_delay.c +++ b/module/bdev/delay/vbdev_delay.c @@ -646,18 +646,18 @@ vbdev_delay_insert_association(const char *bdev_name, const char *vbdev_name, int vbdev_delay_update_latency_value(char *delay_name, uint64_t latency_us, enum delay_io_type type) { - struct spdk_bdev *delay_bdev; struct vbdev_delay *delay_node; uint64_t ticks_mhz = spdk_get_ticks_hz() / SPDK_SEC_TO_USEC; - delay_bdev = spdk_bdev_get_by_name(delay_name); - if (delay_bdev == NULL) { - return -ENODEV; - } else if (delay_bdev->module != &delay_if) { - return -EINVAL; + TAILQ_FOREACH(delay_node, &g_delay_nodes, link) { + if (strcmp(delay_node->delay_bdev.name, delay_name) == 0) { + break; + } } - delay_node = SPDK_CONTAINEROF(delay_bdev, struct vbdev_delay, delay_bdev); + if (delay_node == NULL) { + return -ENODEV; + } switch (type) { case DELAY_AVG_READ: