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

Function nvs_embedded_nvl_array

freebsd/contrib/openzfs/module/nvpair/nvpair.c:2501–2551  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2499}
2500
2501static int
2502nvs_embedded_nvl_array(nvstream_t *nvs, nvpair_t *nvp, size_t *size)
2503{
2504 size_t nelem = NVP_NELEM(nvp);
2505 nvlist_t **nvlp = EMBEDDED_NVL_ARRAY(nvp);
2506 int i;
2507
2508 switch (nvs->nvs_op) {
2509 case NVS_OP_ENCODE:
2510 for (i = 0; i < nelem; i++)
2511 if (nvs_embedded(nvs, nvlp[i]) != 0)
2512 return (EFAULT);
2513 break;
2514
2515 case NVS_OP_DECODE: {
2516 size_t len = nelem * sizeof (uint64_t);
2517 nvlist_t *embedded = (nvlist_t *)((uintptr_t)nvlp + len);
2518
2519 bzero(nvlp, len); /* don't trust packed data */
2520 for (i = 0; i < nelem; i++) {
2521 if (nvs_embedded(nvs, embedded) != 0) {
2522 nvpair_free(nvp);
2523 return (EFAULT);
2524 }
2525
2526 nvlp[i] = embedded++;
2527 }
2528 break;
2529 }
2530 case NVS_OP_GETSIZE: {
2531 uint64_t nvsize = 0;
2532
2533 for (i = 0; i < nelem; i++) {
2534 size_t nvp_sz = 0;
2535
2536 if (nvs_operation(nvs, nvlp[i], &nvp_sz) != 0)
2537 return (EINVAL);
2538
2539 if ((nvsize += nvp_sz) > INT32_MAX)
2540 return (EINVAL);
2541 }
2542
2543 *size = nvsize;
2544 break;
2545 }
2546 default:
2547 return (EINVAL);
2548 }
2549
2550 return (0);
2551}
2552
2553static int nvs_native(nvstream_t *, nvlist_t *, char *, size_t *);
2554static int nvs_xdr(nvstream_t *, nvlist_t *, char *, size_t *);

Callers 4

nvs_native_nvp_sizeFunction · 0.85
nvs_xdr_nvp_opFunction · 0.85
nvs_xdr_nvp_sizeFunction · 0.85

Calls 4

nvs_embeddedFunction · 0.85
bzeroFunction · 0.85
nvs_operationFunction · 0.85
nvpair_freeFunction · 0.70

Tested by

no test coverage detected