From 7192849ed24874f3e9cc31e8a33a9b32c49b9506 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 7 Jul 2020 11:34:57 -0700 Subject: [PATCH] lib: add checks for return code of pthread_spin_init This function can fail with -EAGAIN or -ENOMEM so we should really check the return value. Change-Id: I4a443351f3c85032f47e8af9e70b6b71ba3413f5 Signed-off-by: Seth Howell Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3240 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Vitaliy Mysak Reviewed-by: Tomasz Zawadzki Reviewed-by: Shuhei Matsumoto Reviewed-by: Paul Luse --- lib/blobfs/blobfs.c | 13 +++++++++++-- lib/ftl/ftl_init.c | 7 ++++++- lib/jsonrpc/jsonrpc_server_tcp.c | 8 +++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/blobfs/blobfs.c b/lib/blobfs/blobfs.c index f46dd3ea3..3af6b0639 100644 --- a/lib/blobfs/blobfs.c +++ b/lib/blobfs/blobfs.c @@ -667,10 +667,15 @@ file_alloc(struct spdk_filesystem *fs) return NULL; } + if (pthread_spin_init(&file->lock, 0)) { + free(file->tree); + free(file); + return NULL; + } + file->fs = fs; TAILQ_INIT(&file->open_requests); TAILQ_INIT(&file->sync_requests); - pthread_spin_init(&file->lock, 0); TAILQ_INSERT_TAIL(&fs->files, file, tailq); file->priority = SPDK_FILE_PRIORITY_LOW; return file; @@ -1996,11 +2001,15 @@ spdk_fs_alloc_thread_ctx(struct spdk_filesystem *fs) return NULL; } + if (pthread_spin_init(&ctx->ch.lock, 0)) { + free(ctx); + return NULL; + } + fs_channel_create(fs, &ctx->ch, 512); ctx->ch.send_request = fs->send_request; ctx->ch.sync = 1; - pthread_spin_init(&ctx->ch.lock, 0); return ctx; } diff --git a/lib/ftl/ftl_init.c b/lib/ftl/ftl_init.c index 8e9ec47df..15a8c21c9 100644 --- a/lib/ftl/ftl_init.c +++ b/lib/ftl/ftl_init.c @@ -133,13 +133,18 @@ static int ftl_band_init_md(struct ftl_band *band) { struct ftl_lba_map *lba_map = &band->lba_map; + int rc; lba_map->vld = spdk_bit_array_create(ftl_get_num_blocks_in_band(band->dev)); if (!lba_map->vld) { return -ENOMEM; } - pthread_spin_init(&lba_map->lock, PTHREAD_PROCESS_PRIVATE); + rc = pthread_spin_init(&lba_map->lock, PTHREAD_PROCESS_PRIVATE); + if (rc) { + spdk_bit_array_free(&lba_map->vld); + return rc; + } ftl_band_md_clear(band); return 0; } diff --git a/lib/jsonrpc/jsonrpc_server_tcp.c b/lib/jsonrpc/jsonrpc_server_tcp.c index 9effc41bb..1e38f713f 100644 --- a/lib/jsonrpc/jsonrpc_server_tcp.c +++ b/lib/jsonrpc/jsonrpc_server_tcp.c @@ -216,15 +216,21 @@ jsonrpc_server_accept(struct spdk_jsonrpc_server *server) conn->closed = false; conn->recv_len = 0; conn->outstanding_requests = 0; - pthread_spin_init(&conn->queue_lock, PTHREAD_PROCESS_PRIVATE); STAILQ_INIT(&conn->send_queue); conn->send_request = NULL; + if (pthread_spin_init(&conn->queue_lock, PTHREAD_PROCESS_PRIVATE)) { + SPDK_ERRLOG("Unable to create queue lock for socket: %d", conn->sockfd); + close(conn->sockfd); + return -1; + } + flag = fcntl(conn->sockfd, F_GETFL); if (fcntl(conn->sockfd, F_SETFL, flag | O_NONBLOCK) < 0) { SPDK_ERRLOG("fcntl can't set nonblocking mode for socket, fd: %d (%s)\n", conn->sockfd, spdk_strerror(errno)); close(conn->sockfd); + pthread_spin_destroy(&conn->queue_lock); return -1; }