From 6e947d19e24fb6cb0ea2fb1863cf5f82f546f664 Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Fri, 29 Mar 2019 12:46:48 +0100 Subject: [PATCH] blobstore: Add _spdk_blob_get_snapshot_and_clone_entries function Signed-off-by: Maciej Szwed Change-Id: Ic29496516a75d252c3d0fce9396434209eb620e8 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/449543 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/blob/blobstore.c | 51 +++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/lib/blob/blobstore.c b/lib/blob/blobstore.c index cd31cb1fc..0a86fea9b 100644 --- a/lib/blob/blobstore.c +++ b/lib/blob/blobstore.c @@ -2206,6 +2206,35 @@ _spdk_blob_lookup(struct spdk_blob_store *bs, spdk_blob_id blobid) return NULL; } +static void +_spdk_blob_get_snapshot_and_clone_entries(struct spdk_blob *blob, + struct spdk_blob_list **snapshot_entry, struct spdk_blob_list **clone_entry) +{ + assert(blob != NULL); + *snapshot_entry = NULL; + *clone_entry = NULL; + + if (blob->parent_id == SPDK_BLOBID_INVALID) { + return; + } + + TAILQ_FOREACH(*snapshot_entry, &blob->bs->snapshots, link) { + if ((*snapshot_entry)->id == blob->parent_id) { + break; + } + } + + if (*snapshot_entry != NULL) { + TAILQ_FOREACH(*clone_entry, &(*snapshot_entry)->clones, link) { + if ((*clone_entry)->id == blob->id) { + break; + } + } + + assert(clone_entry != NULL); + } +} + static int _spdk_bs_channel_create(void *io_device, void *ctx_buf) { @@ -2350,31 +2379,13 @@ _spdk_bs_blob_list_remove(struct spdk_blob *blob) { struct spdk_blob_list *snapshot_entry = NULL; struct spdk_blob_list *clone_entry = NULL; - spdk_blob_id snapshot_id; - assert(blob != NULL); + _spdk_blob_get_snapshot_and_clone_entries(blob, &snapshot_entry, &clone_entry); - snapshot_id = blob->parent_id; - if (snapshot_id == SPDK_BLOBID_INVALID) { + if (snapshot_entry == NULL) { return 0; } - TAILQ_FOREACH(snapshot_entry, &blob->bs->snapshots, link) { - if (snapshot_entry->id == snapshot_id) { - break; - } - } - - assert(snapshot_entry != NULL); - - TAILQ_FOREACH(clone_entry, &snapshot_entry->clones, link) { - if (clone_entry->id == blob->id) { - break; - } - } - - assert(clone_entry != NULL); - blob->parent_id = SPDK_BLOBID_INVALID; TAILQ_REMOVE(&snapshot_entry->clones, clone_entry, link); free(clone_entry);