2398 pool_propput_undo_t *propput;
2399 nvlist_t *bl = NULL;
2400 const pool_prop_t *prop;
2401
2402 if ((bp = pool_knl_find_nvpair(pke->pke_properties, name)) != NULL) {
2403 if (nvlist_alloc(&bl, NV_UNIQUE_NAME_TYPE, 0) != 0) {
2404 pool_seterror(POE_SYSTEM);
2405 return (PO_FAIL);
2406 }
2407 if (nvlist_add_nvpair(bl, bp) != 0) {
2408 nvlist_free(bl);
2409 pool_seterror(POE_SYSTEM);
2410 return (PO_FAIL);
2411 }
2412 }
2413 if (pool_knl_nvlist_add_value(pke->pke_properties, name, val) !=
2414 PO_SUCCESS)
2415 return (PO_FAIL);
2416
2417 if (prov->pkc_log->l_state != LS_DO) {
2418 if (bl)
2419 nvlist_free(bl);
2420 return (PO_SUCCESS);
2421 }
2422 /*
2423 * The remaining logic is setting up the arguments for the
2424 * POOL_PROPPUT ioctl and appending the details into the log.
2425 */
2426 if ((propput = malloc(sizeof (pool_propput_undo_t))) == NULL) {
2427 pool_seterror(POE_SYSTEM);
2428 return (PO_FAIL);
2429 }
2430 (void) memset(propput, 0, sizeof (pool_propput_undo_t));
2431 propput->ppu_blist = bl;
2432
2433 ap = pool_knl_find_nvpair(pke->pke_properties, name);
2434
2435 if (nvlist_alloc(&propput->ppu_alist, NV_UNIQUE_NAME_TYPE, 0) != 0) {
2436 nvlist_free(propput->ppu_blist);
2437 free(propput);
2438 pool_seterror(POE_SYSTEM);
3443 free(assoc);
3444 break;
3445 case POOL_DISSOC:
3446 dissoc = (pool_dissoc_undo_t *)li->li_details;
3447
3448 free(dissoc);
3449 break;
3450 case POOL_TRANSFER:
3451 pool_seterror(POE_BADPARAM);
3452 return (PO_FAIL);
3453 case POOL_XTRANSFER:
3454 xtransfer = (pool_xtransfer_undo_t *)li->li_details;
3455
3456 free(xtransfer->pxu_rl);
3457 free(xtransfer->pxu_ioctl.px_o_comp_list);
3458 free(xtransfer);
3459 break;
3460 case POOL_PROPPUT:
3461 propput = (pool_propput_undo_t *)li->li_details;
3462
3463 if (propput->ppu_blist)
3464 nvlist_free(propput->ppu_blist);
3465 free(propput->ppu_ioctl.pp_o_buf);
3466 free(propput);
3467 break;
3468 case POOL_PROPRM:
3469 proprm = (pool_proprm_undo_t *)li->li_details;
3470
3471 free(proprm);
3472 break;
3473 default:
3474 return (PO_FAIL);
3475 }
3476 return (PO_SUCCESS);
3477 }
3478
3479 /*
3480 * pool_knl_nvlist_add_value() adds a pool_value_t to an nvlist.
3481 */
3482 int
3483 pool_knl_nvlist_add_value(nvlist_t *list, const char *name,
|
2398 pool_propput_undo_t *propput;
2399 nvlist_t *bl = NULL;
2400 const pool_prop_t *prop;
2401
2402 if ((bp = pool_knl_find_nvpair(pke->pke_properties, name)) != NULL) {
2403 if (nvlist_alloc(&bl, NV_UNIQUE_NAME_TYPE, 0) != 0) {
2404 pool_seterror(POE_SYSTEM);
2405 return (PO_FAIL);
2406 }
2407 if (nvlist_add_nvpair(bl, bp) != 0) {
2408 nvlist_free(bl);
2409 pool_seterror(POE_SYSTEM);
2410 return (PO_FAIL);
2411 }
2412 }
2413 if (pool_knl_nvlist_add_value(pke->pke_properties, name, val) !=
2414 PO_SUCCESS)
2415 return (PO_FAIL);
2416
2417 if (prov->pkc_log->l_state != LS_DO) {
2418 nvlist_free(bl);
2419 return (PO_SUCCESS);
2420 }
2421 /*
2422 * The remaining logic is setting up the arguments for the
2423 * POOL_PROPPUT ioctl and appending the details into the log.
2424 */
2425 if ((propput = malloc(sizeof (pool_propput_undo_t))) == NULL) {
2426 pool_seterror(POE_SYSTEM);
2427 return (PO_FAIL);
2428 }
2429 (void) memset(propput, 0, sizeof (pool_propput_undo_t));
2430 propput->ppu_blist = bl;
2431
2432 ap = pool_knl_find_nvpair(pke->pke_properties, name);
2433
2434 if (nvlist_alloc(&propput->ppu_alist, NV_UNIQUE_NAME_TYPE, 0) != 0) {
2435 nvlist_free(propput->ppu_blist);
2436 free(propput);
2437 pool_seterror(POE_SYSTEM);
3442 free(assoc);
3443 break;
3444 case POOL_DISSOC:
3445 dissoc = (pool_dissoc_undo_t *)li->li_details;
3446
3447 free(dissoc);
3448 break;
3449 case POOL_TRANSFER:
3450 pool_seterror(POE_BADPARAM);
3451 return (PO_FAIL);
3452 case POOL_XTRANSFER:
3453 xtransfer = (pool_xtransfer_undo_t *)li->li_details;
3454
3455 free(xtransfer->pxu_rl);
3456 free(xtransfer->pxu_ioctl.px_o_comp_list);
3457 free(xtransfer);
3458 break;
3459 case POOL_PROPPUT:
3460 propput = (pool_propput_undo_t *)li->li_details;
3461
3462 nvlist_free(propput->ppu_blist);
3463 free(propput->ppu_ioctl.pp_o_buf);
3464 free(propput);
3465 break;
3466 case POOL_PROPRM:
3467 proprm = (pool_proprm_undo_t *)li->li_details;
3468
3469 free(proprm);
3470 break;
3471 default:
3472 return (PO_FAIL);
3473 }
3474 return (PO_SUCCESS);
3475 }
3476
3477 /*
3478 * pool_knl_nvlist_add_value() adds a pool_value_t to an nvlist.
3479 */
3480 int
3481 pool_knl_nvlist_add_value(nvlist_t *list, const char *name,
|