static int ddt_zap_walk(objset_t *os, uint64_t object, ddt_entry_t *dde, uint64_t *walk) { zap_cursor_t zc; zap_attribute_t za; int error; zap_cursor_init_serialized(&zc, os, object, *walk); if ((error = zap_cursor_retrieve(&zc, &za)) == 0) { uchar_t cbuf[sizeof (dde->dde_phys) + 1]; uint64_t csize = za.za_num_integers; ASSERT(za.za_integer_length == 1); error = zap_lookup_uint64(os, object, (uint64_t *)za.za_name, DDT_KEY_WORDS, 1, csize, cbuf); ASSERT(error == 0); if (error == 0) { ddt_decompress(cbuf, dde->dde_phys, csize, sizeof (dde->dde_phys)); dde->dde_key = *(ddt_key_t *)za.za_name; } zap_cursor_advance(&zc); *walk = zap_cursor_serialize(&zc); } zap_cursor_fini(&zc); return (error); }
static int ddt_zap_lookup(objset_t *os, uint64_t object, ddt_entry_t *dde) { uchar_t *cbuf; uint64_t one, csize; int error; cbuf = kmem_alloc(sizeof (dde->dde_phys) + 1, KM_PUSHPAGE); error = zap_length_uint64(os, object, (uint64_t *)&dde->dde_key, DDT_KEY_WORDS, &one, &csize); if (error) goto out; ASSERT(one == 1); ASSERT(csize <= (sizeof (dde->dde_phys) + 1)); error = zap_lookup_uint64(os, object, (uint64_t *)&dde->dde_key, DDT_KEY_WORDS, 1, csize, cbuf); if (error) goto out; ddt_decompress(cbuf, dde->dde_phys, csize, sizeof (dde->dde_phys)); out: kmem_free(cbuf, sizeof (dde->dde_phys) + 1); return (error); }
static int ddt_zap_lookup(objset_t *os, uint64_t object, ddt_entry_t *dde) { uchar_t cbuf[sizeof (dde->dde_phys) + 1]; uint64_t one, csize; int error; error = zap_length_uint64(os, object, (uint64_t *)&dde->dde_key, DDT_KEY_WORDS, &one, &csize); if (error) return (error); ASSERT(one == 1); ASSERT(csize <= sizeof (cbuf)); error = zap_lookup_uint64(os, object, (uint64_t *)&dde->dde_key, DDT_KEY_WORDS, 1, csize, cbuf); if (error) return (error); ddt_decompress(cbuf, dde->dde_phys, csize, sizeof (dde->dde_phys)); return (0); }