[PATCH v7 07/16] bcache: nvm-pages fixes for bcache integration testing
From: Coly Li <hidden>
Date: 2021-04-09 16:44:41
Also in:
linux-bcache, nvdimm
Subsystem:
bcache (block layer cache), the rest · Maintainers:
Coly Li, Kent Overstreet, Linus Torvalds
There are two minor fixes in nvm-pages code, which can be added in next nvm-pages series. Then I can drop this patch. Signed-off-by: Coly Li <redacted> Cc: Jianpeng Ma <redacted> Cc: Qiaowei Ren <redacted> --- drivers/md/bcache/nvm-pages.c | 29 +++++++++++++++++++++-------- drivers/md/bcache/nvm-pages.h | 1 + 2 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/drivers/md/bcache/nvm-pages.c b/drivers/md/bcache/nvm-pages.c
index 2ba02091bccf..c3ab396a45fa 100644
--- a/drivers/md/bcache/nvm-pages.c
+++ b/drivers/md/bcache/nvm-pages.c@@ -73,24 +73,32 @@ static inline void remove_owner_space(struct bch_nvm_namespace *ns, static struct bch_nvm_pages_owner_head *find_owner_head(const char *owner_uuid, bool create) { struct bch_owner_list_head *owner_list_head = only_set->owner_list_head; + struct bch_nvm_pages_owner_head *owner_head = NULL; int i; + if (owner_list_head == NULL) + goto out; + for (i = 0; i < only_set->owner_list_used; i++) { - if (!memcmp(owner_uuid, owner_list_head->heads[i].uuid, 16)) - return &(owner_list_head->heads[i]); + if (!memcmp(owner_uuid, owner_list_head->heads[i].uuid, 16)) { + owner_head = &(owner_list_head->heads[i]); + break; + } } - if (create) { + if (!owner_head && create) { int used = only_set->owner_list_used; - BUG_ON(only_set->owner_list_size == used); - memcpy(owner_list_head->heads[used].uuid, owner_uuid, 16); + BUG_ON((used > 0) && (only_set->owner_list_size == used)); + memcpy_flushcache(owner_list_head->heads[used].uuid, owner_uuid, 16); only_set->owner_list_used++; owner_list_head->used++; - return &(owner_list_head->heads[used]); - } else - return NULL; + owner_head = &(owner_list_head->heads[used]); + } + +out: + return owner_head; } static struct bch_nvm_pgalloc_recs *find_empty_pgalloc_recs(void)
@@ -324,6 +332,10 @@ void *bch_nvm_alloc_pages(int order, const char *owner_uuid) mutex_lock(&only_set->lock); owner_head = find_owner_head(owner_uuid, true); + if (!owner_head) { + pr_err("can't find bch_nvm_pgalloc_recs by(uuid=%s)\n", owner_uuid); + goto unlock; + } for (j = 0; j < only_set->total_namespaces_nr; j++) { struct bch_nvm_namespace *ns = only_set->nss[j];
@@ -369,6 +381,7 @@ void *bch_nvm_alloc_pages(int order, const char *owner_uuid) } } +unlock: mutex_unlock(&only_set->lock); return kaddr; }
diff --git a/drivers/md/bcache/nvm-pages.h b/drivers/md/bcache/nvm-pages.h
index 87b1efc301c8..b8a5cd0890d3 100644
--- a/drivers/md/bcache/nvm-pages.h
+++ b/drivers/md/bcache/nvm-pages.h@@ -66,6 +66,7 @@ struct bch_nvm_pages_owner_head *bch_get_allocated_pages(const char *owner_uuid) #else static inline struct bch_nvm_namespace *bch_register_namespace(const char *dev_path) +{ return NULL; } static inline int bch_nvm_init(void)
--
2.26.2