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 <colyli@xxxxxxx> Cc: Jianpeng Ma <jianpeng.ma@xxxxxxxxx> Cc: Qiaowei Ren <qiaowei.ren@xxxxxxxxx> --- 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