MCPcopy Create free account
hub / github.com/F-Stack/f-stack / vdev_add_child

Function vdev_add_child

freebsd/contrib/openzfs/module/zfs/vdev.c:414–457  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

412}
413
414void
415vdev_add_child(vdev_t *pvd, vdev_t *cvd)
416{
417 size_t oldsize, newsize;
418 uint64_t id = cvd->vdev_id;
419 vdev_t **newchild;
420
421 ASSERT(spa_config_held(cvd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL);
422 ASSERT(cvd->vdev_parent == NULL);
423
424 cvd->vdev_parent = pvd;
425
426 if (pvd == NULL)
427 return;
428
429 ASSERT(id >= pvd->vdev_children || pvd->vdev_child[id] == NULL);
430
431 oldsize = pvd->vdev_children * sizeof (vdev_t *);
432 pvd->vdev_children = MAX(pvd->vdev_children, id + 1);
433 newsize = pvd->vdev_children * sizeof (vdev_t *);
434
435 newchild = kmem_alloc(newsize, KM_SLEEP);
436 if (pvd->vdev_child != NULL) {
437 bcopy(pvd->vdev_child, newchild, oldsize);
438 kmem_free(pvd->vdev_child, oldsize);
439 }
440
441 pvd->vdev_child = newchild;
442 pvd->vdev_child[id] = cvd;
443
444 cvd->vdev_top = (pvd->vdev_top ? pvd->vdev_top: cvd);
445 ASSERT(cvd->vdev_top->vdev_parent->vdev_parent == NULL);
446
447 /*
448 * Walk up all ancestors to update guid sum.
449 */
450 for (; pvd != NULL; pvd = pvd->vdev_parent)
451 pvd->vdev_guid_sum += cvd->vdev_guid_sum;
452
453 if (cvd->vdev_ops->vdev_op_leaf) {
454 list_insert_head(&cvd->vdev_spa->spa_leaf_list, cvd);
455 cvd->vdev_spa->spa_leaf_list_gen++;
456 }
457}
458
459void
460vdev_remove_child(vdev_t *pvd, vdev_t *cvd)

Callers 6

vdev_allocFunction · 0.85
vdev_add_parentFunction · 0.85
vdev_remove_parentFunction · 0.85
spa_vdev_addFunction · 0.85
spa_vdev_attachFunction · 0.85

Calls 3

spa_config_heldFunction · 0.85
kmem_freeFunction · 0.50
list_insert_headFunction · 0.50

Tested by

no test coverage detected