xref: /spdk/module/bdev/raid/bdev_raid.c (revision 877573897ad52be4fa8989f7617bd655b87e05c4)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2018 Intel Corporation.
3  *   All rights reserved.
4  *   Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5  */
6 
7 #include "bdev_raid.h"
8 #include "spdk/env.h"
9 #include "spdk/thread.h"
10 #include "spdk/log.h"
11 #include "spdk/string.h"
12 #include "spdk/util.h"
13 #include "spdk/json.h"
14 #include "spdk/string.h"
15 
16 static bool g_shutdown_started = false;
17 
18 /* List of all raid bdevs */
19 struct raid_all_tailq g_raid_bdev_list = TAILQ_HEAD_INITIALIZER(g_raid_bdev_list);
20 
21 static TAILQ_HEAD(, raid_bdev_module) g_raid_modules = TAILQ_HEAD_INITIALIZER(g_raid_modules);
22 
23 static struct raid_bdev_module *
24 raid_bdev_module_find(enum raid_level level)
25 {
26 	struct raid_bdev_module *raid_module;
27 
28 	TAILQ_FOREACH(raid_module, &g_raid_modules, link) {
29 		if (raid_module->level == level) {
30 			return raid_module;
31 		}
32 	}
33 
34 	return NULL;
35 }
36 
37 void
38 raid_bdev_module_list_add(struct raid_bdev_module *raid_module)
39 {
40 	if (raid_bdev_module_find(raid_module->level) != NULL) {
41 		SPDK_ERRLOG("module for raid level '%s' already registered.\n",
42 			    raid_bdev_level_to_str(raid_module->level));
43 		assert(false);
44 	} else {
45 		TAILQ_INSERT_TAIL(&g_raid_modules, raid_module, link);
46 	}
47 }
48 
49 /* Function declarations */
50 static void	raid_bdev_examine(struct spdk_bdev *bdev);
51 static int	raid_bdev_init(void);
52 static void	raid_bdev_deconfigure(struct raid_bdev *raid_bdev,
53 				      raid_bdev_destruct_cb cb_fn, void *cb_arg);
54 
55 /*
56  * brief:
57  * raid_bdev_create_cb function is a cb function for raid bdev which creates the
58  * hierarchy from raid bdev to base bdev io channels. It will be called per core
59  * params:
60  * io_device - pointer to raid bdev io device represented by raid_bdev
61  * ctx_buf - pointer to context buffer for raid bdev io channel
62  * returns:
63  * 0 - success
64  * non zero - failure
65  */
66 static int
67 raid_bdev_create_cb(void *io_device, void *ctx_buf)
68 {
69 	struct raid_bdev            *raid_bdev = io_device;
70 	struct raid_bdev_io_channel *raid_ch = ctx_buf;
71 	uint8_t i;
72 	int ret = 0;
73 
74 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_create_cb, %p\n", raid_ch);
75 
76 	assert(raid_bdev != NULL);
77 	assert(raid_bdev->state == RAID_BDEV_STATE_ONLINE);
78 
79 	raid_ch->num_channels = raid_bdev->num_base_bdevs;
80 
81 	raid_ch->base_channel = calloc(raid_ch->num_channels,
82 				       sizeof(struct spdk_io_channel *));
83 	if (!raid_ch->base_channel) {
84 		SPDK_ERRLOG("Unable to allocate base bdevs io channel\n");
85 		return -ENOMEM;
86 	}
87 	for (i = 0; i < raid_ch->num_channels; i++) {
88 		/*
89 		 * Get the spdk_io_channel for all the base bdevs. This is used during
90 		 * split logic to send the respective child bdev ios to respective base
91 		 * bdev io channel.
92 		 */
93 		raid_ch->base_channel[i] = spdk_bdev_get_io_channel(
94 						   raid_bdev->base_bdev_info[i].desc);
95 		if (!raid_ch->base_channel[i]) {
96 			SPDK_ERRLOG("Unable to create io channel for base bdev\n");
97 			ret = -ENOMEM;
98 			break;
99 		}
100 	}
101 
102 	if (!ret && raid_bdev->module->get_io_channel) {
103 		raid_ch->module_channel = raid_bdev->module->get_io_channel(raid_bdev);
104 		if (!raid_ch->module_channel) {
105 			SPDK_ERRLOG("Unable to create io channel for raid module\n");
106 			ret = -ENOMEM;
107 		}
108 	}
109 
110 	if (ret) {
111 		uint8_t j;
112 
113 		for (j = 0; j < i; j++) {
114 			spdk_put_io_channel(raid_ch->base_channel[j]);
115 		}
116 		free(raid_ch->base_channel);
117 		raid_ch->base_channel = NULL;
118 	}
119 	return ret;
120 }
121 
122 /*
123  * brief:
124  * raid_bdev_destroy_cb function is a cb function for raid bdev which deletes the
125  * hierarchy from raid bdev to base bdev io channels. It will be called per core
126  * params:
127  * io_device - pointer to raid bdev io device represented by raid_bdev
128  * ctx_buf - pointer to context buffer for raid bdev io channel
129  * returns:
130  * none
131  */
132 static void
133 raid_bdev_destroy_cb(void *io_device, void *ctx_buf)
134 {
135 	struct raid_bdev_io_channel *raid_ch = ctx_buf;
136 	uint8_t i;
137 
138 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_destroy_cb\n");
139 
140 	assert(raid_ch != NULL);
141 	assert(raid_ch->base_channel);
142 
143 	if (raid_ch->module_channel) {
144 		spdk_put_io_channel(raid_ch->module_channel);
145 	}
146 
147 	for (i = 0; i < raid_ch->num_channels; i++) {
148 		/* Free base bdev channels */
149 		assert(raid_ch->base_channel[i] != NULL);
150 		spdk_put_io_channel(raid_ch->base_channel[i]);
151 	}
152 	free(raid_ch->base_channel);
153 	raid_ch->base_channel = NULL;
154 }
155 
156 /*
157  * brief:
158  * raid_bdev_cleanup is used to cleanup raid_bdev related data
159  * structures.
160  * params:
161  * raid_bdev - pointer to raid_bdev
162  * returns:
163  * none
164  */
165 static void
166 raid_bdev_cleanup(struct raid_bdev *raid_bdev)
167 {
168 	struct raid_base_bdev_info *base_info;
169 
170 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_cleanup, %p name %s, state %s\n",
171 		      raid_bdev, raid_bdev->bdev.name, raid_bdev_state_to_str(raid_bdev->state));
172 	assert(raid_bdev->state != RAID_BDEV_STATE_ONLINE);
173 
174 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
175 		assert(base_info->bdev == NULL);
176 		assert(base_info->desc == NULL);
177 		free(base_info->name);
178 	}
179 
180 	TAILQ_REMOVE(&g_raid_bdev_list, raid_bdev, global_link);
181 	free(raid_bdev->base_bdev_info);
182 }
183 
184 static void
185 raid_bdev_free(struct raid_bdev *raid_bdev)
186 {
187 	free(raid_bdev->bdev.name);
188 	free(raid_bdev);
189 }
190 
191 static void
192 raid_bdev_cleanup_and_free(struct raid_bdev *raid_bdev)
193 {
194 	raid_bdev_cleanup(raid_bdev);
195 	raid_bdev_free(raid_bdev);
196 }
197 
198 /*
199  * brief:
200  * wrapper for the bdev close operation
201  * params:
202  * base_info - raid base bdev info
203  * returns:
204  */
205 static void
206 _raid_bdev_free_base_bdev_resource(void *ctx)
207 {
208 	struct spdk_bdev_desc *desc = ctx;
209 
210 	spdk_bdev_close(desc);
211 }
212 
213 
214 /*
215  * brief:
216  * free resource of base bdev for raid bdev
217  * params:
218  * raid_bdev - pointer to raid bdev
219  * base_info - raid base bdev info
220  * returns:
221  * 0 - success
222  * non zero - failure
223  */
224 static void
225 raid_bdev_free_base_bdev_resource(struct raid_bdev *raid_bdev,
226 				  struct raid_base_bdev_info *base_info)
227 {
228 	free(base_info->name);
229 	base_info->name = NULL;
230 
231 	if (base_info->bdev == NULL) {
232 		return;
233 	}
234 
235 	assert(base_info->desc);
236 	spdk_bdev_module_release_bdev(base_info->bdev);
237 	if (base_info->thread && base_info->thread != spdk_get_thread()) {
238 		spdk_thread_send_msg(base_info->thread, _raid_bdev_free_base_bdev_resource, base_info->desc);
239 	} else {
240 		spdk_bdev_close(base_info->desc);
241 	}
242 	base_info->desc = NULL;
243 	base_info->bdev = NULL;
244 
245 	assert(raid_bdev->num_base_bdevs_discovered);
246 	raid_bdev->num_base_bdevs_discovered--;
247 }
248 
249 static void
250 raid_bdev_io_device_unregister_cb(void *io_device)
251 {
252 	struct raid_bdev *raid_bdev = io_device;
253 
254 	if (raid_bdev->num_base_bdevs_discovered == 0) {
255 		/* Free raid_bdev when there are no base bdevs left */
256 		SPDK_DEBUGLOG(bdev_raid, "raid bdev base bdevs is 0, going to free all in destruct\n");
257 		raid_bdev_cleanup(raid_bdev);
258 		spdk_bdev_destruct_done(&raid_bdev->bdev, 0);
259 		raid_bdev_free(raid_bdev);
260 	} else {
261 		spdk_bdev_destruct_done(&raid_bdev->bdev, 0);
262 	}
263 }
264 
265 void
266 raid_bdev_module_stop_done(struct raid_bdev *raid_bdev)
267 {
268 	if (raid_bdev->state != RAID_BDEV_STATE_CONFIGURING) {
269 		spdk_io_device_unregister(raid_bdev, raid_bdev_io_device_unregister_cb);
270 	}
271 }
272 
273 /*
274  * brief:
275  * raid_bdev_destruct is the destruct function table pointer for raid bdev
276  * params:
277  * ctxt - pointer to raid_bdev
278  * returns:
279  * 1 - success (deferred completion)
280  */
281 static int
282 raid_bdev_destruct(void *ctxt)
283 {
284 	struct raid_bdev *raid_bdev = ctxt;
285 	struct raid_base_bdev_info *base_info;
286 
287 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_destruct\n");
288 
289 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
290 		/*
291 		 * Close all base bdev descriptors for which call has come from below
292 		 * layers.  Also close the descriptors if we have started shutdown.
293 		 */
294 		if (g_shutdown_started || base_info->remove_scheduled == true) {
295 			raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
296 		}
297 	}
298 
299 	if (g_shutdown_started) {
300 		raid_bdev->state = RAID_BDEV_STATE_OFFLINE;
301 	}
302 
303 	if (raid_bdev->module->stop != NULL) {
304 		if (raid_bdev->module->stop(raid_bdev) == false) {
305 			return 1;
306 		}
307 	}
308 
309 	raid_bdev_module_stop_done(raid_bdev);
310 
311 	return 1;
312 }
313 
314 void
315 raid_bdev_io_complete(struct raid_bdev_io *raid_io, enum spdk_bdev_io_status status)
316 {
317 	struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(raid_io);
318 
319 	spdk_bdev_io_complete(bdev_io, status);
320 }
321 
322 /*
323  * brief:
324  * raid_bdev_io_complete_part - signal the completion of a part of the expected
325  * base bdev IOs and complete the raid_io if this is the final expected IO.
326  * The caller should first set raid_io->base_bdev_io_remaining. This function
327  * will decrement this counter by the value of the 'completed' parameter and
328  * complete the raid_io if the counter reaches 0. The caller is free to
329  * interpret the 'base_bdev_io_remaining' and 'completed' values as needed,
330  * it can represent e.g. blocks or IOs.
331  * params:
332  * raid_io - pointer to raid_bdev_io
333  * completed - the part of the raid_io that has been completed
334  * status - status of the base IO
335  * returns:
336  * true - if the raid_io is completed
337  * false - otherwise
338  */
339 bool
340 raid_bdev_io_complete_part(struct raid_bdev_io *raid_io, uint64_t completed,
341 			   enum spdk_bdev_io_status status)
342 {
343 	assert(raid_io->base_bdev_io_remaining >= completed);
344 	raid_io->base_bdev_io_remaining -= completed;
345 
346 	if (status != SPDK_BDEV_IO_STATUS_SUCCESS) {
347 		raid_io->base_bdev_io_status = status;
348 	}
349 
350 	if (raid_io->base_bdev_io_remaining == 0) {
351 		raid_bdev_io_complete(raid_io, raid_io->base_bdev_io_status);
352 		return true;
353 	} else {
354 		return false;
355 	}
356 }
357 
358 /*
359  * brief:
360  * raid_bdev_queue_io_wait function processes the IO which failed to submit.
361  * It will try to queue the IOs after storing the context to bdev wait queue logic.
362  * params:
363  * raid_io - pointer to raid_bdev_io
364  * bdev - the block device that the IO is submitted to
365  * ch - io channel
366  * cb_fn - callback when the spdk_bdev_io for bdev becomes available
367  * returns:
368  * none
369  */
370 void
371 raid_bdev_queue_io_wait(struct raid_bdev_io *raid_io, struct spdk_bdev *bdev,
372 			struct spdk_io_channel *ch, spdk_bdev_io_wait_cb cb_fn)
373 {
374 	raid_io->waitq_entry.bdev = bdev;
375 	raid_io->waitq_entry.cb_fn = cb_fn;
376 	raid_io->waitq_entry.cb_arg = raid_io;
377 	spdk_bdev_queue_io_wait(bdev, ch, &raid_io->waitq_entry);
378 }
379 
380 static void
381 raid_base_bdev_reset_complete(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
382 {
383 	struct raid_bdev_io *raid_io = cb_arg;
384 
385 	spdk_bdev_free_io(bdev_io);
386 
387 	raid_bdev_io_complete_part(raid_io, 1, success ?
388 				   SPDK_BDEV_IO_STATUS_SUCCESS :
389 				   SPDK_BDEV_IO_STATUS_FAILED);
390 }
391 
392 static void raid_bdev_submit_reset_request(struct raid_bdev_io *raid_io);
393 
394 static void
395 _raid_bdev_submit_reset_request(void *_raid_io)
396 {
397 	struct raid_bdev_io *raid_io = _raid_io;
398 
399 	raid_bdev_submit_reset_request(raid_io);
400 }
401 
402 /*
403  * brief:
404  * raid_bdev_submit_reset_request function submits reset requests
405  * to member disks; it will submit as many as possible unless a reset fails with -ENOMEM, in
406  * which case it will queue it for later submission
407  * params:
408  * raid_io
409  * returns:
410  * none
411  */
412 static void
413 raid_bdev_submit_reset_request(struct raid_bdev_io *raid_io)
414 {
415 	struct raid_bdev		*raid_bdev;
416 	int				ret;
417 	uint8_t				i;
418 	struct raid_base_bdev_info	*base_info;
419 	struct spdk_io_channel		*base_ch;
420 
421 	raid_bdev = raid_io->raid_bdev;
422 
423 	if (raid_io->base_bdev_io_remaining == 0) {
424 		raid_io->base_bdev_io_remaining = raid_bdev->num_base_bdevs;
425 	}
426 
427 	while (raid_io->base_bdev_io_submitted < raid_bdev->num_base_bdevs) {
428 		i = raid_io->base_bdev_io_submitted;
429 		base_info = &raid_bdev->base_bdev_info[i];
430 		base_ch = raid_io->raid_ch->base_channel[i];
431 		ret = spdk_bdev_reset(base_info->desc, base_ch,
432 				      raid_base_bdev_reset_complete, raid_io);
433 		if (ret == 0) {
434 			raid_io->base_bdev_io_submitted++;
435 		} else if (ret == -ENOMEM) {
436 			raid_bdev_queue_io_wait(raid_io, base_info->bdev, base_ch,
437 						_raid_bdev_submit_reset_request);
438 			return;
439 		} else {
440 			SPDK_ERRLOG("bdev io submit error not due to ENOMEM, it should not happen\n");
441 			assert(false);
442 			raid_bdev_io_complete(raid_io, SPDK_BDEV_IO_STATUS_FAILED);
443 			return;
444 		}
445 	}
446 }
447 
448 /*
449  * brief:
450  * Callback function to spdk_bdev_io_get_buf.
451  * params:
452  * ch - pointer to raid bdev io channel
453  * bdev_io - pointer to parent bdev_io on raid bdev device
454  * success - True if buffer is allocated or false otherwise.
455  * returns:
456  * none
457  */
458 static void
459 raid_bdev_get_buf_cb(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io,
460 		     bool success)
461 {
462 	struct raid_bdev_io *raid_io = (struct raid_bdev_io *)bdev_io->driver_ctx;
463 
464 	if (!success) {
465 		raid_bdev_io_complete(raid_io, SPDK_BDEV_IO_STATUS_FAILED);
466 		return;
467 	}
468 
469 	raid_io->raid_bdev->module->submit_rw_request(raid_io);
470 }
471 
472 /*
473  * brief:
474  * raid_bdev_submit_request function is the submit_request function pointer of
475  * raid bdev function table. This is used to submit the io on raid_bdev to below
476  * layers.
477  * params:
478  * ch - pointer to raid bdev io channel
479  * bdev_io - pointer to parent bdev_io on raid bdev device
480  * returns:
481  * none
482  */
483 static void
484 raid_bdev_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_io)
485 {
486 	struct raid_bdev_io *raid_io = (struct raid_bdev_io *)bdev_io->driver_ctx;
487 
488 	raid_io->raid_bdev = bdev_io->bdev->ctxt;
489 	raid_io->raid_ch = spdk_io_channel_get_ctx(ch);
490 	raid_io->base_bdev_io_remaining = 0;
491 	raid_io->base_bdev_io_submitted = 0;
492 	raid_io->base_bdev_io_status = SPDK_BDEV_IO_STATUS_SUCCESS;
493 
494 	switch (bdev_io->type) {
495 	case SPDK_BDEV_IO_TYPE_READ:
496 		spdk_bdev_io_get_buf(bdev_io, raid_bdev_get_buf_cb,
497 				     bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen);
498 		break;
499 	case SPDK_BDEV_IO_TYPE_WRITE:
500 		raid_io->raid_bdev->module->submit_rw_request(raid_io);
501 		break;
502 
503 	case SPDK_BDEV_IO_TYPE_RESET:
504 		raid_bdev_submit_reset_request(raid_io);
505 		break;
506 
507 	case SPDK_BDEV_IO_TYPE_FLUSH:
508 	case SPDK_BDEV_IO_TYPE_UNMAP:
509 		raid_io->raid_bdev->module->submit_null_payload_request(raid_io);
510 		break;
511 
512 	default:
513 		SPDK_ERRLOG("submit request, invalid io type %u\n", bdev_io->type);
514 		raid_bdev_io_complete(raid_io, SPDK_BDEV_IO_STATUS_FAILED);
515 		break;
516 	}
517 }
518 
519 /*
520  * brief:
521  * _raid_bdev_io_type_supported checks whether io_type is supported in
522  * all base bdev modules of raid bdev module. If anyone among the base_bdevs
523  * doesn't support, the raid device doesn't supports.
524  *
525  * params:
526  * raid_bdev - pointer to raid bdev context
527  * io_type - io type
528  * returns:
529  * true - io_type is supported
530  * false - io_type is not supported
531  */
532 inline static bool
533 _raid_bdev_io_type_supported(struct raid_bdev *raid_bdev, enum spdk_bdev_io_type io_type)
534 {
535 	struct raid_base_bdev_info *base_info;
536 
537 	if (io_type == SPDK_BDEV_IO_TYPE_FLUSH ||
538 	    io_type == SPDK_BDEV_IO_TYPE_UNMAP) {
539 		if (raid_bdev->module->submit_null_payload_request == NULL) {
540 			return false;
541 		}
542 	}
543 
544 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
545 		if (base_info->bdev == NULL) {
546 			assert(false);
547 			continue;
548 		}
549 
550 		if (spdk_bdev_io_type_supported(base_info->bdev, io_type) == false) {
551 			return false;
552 		}
553 	}
554 
555 	return true;
556 }
557 
558 /*
559  * brief:
560  * raid_bdev_io_type_supported is the io_supported function for bdev function
561  * table which returns whether the particular io type is supported or not by
562  * raid bdev module
563  * params:
564  * ctx - pointer to raid bdev context
565  * type - io type
566  * returns:
567  * true - io_type is supported
568  * false - io_type is not supported
569  */
570 static bool
571 raid_bdev_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type)
572 {
573 	switch (io_type) {
574 	case SPDK_BDEV_IO_TYPE_READ:
575 	case SPDK_BDEV_IO_TYPE_WRITE:
576 		return true;
577 
578 	case SPDK_BDEV_IO_TYPE_FLUSH:
579 	case SPDK_BDEV_IO_TYPE_RESET:
580 	case SPDK_BDEV_IO_TYPE_UNMAP:
581 		return _raid_bdev_io_type_supported(ctx, io_type);
582 
583 	default:
584 		return false;
585 	}
586 
587 	return false;
588 }
589 
590 /*
591  * brief:
592  * raid_bdev_get_io_channel is the get_io_channel function table pointer for
593  * raid bdev. This is used to return the io channel for this raid bdev
594  * params:
595  * ctxt - pointer to raid_bdev
596  * returns:
597  * pointer to io channel for raid bdev
598  */
599 static struct spdk_io_channel *
600 raid_bdev_get_io_channel(void *ctxt)
601 {
602 	struct raid_bdev *raid_bdev = ctxt;
603 
604 	return spdk_get_io_channel(raid_bdev);
605 }
606 
607 void
608 raid_bdev_write_info_json(struct raid_bdev *raid_bdev, struct spdk_json_write_ctx *w)
609 {
610 	struct raid_base_bdev_info *base_info;
611 
612 	assert(raid_bdev != NULL);
613 
614 	spdk_json_write_named_uint32(w, "strip_size_kb", raid_bdev->strip_size_kb);
615 	spdk_json_write_named_string(w, "state", raid_bdev_state_to_str(raid_bdev->state));
616 	spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->level));
617 	spdk_json_write_named_uint32(w, "num_base_bdevs", raid_bdev->num_base_bdevs);
618 	spdk_json_write_named_uint32(w, "num_base_bdevs_discovered", raid_bdev->num_base_bdevs_discovered);
619 	spdk_json_write_name(w, "base_bdevs_list");
620 	spdk_json_write_array_begin(w);
621 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
622 		if (base_info->bdev) {
623 			spdk_json_write_string(w, base_info->bdev->name);
624 		} else {
625 			spdk_json_write_null(w);
626 		}
627 	}
628 	spdk_json_write_array_end(w);
629 }
630 
631 /*
632  * brief:
633  * raid_bdev_dump_info_json is the function table pointer for raid bdev
634  * params:
635  * ctx - pointer to raid_bdev
636  * w - pointer to json context
637  * returns:
638  * 0 - success
639  * non zero - failure
640  */
641 static int
642 raid_bdev_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
643 {
644 	struct raid_bdev *raid_bdev = ctx;
645 
646 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_dump_config_json\n");
647 
648 	/* Dump the raid bdev configuration related information */
649 	spdk_json_write_named_object_begin(w, "raid");
650 	raid_bdev_write_info_json(raid_bdev, w);
651 	spdk_json_write_object_end(w);
652 
653 	return 0;
654 }
655 
656 /*
657  * brief:
658  * raid_bdev_write_config_json is the function table pointer for raid bdev
659  * params:
660  * bdev - pointer to spdk_bdev
661  * w - pointer to json context
662  * returns:
663  * none
664  */
665 static void
666 raid_bdev_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w)
667 {
668 	struct raid_bdev *raid_bdev = bdev->ctxt;
669 	struct raid_base_bdev_info *base_info;
670 
671 	spdk_json_write_object_begin(w);
672 
673 	spdk_json_write_named_string(w, "method", "bdev_raid_create");
674 
675 	spdk_json_write_named_object_begin(w, "params");
676 	spdk_json_write_named_string(w, "name", bdev->name);
677 	spdk_json_write_named_uint32(w, "strip_size_kb", raid_bdev->strip_size_kb);
678 	spdk_json_write_named_string(w, "raid_level", raid_bdev_level_to_str(raid_bdev->level));
679 
680 	spdk_json_write_named_array_begin(w, "base_bdevs");
681 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
682 		if (base_info->bdev) {
683 			spdk_json_write_string(w, base_info->bdev->name);
684 		}
685 	}
686 	spdk_json_write_array_end(w);
687 	spdk_json_write_object_end(w);
688 
689 	spdk_json_write_object_end(w);
690 }
691 
692 static int
693 raid_bdev_get_memory_domains(void *ctx, struct spdk_memory_domain **domains, int array_size)
694 {
695 	struct raid_bdev *raid_bdev = ctx;
696 	struct spdk_bdev *base_bdev;
697 	uint32_t i;
698 	int domains_count = 0, rc;
699 
700 	/* First loop to get the number of memory domains */
701 	for (i = 0; i < raid_bdev->num_base_bdevs; i++) {
702 		base_bdev = raid_bdev->base_bdev_info[i].bdev;
703 		rc = spdk_bdev_get_memory_domains(base_bdev, NULL, 0);
704 		if (rc < 0) {
705 			return rc;
706 		}
707 		domains_count += rc;
708 	}
709 
710 	if (!domains || array_size < domains_count) {
711 		return domains_count;
712 	}
713 
714 	for (i = 0; i < raid_bdev->num_base_bdevs; i++) {
715 		base_bdev = raid_bdev->base_bdev_info[i].bdev;
716 		rc = spdk_bdev_get_memory_domains(base_bdev, domains, array_size);
717 		if (rc < 0) {
718 			return rc;
719 		}
720 		domains += rc;
721 		array_size -= rc;
722 	}
723 
724 	return domains_count;
725 }
726 
727 /* g_raid_bdev_fn_table is the function table for raid bdev */
728 static const struct spdk_bdev_fn_table g_raid_bdev_fn_table = {
729 	.destruct		= raid_bdev_destruct,
730 	.submit_request		= raid_bdev_submit_request,
731 	.io_type_supported	= raid_bdev_io_type_supported,
732 	.get_io_channel		= raid_bdev_get_io_channel,
733 	.dump_info_json		= raid_bdev_dump_info_json,
734 	.write_config_json	= raid_bdev_write_config_json,
735 	.get_memory_domains	= raid_bdev_get_memory_domains,
736 };
737 
738 struct raid_bdev *
739 raid_bdev_find_by_name(const char *name)
740 {
741 	struct raid_bdev *raid_bdev;
742 
743 	TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) {
744 		if (strcmp(raid_bdev->bdev.name, name) == 0) {
745 			return raid_bdev;
746 		}
747 	}
748 
749 	return NULL;
750 }
751 
752 static struct {
753 	const char *name;
754 	enum raid_level value;
755 } g_raid_level_names[] = {
756 	{ "raid0", RAID0 },
757 	{ "0", RAID0 },
758 	{ "raid5f", RAID5F },
759 	{ "5f", RAID5F },
760 	{ "concat", CONCAT },
761 	{ }
762 };
763 
764 static struct {
765 	const char *name;
766 	enum raid_bdev_state value;
767 } g_raid_state_names[] = {
768 	{ "online", RAID_BDEV_STATE_ONLINE },
769 	{ "configuring", RAID_BDEV_STATE_CONFIGURING },
770 	{ "offline", RAID_BDEV_STATE_OFFLINE },
771 	{ }
772 };
773 
774 /* We have to use the typedef in the function declaration to appease astyle. */
775 typedef enum raid_level raid_level_t;
776 typedef enum raid_bdev_state raid_bdev_state_t;
777 
778 raid_level_t
779 raid_bdev_str_to_level(const char *str)
780 {
781 	unsigned int i;
782 
783 	assert(str != NULL);
784 
785 	for (i = 0; g_raid_level_names[i].name != NULL; i++) {
786 		if (strcasecmp(g_raid_level_names[i].name, str) == 0) {
787 			return g_raid_level_names[i].value;
788 		}
789 	}
790 
791 	return INVALID_RAID_LEVEL;
792 }
793 
794 const char *
795 raid_bdev_level_to_str(enum raid_level level)
796 {
797 	unsigned int i;
798 
799 	for (i = 0; g_raid_level_names[i].name != NULL; i++) {
800 		if (g_raid_level_names[i].value == level) {
801 			return g_raid_level_names[i].name;
802 		}
803 	}
804 
805 	return "";
806 }
807 
808 raid_bdev_state_t
809 raid_bdev_str_to_state(const char *str)
810 {
811 	unsigned int i;
812 
813 	assert(str != NULL);
814 
815 	for (i = 0; g_raid_state_names[i].name != NULL; i++) {
816 		if (strcasecmp(g_raid_state_names[i].name, str) == 0) {
817 			return g_raid_state_names[i].value;
818 		}
819 	}
820 
821 	return RAID_BDEV_STATE_MAX;
822 }
823 
824 const char *
825 raid_bdev_state_to_str(enum raid_bdev_state state)
826 {
827 	unsigned int i;
828 
829 	for (i = 0; g_raid_state_names[i].name != NULL; i++) {
830 		if (g_raid_state_names[i].value == state) {
831 			return g_raid_state_names[i].name;
832 		}
833 	}
834 
835 	assert(false);
836 	return "";
837 }
838 
839 /*
840  * brief:
841  * raid_bdev_fini_start is called when bdev layer is starting the
842  * shutdown process
843  * params:
844  * none
845  * returns:
846  * none
847  */
848 static void
849 raid_bdev_fini_start(void)
850 {
851 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_fini_start\n");
852 	g_shutdown_started = true;
853 }
854 
855 /*
856  * brief:
857  * raid_bdev_exit is called on raid bdev module exit time by bdev layer
858  * params:
859  * none
860  * returns:
861  * none
862  */
863 static void
864 raid_bdev_exit(void)
865 {
866 	struct raid_bdev *raid_bdev, *tmp;
867 
868 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_exit\n");
869 
870 	TAILQ_FOREACH_SAFE(raid_bdev, &g_raid_bdev_list, global_link, tmp) {
871 		raid_bdev_cleanup_and_free(raid_bdev);
872 	}
873 }
874 
875 /*
876  * brief:
877  * raid_bdev_get_ctx_size is used to return the context size of bdev_io for raid
878  * module
879  * params:
880  * none
881  * returns:
882  * size of spdk_bdev_io context for raid
883  */
884 static int
885 raid_bdev_get_ctx_size(void)
886 {
887 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_get_ctx_size\n");
888 	return sizeof(struct raid_bdev_io);
889 }
890 
891 static struct spdk_bdev_module g_raid_if = {
892 	.name = "raid",
893 	.module_init = raid_bdev_init,
894 	.fini_start = raid_bdev_fini_start,
895 	.module_fini = raid_bdev_exit,
896 	.get_ctx_size = raid_bdev_get_ctx_size,
897 	.examine_config = raid_bdev_examine,
898 	.async_init = false,
899 	.async_fini = false,
900 };
901 SPDK_BDEV_MODULE_REGISTER(raid, &g_raid_if)
902 
903 /*
904  * brief:
905  * raid_bdev_init is the initialization function for raid bdev module
906  * params:
907  * none
908  * returns:
909  * 0 - success
910  * non zero - failure
911  */
912 static int
913 raid_bdev_init(void)
914 {
915 	return 0;
916 }
917 
918 /*
919  * brief:
920  * raid_bdev_create allocates raid bdev based on passed configuration
921  * params:
922  * name - name for raid bdev
923  * strip_size - strip size in KB
924  * num_base_bdevs - number of base bdevs
925  * level - raid level
926  * raid_bdev_out - the created raid bdev
927  * returns:
928  * 0 - success
929  * non zero - failure
930  */
931 int
932 raid_bdev_create(const char *name, uint32_t strip_size, uint8_t num_base_bdevs,
933 		 enum raid_level level, struct raid_bdev **raid_bdev_out)
934 {
935 	struct raid_bdev *raid_bdev;
936 	struct spdk_bdev *raid_bdev_gen;
937 	struct raid_bdev_module *module;
938 
939 	if (raid_bdev_find_by_name(name) != NULL) {
940 		SPDK_ERRLOG("Duplicate raid bdev name found: %s\n", name);
941 		return -EEXIST;
942 	}
943 
944 	if (spdk_u32_is_pow2(strip_size) == false) {
945 		SPDK_ERRLOG("Invalid strip size %" PRIu32 "\n", strip_size);
946 		return -EINVAL;
947 	}
948 
949 	module = raid_bdev_module_find(level);
950 	if (module == NULL) {
951 		SPDK_ERRLOG("Unsupported raid level '%d'\n", level);
952 		return -EINVAL;
953 	}
954 
955 	assert(module->base_bdevs_min != 0);
956 	if (num_base_bdevs < module->base_bdevs_min) {
957 		SPDK_ERRLOG("At least %u base devices required for %s\n",
958 			    module->base_bdevs_min,
959 			    raid_bdev_level_to_str(level));
960 		return -EINVAL;
961 	}
962 
963 	raid_bdev = calloc(1, sizeof(*raid_bdev));
964 	if (!raid_bdev) {
965 		SPDK_ERRLOG("Unable to allocate memory for raid bdev\n");
966 		return -ENOMEM;
967 	}
968 
969 	raid_bdev->module = module;
970 	raid_bdev->num_base_bdevs = num_base_bdevs;
971 	raid_bdev->base_bdev_info = calloc(raid_bdev->num_base_bdevs,
972 					   sizeof(struct raid_base_bdev_info));
973 	if (!raid_bdev->base_bdev_info) {
974 		SPDK_ERRLOG("Unable able to allocate base bdev info\n");
975 		free(raid_bdev);
976 		return -ENOMEM;
977 	}
978 
979 	/* strip_size_kb is from the rpc param.  strip_size is in blocks and used
980 	 * internally and set later.
981 	 */
982 	raid_bdev->strip_size = 0;
983 	raid_bdev->strip_size_kb = strip_size;
984 	raid_bdev->state = RAID_BDEV_STATE_CONFIGURING;
985 	raid_bdev->level = level;
986 
987 	raid_bdev_gen = &raid_bdev->bdev;
988 
989 	raid_bdev_gen->name = strdup(name);
990 	if (!raid_bdev_gen->name) {
991 		SPDK_ERRLOG("Unable to allocate name for raid\n");
992 		free(raid_bdev->base_bdev_info);
993 		free(raid_bdev);
994 		return -ENOMEM;
995 	}
996 
997 	raid_bdev_gen->product_name = "Raid Volume";
998 	raid_bdev_gen->ctxt = raid_bdev;
999 	raid_bdev_gen->fn_table = &g_raid_bdev_fn_table;
1000 	raid_bdev_gen->module = &g_raid_if;
1001 	raid_bdev_gen->write_cache = 0;
1002 
1003 	TAILQ_INSERT_TAIL(&g_raid_bdev_list, raid_bdev, global_link);
1004 
1005 	*raid_bdev_out = raid_bdev;
1006 
1007 	return 0;
1008 }
1009 
1010 /*
1011  * brief:
1012  * If raid bdev config is complete, then only register the raid bdev to
1013  * bdev layer and remove this raid bdev from configuring list and
1014  * insert the raid bdev to configured list
1015  * params:
1016  * raid_bdev - pointer to raid bdev
1017  * returns:
1018  * 0 - success
1019  * non zero - failure
1020  */
1021 static int
1022 raid_bdev_configure(struct raid_bdev *raid_bdev)
1023 {
1024 	uint32_t blocklen = 0;
1025 	struct spdk_bdev *raid_bdev_gen;
1026 	struct raid_base_bdev_info *base_info;
1027 	int rc = 0;
1028 
1029 	assert(raid_bdev->state == RAID_BDEV_STATE_CONFIGURING);
1030 	assert(raid_bdev->num_base_bdevs_discovered == raid_bdev->num_base_bdevs);
1031 
1032 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
1033 		assert(base_info->bdev != NULL);
1034 		/* Check blocklen for all base bdevs that it should be same */
1035 		if (blocklen == 0) {
1036 			blocklen = base_info->bdev->blocklen;
1037 		} else if (blocklen != base_info->bdev->blocklen) {
1038 			/*
1039 			 * Assumption is that all the base bdevs for any raid bdev should
1040 			 * have same blocklen
1041 			 */
1042 			SPDK_ERRLOG("Blocklen of various bdevs not matching\n");
1043 			return -EINVAL;
1044 		}
1045 	}
1046 	assert(blocklen > 0);
1047 
1048 	/* The strip_size_kb is read in from user in KB. Convert to blocks here for
1049 	 * internal use.
1050 	 */
1051 	raid_bdev->strip_size = (raid_bdev->strip_size_kb * 1024) / blocklen;
1052 	raid_bdev->strip_size_shift = spdk_u32log2(raid_bdev->strip_size);
1053 	raid_bdev->blocklen_shift = spdk_u32log2(blocklen);
1054 
1055 	raid_bdev_gen = &raid_bdev->bdev;
1056 	raid_bdev_gen->blocklen = blocklen;
1057 
1058 	rc = raid_bdev->module->start(raid_bdev);
1059 	if (rc != 0) {
1060 		SPDK_ERRLOG("raid module startup callback failed\n");
1061 		return rc;
1062 	}
1063 	raid_bdev->state = RAID_BDEV_STATE_ONLINE;
1064 	SPDK_DEBUGLOG(bdev_raid, "io device register %p\n", raid_bdev);
1065 	SPDK_DEBUGLOG(bdev_raid, "blockcnt %" PRIu64 ", blocklen %u\n",
1066 		      raid_bdev_gen->blockcnt, raid_bdev_gen->blocklen);
1067 	spdk_io_device_register(raid_bdev, raid_bdev_create_cb, raid_bdev_destroy_cb,
1068 				sizeof(struct raid_bdev_io_channel),
1069 				raid_bdev->bdev.name);
1070 	rc = spdk_bdev_register(raid_bdev_gen);
1071 	if (rc != 0) {
1072 		SPDK_ERRLOG("Unable to register raid bdev and stay at configuring state\n");
1073 		if (raid_bdev->module->stop != NULL) {
1074 			raid_bdev->module->stop(raid_bdev);
1075 		}
1076 		spdk_io_device_unregister(raid_bdev, NULL);
1077 		raid_bdev->state = RAID_BDEV_STATE_CONFIGURING;
1078 		return rc;
1079 	}
1080 	SPDK_DEBUGLOG(bdev_raid, "raid bdev generic %p\n", raid_bdev_gen);
1081 	SPDK_DEBUGLOG(bdev_raid, "raid bdev is created with name %s, raid_bdev %p\n",
1082 		      raid_bdev_gen->name, raid_bdev);
1083 
1084 	return 0;
1085 }
1086 
1087 /*
1088  * brief:
1089  * If raid bdev is online and registered, change the bdev state to
1090  * configuring and unregister this raid device. Queue this raid device
1091  * in configuring list
1092  * params:
1093  * raid_bdev - pointer to raid bdev
1094  * cb_fn - callback function
1095  * cb_arg - argument to callback function
1096  * returns:
1097  * none
1098  */
1099 static void
1100 raid_bdev_deconfigure(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn,
1101 		      void *cb_arg)
1102 {
1103 	if (raid_bdev->state != RAID_BDEV_STATE_ONLINE) {
1104 		if (cb_fn) {
1105 			cb_fn(cb_arg, 0);
1106 		}
1107 		return;
1108 	}
1109 
1110 	assert(raid_bdev->num_base_bdevs == raid_bdev->num_base_bdevs_discovered);
1111 	raid_bdev->state = RAID_BDEV_STATE_OFFLINE;
1112 	assert(raid_bdev->num_base_bdevs_discovered);
1113 	SPDK_DEBUGLOG(bdev_raid, "raid bdev state changing from online to offline\n");
1114 
1115 	spdk_bdev_unregister(&raid_bdev->bdev, cb_fn, cb_arg);
1116 }
1117 
1118 /*
1119  * brief:
1120  * raid_bdev_find_by_base_bdev function finds the raid bdev which has
1121  *  claimed the base bdev.
1122  * params:
1123  * base_bdev - pointer to base bdev pointer
1124  * _raid_bdev - Reference to pointer to raid bdev
1125  * _base_info - Reference to the raid base bdev info.
1126  * returns:
1127  * true - if the raid bdev is found.
1128  * false - if the raid bdev is not found.
1129  */
1130 static bool
1131 raid_bdev_find_by_base_bdev(struct spdk_bdev *base_bdev, struct raid_bdev **_raid_bdev,
1132 			    struct raid_base_bdev_info **_base_info)
1133 {
1134 	struct raid_bdev *raid_bdev;
1135 	struct raid_base_bdev_info *base_info;
1136 
1137 	TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) {
1138 		RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
1139 			if (base_info->bdev == base_bdev) {
1140 				*_raid_bdev = raid_bdev;
1141 				*_base_info = base_info;
1142 				return true;
1143 			}
1144 		}
1145 	}
1146 
1147 	return false;
1148 }
1149 
1150 /*
1151  * brief:
1152  * raid_bdev_remove_base_bdev function is called by below layers when base_bdev
1153  * is removed. This function checks if this base bdev is part of any raid bdev
1154  * or not. If yes, it takes necessary action on that particular raid bdev.
1155  * params:
1156  * base_bdev - pointer to base bdev pointer which got removed
1157  * returns:
1158  * none
1159  */
1160 static void
1161 raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev)
1162 {
1163 	struct raid_bdev	*raid_bdev = NULL;
1164 	struct raid_base_bdev_info *base_info;
1165 
1166 	SPDK_DEBUGLOG(bdev_raid, "raid_bdev_remove_base_bdev\n");
1167 
1168 	/* Find the raid_bdev which has claimed this base_bdev */
1169 	if (!raid_bdev_find_by_base_bdev(base_bdev, &raid_bdev, &base_info)) {
1170 		SPDK_ERRLOG("bdev to remove '%s' not found\n", base_bdev->name);
1171 		return;
1172 	}
1173 
1174 	assert(base_info->desc);
1175 	base_info->remove_scheduled = true;
1176 
1177 	if (raid_bdev->state != RAID_BDEV_STATE_ONLINE) {
1178 		/*
1179 		 * As raid bdev is not registered yet or already unregistered,
1180 		 * so cleanup should be done here itself.
1181 		 */
1182 		raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
1183 		if (raid_bdev->num_base_bdevs_discovered == 0) {
1184 			/* There is no base bdev for this raid, so free the raid device. */
1185 			raid_bdev_cleanup_and_free(raid_bdev);
1186 			return;
1187 		}
1188 	}
1189 
1190 	raid_bdev_deconfigure(raid_bdev, NULL, NULL);
1191 }
1192 
1193 /*
1194  * brief:
1195  * raid_bdev_event_base_bdev function is called by below layers when base_bdev
1196  * triggers asynchronous event.
1197  * params:
1198  * type - event details.
1199  * bdev - bdev that triggered event.
1200  * event_ctx - context for event.
1201  * returns:
1202  * none
1203  */
1204 static void
1205 raid_bdev_event_base_bdev(enum spdk_bdev_event_type type, struct spdk_bdev *bdev,
1206 			  void *event_ctx)
1207 {
1208 	switch (type) {
1209 	case SPDK_BDEV_EVENT_REMOVE:
1210 		raid_bdev_remove_base_bdev(bdev);
1211 		break;
1212 	default:
1213 		SPDK_NOTICELOG("Unsupported bdev event: type %d\n", type);
1214 		break;
1215 	}
1216 }
1217 
1218 /*
1219  * brief:
1220  * Deletes the specified raid bdev
1221  * params:
1222  * raid_bdev - pointer to raid bdev
1223  * cb_fn - callback function
1224  * cb_arg - argument to callback function
1225  */
1226 void
1227 raid_bdev_delete(struct raid_bdev *raid_bdev, raid_bdev_destruct_cb cb_fn, void *cb_arg)
1228 {
1229 	struct raid_base_bdev_info *base_info;
1230 
1231 	SPDK_DEBUGLOG(bdev_raid, "delete raid bdev: %s\n", raid_bdev->bdev.name);
1232 
1233 	if (raid_bdev->destroy_started) {
1234 		SPDK_DEBUGLOG(bdev_raid, "destroying raid bdev %s is already started\n",
1235 			      raid_bdev->bdev.name);
1236 		if (cb_fn) {
1237 			cb_fn(cb_arg, -EALREADY);
1238 		}
1239 		return;
1240 	}
1241 
1242 	raid_bdev->destroy_started = true;
1243 
1244 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
1245 		base_info->remove_scheduled = true;
1246 
1247 		if (raid_bdev->state != RAID_BDEV_STATE_ONLINE) {
1248 			/*
1249 			 * As raid bdev is not registered yet or already unregistered,
1250 			 * so cleanup should be done here itself.
1251 			 */
1252 			raid_bdev_free_base_bdev_resource(raid_bdev, base_info);
1253 		}
1254 	}
1255 
1256 	if (raid_bdev->num_base_bdevs_discovered == 0) {
1257 		/* There is no base bdev for this raid, so free the raid device. */
1258 		raid_bdev_cleanup_and_free(raid_bdev);
1259 		if (cb_fn) {
1260 			cb_fn(cb_arg, 0);
1261 		}
1262 	} else {
1263 		raid_bdev_deconfigure(raid_bdev, cb_fn, cb_arg);
1264 	}
1265 }
1266 
1267 static int
1268 raid_bdev_configure_base_bdev(struct raid_bdev *raid_bdev, struct raid_base_bdev_info *base_info)
1269 {
1270 	struct spdk_bdev_desc *desc;
1271 	struct spdk_bdev *bdev;
1272 	int rc;
1273 
1274 	assert(base_info->name != NULL);
1275 	assert(base_info->bdev == NULL);
1276 
1277 	rc = spdk_bdev_open_ext(base_info->name, true, raid_bdev_event_base_bdev, NULL, &desc);
1278 	if (rc != 0) {
1279 		if (rc != -ENODEV) {
1280 			SPDK_ERRLOG("Unable to create desc on bdev '%s'\n", base_info->name);
1281 		}
1282 		return rc;
1283 	}
1284 
1285 	bdev = spdk_bdev_desc_get_bdev(desc);
1286 
1287 	rc = spdk_bdev_module_claim_bdev(bdev, NULL, &g_raid_if);
1288 	if (rc != 0) {
1289 		SPDK_ERRLOG("Unable to claim this bdev as it is already claimed\n");
1290 		spdk_bdev_close(desc);
1291 		return rc;
1292 	}
1293 
1294 	SPDK_DEBUGLOG(bdev_raid, "bdev %s is claimed\n", bdev->name);
1295 
1296 	assert(raid_bdev->state != RAID_BDEV_STATE_ONLINE);
1297 
1298 	base_info->thread = spdk_get_thread();
1299 	base_info->bdev = bdev;
1300 	base_info->desc = desc;
1301 	raid_bdev->num_base_bdevs_discovered++;
1302 	assert(raid_bdev->num_base_bdevs_discovered <= raid_bdev->num_base_bdevs);
1303 
1304 	if (raid_bdev->num_base_bdevs_discovered == raid_bdev->num_base_bdevs) {
1305 		rc = raid_bdev_configure(raid_bdev);
1306 		if (rc != 0) {
1307 			SPDK_ERRLOG("Failed to configure raid bdev\n");
1308 			return rc;
1309 		}
1310 	}
1311 
1312 	return 0;
1313 }
1314 
1315 /*
1316  * brief:
1317  * raid_bdev_add_base_device function is the actual function which either adds
1318  * the nvme base device to existing raid bdev or create a new raid bdev. It also claims
1319  * the base device and keep the open descriptor.
1320  * params:
1321  * raid_bdev - pointer to raid bdev
1322  * name - name of the base bdev
1323  * slot - position to add base bdev
1324  * returns:
1325  * 0 - success
1326  * non zero - failure
1327  */
1328 int
1329 raid_bdev_add_base_device(struct raid_bdev *raid_bdev, const char *name, uint8_t slot)
1330 {
1331 	struct raid_base_bdev_info *base_info;
1332 	int rc;
1333 
1334 	if (slot >= raid_bdev->num_base_bdevs) {
1335 		return -EINVAL;
1336 	}
1337 
1338 	base_info = &raid_bdev->base_bdev_info[slot];
1339 
1340 	if (base_info->name != NULL) {
1341 		SPDK_ERRLOG("Slot %u on raid bdev '%s' already assigned to bdev '%s'\n",
1342 			    slot, raid_bdev->bdev.name, base_info->name);
1343 		return -EBUSY;
1344 	}
1345 
1346 	base_info->name = strdup(name);
1347 	if (base_info->name == NULL) {
1348 		return -ENOMEM;
1349 	}
1350 
1351 	rc = raid_bdev_configure_base_bdev(raid_bdev, base_info);
1352 	if (rc != 0) {
1353 		if (rc != -ENODEV) {
1354 			SPDK_ERRLOG("Failed to allocate resource for bdev '%s'\n", name);
1355 		}
1356 		return rc;
1357 	}
1358 
1359 	return 0;
1360 }
1361 
1362 /*
1363  * brief:
1364  * raid_bdev_examine function is the examine function call by the below layers
1365  * like bdev_nvme layer. This function will check if this base bdev can be
1366  * claimed by this raid bdev or not.
1367  * params:
1368  * bdev - pointer to base bdev
1369  * returns:
1370  * none
1371  */
1372 static void
1373 raid_bdev_examine(struct spdk_bdev *bdev)
1374 {
1375 	struct raid_bdev *raid_bdev;
1376 	struct raid_base_bdev_info *base_info;
1377 
1378 	TAILQ_FOREACH(raid_bdev, &g_raid_bdev_list, global_link) {
1379 		RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
1380 			if (base_info->bdev == NULL && strcmp(bdev->name, base_info->name) == 0) {
1381 				raid_bdev_configure_base_bdev(raid_bdev, base_info);
1382 				break;
1383 			}
1384 		}
1385 	}
1386 
1387 	spdk_bdev_module_examine_done(&g_raid_if);
1388 }
1389 
1390 /* Log component for bdev raid bdev module */
1391 SPDK_LOG_REGISTER_COMPONENT(bdev_raid)
1392