1 789 ahrens /* 2 789 ahrens * CDDL HEADER START 3 789 ahrens * 4 789 ahrens * The contents of this file are subject to the terms of the 5 1491 ahrens * Common Development and Distribution License (the "License"). 6 1491 ahrens * You may not use this file except in compliance with the License. 7 789 ahrens * 8 789 ahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 789 ahrens * or http://www.opensolaris.org/os/licensing. 10 789 ahrens * See the License for the specific language governing permissions 11 789 ahrens * and limitations under the License. 12 789 ahrens * 13 789 ahrens * When distributing Covered Code, include this CDDL HEADER in each 14 789 ahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 789 ahrens * If applicable, add the following below this CDDL HEADER, with the 16 789 ahrens * fields enclosed by brackets "[]" replaced with your own identifying 17 789 ahrens * information: Portions Copyright [yyyy] [name of copyright owner] 18 789 ahrens * 19 789 ahrens * CDDL HEADER END 20 789 ahrens */ 21 789 ahrens /* 22 8748 Tim * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 789 ahrens * Use is subject to license terms. 24 789 ahrens */ 25 789 ahrens 26 10922 Jeff #include <sys/zio.h> 27 789 ahrens #include <sys/spa.h> 28 789 ahrens #include <sys/dmu.h> 29 789 ahrens #include <sys/zfs_context.h> 30 789 ahrens #include <sys/zap.h> 31 1544 eschrock #include <sys/refcount.h> 32 789 ahrens #include <sys/zap_impl.h> 33 885 ahrens #include <sys/zap_leaf.h> 34 789 ahrens #include <sys/avl.h> 35 5498 timh 36 5498 timh #ifdef _KERNEL 37 5498 timh #include <sys/sunddi.h> 38 5498 timh #endif 39 789 ahrens 40 10922 Jeff static int mzap_upgrade(zap_t **zapp, dmu_tx_t *tx, zap_flags_t flags); 41 789 ahrens 42 10922 Jeff uint64_t 43 10922 Jeff zap_getflags(zap_t *zap) 44 10922 Jeff { 45 10922 Jeff if (zap->zap_ismicro) 46 10922 Jeff return (0); 47 10922 Jeff return (zap->zap_u.zap_fat.zap_phys->zap_flags); 48 10922 Jeff } 49 10922 Jeff 50 10922 Jeff int 51 10922 Jeff zap_hashbits(zap_t *zap) 52 10922 Jeff { 53 10922 Jeff if (zap_getflags(zap) & ZAP_FLAG_HASH64) 54 10922 Jeff return (48); 55 10922 Jeff else 56 10922 Jeff return (28); 57 10922 Jeff } 58 10922 Jeff 59 10922 Jeff uint32_t 60 10922 Jeff zap_maxcd(zap_t *zap) 61 10922 Jeff { 62 10922 Jeff if (zap_getflags(zap) & ZAP_FLAG_HASH64) 63 10922 Jeff return ((1<<16)-1); 64 10922 Jeff else 65 10922 Jeff return (-1U); 66 10922 Jeff } 67 5331 amw 68 5331 amw static uint64_t 69 10922 Jeff zap_hash(zap_name_t *zn) 70 5331 amw { 71 10922 Jeff zap_t *zap = zn->zn_zap; 72 10922 Jeff uint64_t h = 0; 73 5331 amw 74 10922 Jeff if (zap_getflags(zap) & ZAP_FLAG_PRE_HASHED_KEY) { 75 10922 Jeff ASSERT(zap_getflags(zap) & ZAP_FLAG_UINT64_KEY); 76 10922 Jeff h = *(uint64_t *)zn->zn_key_orig; 77 10922 Jeff } else { 78 10922 Jeff h = zap->zap_salt; 79 10922 Jeff ASSERT(h != 0); 80 10922 Jeff ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY); 81 10922 Jeff 82 11165 Matthew if (zap_getflags(zap) & ZAP_FLAG_UINT64_KEY) { 83 11165 Matthew int i; 84 11165 Matthew const uint64_t *wp = zn->zn_key_norm; 85 10922 Jeff 86 11165 Matthew ASSERT(zn->zn_key_intlen == 8); 87 11165 Matthew for (i = 0; i < zn->zn_key_norm_numints; wp++, i++) { 88 11165 Matthew int j; 89 11165 Matthew uint64_t word = *wp; 90 10922 Jeff 91 11165 Matthew for (j = 0; j < zn->zn_key_intlen; j++) { 92 11165 Matthew h = (h >> 8) ^ 93 11165 Matthew zfs_crc64_table[(h ^ word) & 0xFF]; 94 11165 Matthew word >>= NBBY; 95 11165 Matthew } 96 11165 Matthew } 97 11165 Matthew } else { 98 11165 Matthew int i, len; 99 11165 Matthew const uint8_t *cp = zn->zn_key_norm; 100 11165 Matthew 101 11165 Matthew /* 102 11165 Matthew * We previously stored the terminating null on 103 11165 Matthew * disk, but didn't hash it, so we need to 104 11165 Matthew * continue to not hash it. (The 105 11165 Matthew * zn_key_*_numints includes the terminating 106 11165 Matthew * null for non-binary keys.) 107 11165 Matthew */ 108 11165 Matthew len = zn->zn_key_norm_numints - 1; 109 11165 Matthew 110 11165 Matthew ASSERT(zn->zn_key_intlen == 1); 111 11165 Matthew for (i = 0; i < len; cp++, i++) { 112 11165 Matthew h = (h >> 8) ^ 113 11165 Matthew zfs_crc64_table[(h ^ *cp) & 0xFF]; 114 11165 Matthew } 115 11165 Matthew } 116 5331 amw } 117 5331 amw /* 118 10922 Jeff * Don't use all 64 bits, since we need some in the cookie for 119 10922 Jeff * the collision differentiator. We MUST use the high bits, 120 10922 Jeff * since those are the ones that we first pay attention to when 121 5331 amw * chosing the bucket. 122 5331 amw */ 123 10922 Jeff h &= ~((1ULL << (64 - zap_hashbits(zap))) - 1); 124 5331 amw 125 10922 Jeff return (h); 126 5331 amw } 127 5331 amw 128 5331 amw static int 129 5331 amw zap_normalize(zap_t *zap, const char *name, char *namenorm) 130 5331 amw { 131 5331 amw size_t inlen, outlen; 132 5331 amw int err; 133 10922 Jeff 134 10922 Jeff ASSERT(!(zap_getflags(zap) & ZAP_FLAG_UINT64_KEY)); 135 5331 amw 136 5331 amw inlen = strlen(name) + 1; 137 5331 amw outlen = ZAP_MAXNAMELEN; 138 5331 amw 139 5331 amw err = 0; 140 5331 amw (void) u8_textprep_str((char *)name, &inlen, namenorm, &outlen, 141 8748 Tim zap->zap_normflags | U8_TEXTPREP_IGNORE_NULL | 142 8748 Tim U8_TEXTPREP_IGNORE_INVALID, U8_UNICODE_LATEST, &err); 143 5331 amw 144 5331 amw return (err); 145 5331 amw } 146 5331 amw 147 5331 amw boolean_t 148 5331 amw zap_match(zap_name_t *zn, const char *matchname) 149 5331 amw { 150 10922 Jeff ASSERT(!(zap_getflags(zn->zn_zap) & ZAP_FLAG_UINT64_KEY)); 151 10922 Jeff 152 5331 amw if (zn->zn_matchtype == MT_FIRST) { 153 5331 amw char norm[ZAP_MAXNAMELEN]; 154 5331 amw 155 5331 amw if (zap_normalize(zn->zn_zap, matchname, norm) != 0) 156 5331 amw return (B_FALSE); 157 5331 amw 158 10922 Jeff return (strcmp(zn->zn_key_norm, norm) == 0); 159 5331 amw } else { 160 5331 amw /* MT_BEST or MT_EXACT */ 161 10922 Jeff return (strcmp(zn->zn_key_orig, matchname) == 0); 162 5331 amw } 163 5331 amw } 164 5331 amw 165 5331 amw void 166 5331 amw zap_name_free(zap_name_t *zn) 167 5331 amw { 168 5331 amw kmem_free(zn, sizeof (zap_name_t)); 169 5331 amw } 170 5331 amw 171 5331 amw zap_name_t * 172 10922 Jeff zap_name_alloc(zap_t *zap, const char *key, matchtype_t mt) 173 5331 amw { 174 5331 amw zap_name_t *zn = kmem_alloc(sizeof (zap_name_t), KM_SLEEP); 175 5331 amw 176 5331 amw zn->zn_zap = zap; 177 10922 Jeff zn->zn_key_intlen = sizeof (*key); 178 10922 Jeff zn->zn_key_orig = key; 179 11165 Matthew zn->zn_key_orig_numints = strlen(zn->zn_key_orig) + 1; 180 5331 amw zn->zn_matchtype = mt; 181 5331 amw if (zap->zap_normflags) { 182 10922 Jeff if (zap_normalize(zap, key, zn->zn_normbuf) != 0) { 183 5331 amw zap_name_free(zn); 184 5331 amw return (NULL); 185 5331 amw } 186 10922 Jeff zn->zn_key_norm = zn->zn_normbuf; 187 11165 Matthew zn->zn_key_norm_numints = strlen(zn->zn_key_norm) + 1; 188 5331 amw } else { 189 5331 amw if (mt != MT_EXACT) { 190 5331 amw zap_name_free(zn); 191 5331 amw return (NULL); 192 5331 amw } 193 10922 Jeff zn->zn_key_norm = zn->zn_key_orig; 194 11165 Matthew zn->zn_key_norm_numints = zn->zn_key_orig_numints; 195 5331 amw } 196 5331 amw 197 10922 Jeff zn->zn_hash = zap_hash(zn); 198 10922 Jeff return (zn); 199 10922 Jeff } 200 10922 Jeff 201 10922 Jeff zap_name_t * 202 10922 Jeff zap_name_alloc_uint64(zap_t *zap, const uint64_t *key, int numints) 203 10922 Jeff { 204 10922 Jeff zap_name_t *zn = kmem_alloc(sizeof (zap_name_t), KM_SLEEP); 205 10922 Jeff 206 10922 Jeff ASSERT(zap->zap_normflags == 0); 207 10922 Jeff zn->zn_zap = zap; 208 10922 Jeff zn->zn_key_intlen = sizeof (*key); 209 10922 Jeff zn->zn_key_orig = zn->zn_key_norm = key; 210 11165 Matthew zn->zn_key_orig_numints = zn->zn_key_norm_numints = numints; 211 10922 Jeff zn->zn_matchtype = MT_EXACT; 212 10922 Jeff 213 10922 Jeff zn->zn_hash = zap_hash(zn); 214 5331 amw return (zn); 215 5331 amw } 216 789 ahrens 217 789 ahrens static void 218 789 ahrens mzap_byteswap(mzap_phys_t *buf, size_t size) 219 789 ahrens { 220 789 ahrens int i, max; 221 789 ahrens buf->mz_block_type = BSWAP_64(buf->mz_block_type); 222 789 ahrens buf->mz_salt = BSWAP_64(buf->mz_salt); 223 6492 timh buf->mz_normflags = BSWAP_64(buf->mz_normflags); 224 789 ahrens max = (size / MZAP_ENT_LEN) - 1; 225 789 ahrens for (i = 0; i < max; i++) { 226 789 ahrens buf->mz_chunk[i].mze_value = 227 789 ahrens BSWAP_64(buf->mz_chunk[i].mze_value); 228 789 ahrens buf->mz_chunk[i].mze_cd = 229 789 ahrens BSWAP_32(buf->mz_chunk[i].mze_cd); 230 789 ahrens } 231 789 ahrens } 232 789 ahrens 233 789 ahrens void 234 789 ahrens zap_byteswap(void *buf, size_t size) 235 789 ahrens { 236 789 ahrens uint64_t block_type; 237 789 ahrens 238 789 ahrens block_type = *(uint64_t *)buf; 239 789 ahrens 240 2856 nd150628 if (block_type == ZBT_MICRO || block_type == BSWAP_64(ZBT_MICRO)) { 241 789 ahrens /* ASSERT(magic == ZAP_LEAF_MAGIC); */ 242 789 ahrens mzap_byteswap(buf, size); 243 2856 nd150628 } else { 244 789 ahrens fzap_byteswap(buf, size); 245 789 ahrens } 246 789 ahrens } 247 789 ahrens 248 789 ahrens static int 249 789 ahrens mze_compare(const void *arg1, const void *arg2) 250 789 ahrens { 251 789 ahrens const mzap_ent_t *mze1 = arg1; 252 789 ahrens const mzap_ent_t *mze2 = arg2; 253 789 ahrens 254 789 ahrens if (mze1->mze_hash > mze2->mze_hash) 255 789 ahrens return (+1); 256 789 ahrens if (mze1->mze_hash < mze2->mze_hash) 257 789 ahrens return (-1); 258 789 ahrens if (mze1->mze_phys.mze_cd > mze2->mze_phys.mze_cd) 259 789 ahrens return (+1); 260 789 ahrens if (mze1->mze_phys.mze_cd < mze2->mze_phys.mze_cd) 261 789 ahrens return (-1); 262 789 ahrens return (0); 263 789 ahrens } 264 789 ahrens 265 789 ahrens static void 266 789 ahrens mze_insert(zap_t *zap, int chunkid, uint64_t hash, mzap_ent_phys_t *mzep) 267 789 ahrens { 268 789 ahrens mzap_ent_t *mze; 269 789 ahrens 270 789 ahrens ASSERT(zap->zap_ismicro); 271 789 ahrens ASSERT(RW_WRITE_HELD(&zap->zap_rwlock)); 272 10922 Jeff ASSERT(mzep->mze_cd < zap_maxcd(zap)); 273 789 ahrens 274 789 ahrens mze = kmem_alloc(sizeof (mzap_ent_t), KM_SLEEP); 275 789 ahrens mze->mze_chunkid = chunkid; 276 789 ahrens mze->mze_hash = hash; 277 789 ahrens mze->mze_phys = *mzep; 278 789 ahrens avl_add(&zap->zap_m.zap_avl, mze); 279 789 ahrens } 280 789 ahrens 281 789 ahrens static mzap_ent_t * 282 5331 amw mze_find(zap_name_t *zn) 283 789 ahrens { 284 789 ahrens mzap_ent_t mze_tofind; 285 789 ahrens mzap_ent_t *mze; 286 789 ahrens avl_index_t idx; 287 5331 amw avl_tree_t *avl = &zn->zn_zap->zap_m.zap_avl; 288 789 ahrens 289 5331 amw ASSERT(zn->zn_zap->zap_ismicro); 290 5331 amw ASSERT(RW_LOCK_HELD(&zn->zn_zap->zap_rwlock)); 291 789 ahrens 292 5331 amw mze_tofind.mze_hash = zn->zn_hash; 293 789 ahrens mze_tofind.mze_phys.mze_cd = 0; 294 789 ahrens 295 5331 amw again: 296 789 ahrens mze = avl_find(avl, &mze_tofind, &idx); 297 789 ahrens if (mze == NULL) 298 789 ahrens mze = avl_nearest(avl, idx, AVL_AFTER); 299 5331 amw for (; mze && mze->mze_hash == zn->zn_hash; mze = AVL_NEXT(avl, mze)) { 300 5331 amw if (zap_match(zn, mze->mze_phys.mze_name)) 301 789 ahrens return (mze); 302 5331 amw } 303 5331 amw if (zn->zn_matchtype == MT_BEST) { 304 5331 amw zn->zn_matchtype = MT_FIRST; 305 5331 amw goto again; 306 789 ahrens } 307 789 ahrens return (NULL); 308 789 ahrens } 309 789 ahrens 310 789 ahrens static uint32_t 311 789 ahrens mze_find_unused_cd(zap_t *zap, uint64_t hash) 312 789 ahrens { 313 789 ahrens mzap_ent_t mze_tofind; 314 789 ahrens mzap_ent_t *mze; 315 789 ahrens avl_index_t idx; 316 789 ahrens avl_tree_t *avl = &zap->zap_m.zap_avl; 317 789 ahrens uint32_t cd; 318 789 ahrens 319 789 ahrens ASSERT(zap->zap_ismicro); 320 789 ahrens ASSERT(RW_LOCK_HELD(&zap->zap_rwlock)); 321 789 ahrens 322 789 ahrens mze_tofind.mze_hash = hash; 323 789 ahrens mze_tofind.mze_phys.mze_cd = 0; 324 789 ahrens 325 789 ahrens cd = 0; 326 789 ahrens for (mze = avl_find(avl, &mze_tofind, &idx); 327 789 ahrens mze && mze->mze_hash == hash; mze = AVL_NEXT(avl, mze)) { 328 789 ahrens if (mze->mze_phys.mze_cd != cd) 329 789 ahrens break; 330 789 ahrens cd++; 331 789 ahrens } 332 789 ahrens 333 789 ahrens return (cd); 334 789 ahrens } 335 789 ahrens 336 789 ahrens static void 337 789 ahrens mze_remove(zap_t *zap, mzap_ent_t *mze) 338 789 ahrens { 339 789 ahrens ASSERT(zap->zap_ismicro); 340 789 ahrens ASSERT(RW_WRITE_HELD(&zap->zap_rwlock)); 341 789 ahrens 342 789 ahrens avl_remove(&zap->zap_m.zap_avl, mze); 343 789 ahrens kmem_free(mze, sizeof (mzap_ent_t)); 344 789 ahrens } 345 789 ahrens 346 789 ahrens static void 347 789 ahrens mze_destroy(zap_t *zap) 348 789 ahrens { 349 789 ahrens mzap_ent_t *mze; 350 789 ahrens void *avlcookie = NULL; 351 789 ahrens 352 789 ahrens while (mze = avl_destroy_nodes(&zap->zap_m.zap_avl, &avlcookie)) 353 789 ahrens kmem_free(mze, sizeof (mzap_ent_t)); 354 789 ahrens avl_destroy(&zap->zap_m.zap_avl); 355 789 ahrens } 356 789 ahrens 357 789 ahrens static zap_t * 358 789 ahrens mzap_open(objset_t *os, uint64_t obj, dmu_buf_t *db) 359 789 ahrens { 360 789 ahrens zap_t *winner; 361 789 ahrens zap_t *zap; 362 789 ahrens int i; 363 789 ahrens 364 789 ahrens ASSERT3U(MZAP_ENT_LEN, ==, sizeof (mzap_ent_phys_t)); 365 789 ahrens 366 789 ahrens zap = kmem_zalloc(sizeof (zap_t), KM_SLEEP); 367 789 ahrens rw_init(&zap->zap_rwlock, 0, 0, 0); 368 789 ahrens rw_enter(&zap->zap_rwlock, RW_WRITER); 369 789 ahrens zap->zap_objset = os; 370 789 ahrens zap->zap_object = obj; 371 789 ahrens zap->zap_dbuf = db; 372 789 ahrens 373 5331 amw if (*(uint64_t *)db->db_data != ZBT_MICRO) { 374 789 ahrens mutex_init(&zap->zap_f.zap_num_entries_mtx, 0, 0, 0); 375 1491 ahrens zap->zap_f.zap_block_shift = highbit(db->db_size) - 1; 376 789 ahrens } else { 377 789 ahrens zap->zap_ismicro = TRUE; 378 789 ahrens } 379 789 ahrens 380 789 ahrens /* 381 789 ahrens * Make sure that zap_ismicro is set before we let others see 382 789 ahrens * it, because zap_lockdir() checks zap_ismicro without the lock 383 789 ahrens * held. 384 789 ahrens */ 385 2641 ahrens winner = dmu_buf_set_user(db, zap, &zap->zap_m.zap_phys, zap_evict); 386 789 ahrens 387 789 ahrens if (winner != NULL) { 388 4831 gw25295 rw_exit(&zap->zap_rwlock); 389 4831 gw25295 rw_destroy(&zap->zap_rwlock); 390 4831 gw25295 if (!zap->zap_ismicro) 391 4831 gw25295 mutex_destroy(&zap->zap_f.zap_num_entries_mtx); 392 789 ahrens kmem_free(zap, sizeof (zap_t)); 393 789 ahrens return (winner); 394 789 ahrens } 395 789 ahrens 396 789 ahrens if (zap->zap_ismicro) { 397 789 ahrens zap->zap_salt = zap->zap_m.zap_phys->mz_salt; 398 5331 amw zap->zap_normflags = zap->zap_m.zap_phys->mz_normflags; 399 789 ahrens zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1; 400 789 ahrens avl_create(&zap->zap_m.zap_avl, mze_compare, 401 789 ahrens sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node)); 402 789 ahrens 403 789 ahrens for (i = 0; i < zap->zap_m.zap_num_chunks; i++) { 404 789 ahrens mzap_ent_phys_t *mze = 405 789 ahrens &zap->zap_m.zap_phys->mz_chunk[i]; 406 789 ahrens if (mze->mze_name[0]) { 407 5331 amw zap_name_t *zn; 408 5331 amw 409 789 ahrens zap->zap_m.zap_num_entries++; 410 5331 amw zn = zap_name_alloc(zap, mze->mze_name, 411 5331 amw MT_EXACT); 412 5331 amw mze_insert(zap, i, zn->zn_hash, mze); 413 5331 amw zap_name_free(zn); 414 789 ahrens } 415 789 ahrens } 416 789 ahrens } else { 417 789 ahrens zap->zap_salt = zap->zap_f.zap_phys->zap_salt; 418 5331 amw zap->zap_normflags = zap->zap_f.zap_phys->zap_normflags; 419 1491 ahrens 420 1491 ahrens ASSERT3U(sizeof (struct zap_leaf_header), ==, 421 1491 ahrens 2*ZAP_LEAF_CHUNKSIZE); 422 1491 ahrens 423 1491 ahrens /* 424 1491 ahrens * The embedded pointer table should not overlap the 425 1491 ahrens * other members. 426 1491 ahrens */ 427 1491 ahrens ASSERT3P(&ZAP_EMBEDDED_PTRTBL_ENT(zap, 0), >, 428 1491 ahrens &zap->zap_f.zap_phys->zap_salt); 429 1491 ahrens 430 1491 ahrens /* 431 1491 ahrens * The embedded pointer table should end at the end of 432 1491 ahrens * the block 433 1491 ahrens */ 434 1491 ahrens ASSERT3U((uintptr_t)&ZAP_EMBEDDED_PTRTBL_ENT(zap, 435 1491 ahrens 1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)) - 436 1491 ahrens (uintptr_t)zap->zap_f.zap_phys, ==, 437 1491 ahrens zap->zap_dbuf->db_size); 438 789 ahrens } 439 789 ahrens rw_exit(&zap->zap_rwlock); 440 789 ahrens return (zap); 441 789 ahrens } 442 789 ahrens 443 789 ahrens int 444 789 ahrens zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx, 445 5384 ahrens krw_t lti, boolean_t fatreader, boolean_t adding, zap_t **zapp) 446 789 ahrens { 447 789 ahrens zap_t *zap; 448 789 ahrens dmu_buf_t *db; 449 789 ahrens krw_t lt; 450 789 ahrens int err; 451 789 ahrens 452 789 ahrens *zapp = NULL; 453 789 ahrens 454 1544 eschrock err = dmu_buf_hold(os, obj, 0, NULL, &db); 455 1544 eschrock if (err) 456 1544 eschrock return (err); 457 789 ahrens 458 789 ahrens #ifdef ZFS_DEBUG 459 789 ahrens { 460 789 ahrens dmu_object_info_t doi; 461 789 ahrens dmu_object_info_from_db(db, &doi); 462 789 ahrens ASSERT(dmu_ot[doi.doi_type].ot_byteswap == zap_byteswap); 463 789 ahrens } 464 789 ahrens #endif 465 789 ahrens 466 789 ahrens zap = dmu_buf_get_user(db); 467 789 ahrens if (zap == NULL) 468 789 ahrens zap = mzap_open(os, obj, db); 469 789 ahrens 470 789 ahrens /* 471 789 ahrens * We're checking zap_ismicro without the lock held, in order to 472 789 ahrens * tell what type of lock we want. Once we have some sort of 473 789 ahrens * lock, see if it really is the right type. In practice this 474 789 ahrens * can only be different if it was upgraded from micro to fat, 475 789 ahrens * and micro wanted WRITER but fat only needs READER. 476 789 ahrens */ 477 789 ahrens lt = (!zap->zap_ismicro && fatreader) ? RW_READER : lti; 478 789 ahrens rw_enter(&zap->zap_rwlock, lt); 479 789 ahrens if (lt != ((!zap->zap_ismicro && fatreader) ? RW_READER : lti)) { 480 789 ahrens /* it was upgraded, now we only need reader */ 481 789 ahrens ASSERT(lt == RW_WRITER); 482 789 ahrens ASSERT(RW_READER == 483 789 ahrens (!zap->zap_ismicro && fatreader) ? RW_READER : lti); 484 789 ahrens rw_downgrade(&zap->zap_rwlock); 485 789 ahrens lt = RW_READER; 486 789 ahrens } 487 789 ahrens 488 789 ahrens zap->zap_objset = os; 489 789 ahrens 490 789 ahrens if (lt == RW_WRITER) 491 789 ahrens dmu_buf_will_dirty(db, tx); 492 789 ahrens 493 789 ahrens ASSERT3P(zap->zap_dbuf, ==, db); 494 789 ahrens 495 789 ahrens ASSERT(!zap->zap_ismicro || 496 789 ahrens zap->zap_m.zap_num_entries <= zap->zap_m.zap_num_chunks); 497 5384 ahrens if (zap->zap_ismicro && tx && adding && 498 789 ahrens zap->zap_m.zap_num_entries == zap->zap_m.zap_num_chunks) { 499 789 ahrens uint64_t newsz = db->db_size + SPA_MINBLOCKSIZE; 500 789 ahrens if (newsz > MZAP_MAX_BLKSZ) { 501 789 ahrens dprintf("upgrading obj %llu: num_entries=%u\n", 502 789 ahrens obj, zap->zap_m.zap_num_entries); 503 789 ahrens *zapp = zap; 504 10922 Jeff return (mzap_upgrade(zapp, tx, 0)); 505 789 ahrens } 506 789 ahrens err = dmu_object_set_blocksize(os, obj, newsz, 0, tx); 507 789 ahrens ASSERT3U(err, ==, 0); 508 789 ahrens zap->zap_m.zap_num_chunks = 509 789 ahrens db->db_size / MZAP_ENT_LEN - 1; 510 789 ahrens } 511 789 ahrens 512 789 ahrens *zapp = zap; 513 789 ahrens return (0); 514 789 ahrens } 515 789 ahrens 516 789 ahrens void 517 789 ahrens zap_unlockdir(zap_t *zap) 518 789 ahrens { 519 789 ahrens rw_exit(&zap->zap_rwlock); 520 1544 eschrock dmu_buf_rele(zap->zap_dbuf, NULL); 521 789 ahrens } 522 789 ahrens 523 5497 bonwick static int 524 10922 Jeff mzap_upgrade(zap_t **zapp, dmu_tx_t *tx, zap_flags_t flags) 525 789 ahrens { 526 789 ahrens mzap_phys_t *mzp; 527 10922 Jeff int i, sz, nchunks; 528 10922 Jeff int err = 0; 529 5497 bonwick zap_t *zap = *zapp; 530 789 ahrens 531 789 ahrens ASSERT(RW_WRITE_HELD(&zap->zap_rwlock)); 532 789 ahrens 533 789 ahrens sz = zap->zap_dbuf->db_size; 534 789 ahrens mzp = kmem_alloc(sz, KM_SLEEP); 535 789 ahrens bcopy(zap->zap_dbuf->db_data, mzp, sz); 536 789 ahrens nchunks = zap->zap_m.zap_num_chunks; 537 789 ahrens 538 10922 Jeff if (!flags) { 539 10922 Jeff err = dmu_object_set_blocksize(zap->zap_objset, zap->zap_object, 540 10922 Jeff 1ULL << fzap_default_block_shift, 0, tx); 541 10922 Jeff if (err) { 542 10922 Jeff kmem_free(mzp, sz); 543 10922 Jeff return (err); 544 10922 Jeff } 545 5497 bonwick } 546 789 ahrens 547 789 ahrens dprintf("upgrading obj=%llu with %u chunks\n", 548 789 ahrens zap->zap_object, nchunks); 549 5331 amw /* XXX destroy the avl later, so we can use the stored hash value */ 550 789 ahrens mze_destroy(zap); 551 789 ahrens 552 10922 Jeff fzap_upgrade(zap, tx, flags); 553 789 ahrens 554 789 ahrens for (i = 0; i < nchunks; i++) { 555 789 ahrens mzap_ent_phys_t *mze = &mzp->mz_chunk[i]; 556 5331 amw zap_name_t *zn; 557 789 ahrens if (mze->mze_name[0] == 0) 558 789 ahrens continue; 559 789 ahrens dprintf("adding %s=%llu\n", 560 789 ahrens mze->mze_name, mze->mze_value); 561 5331 amw zn = zap_name_alloc(zap, mze->mze_name, MT_EXACT); 562 5497 bonwick err = fzap_add_cd(zn, 8, 1, &mze->mze_value, mze->mze_cd, tx); 563 5497 bonwick zap = zn->zn_zap; /* fzap_add_cd() may change zap */ 564 5331 amw zap_name_free(zn); 565 5497 bonwick if (err) 566 5497 bonwick break; 567 789 ahrens } 568 789 ahrens kmem_free(mzp, sz); 569 5497 bonwick *zapp = zap; 570 5497 bonwick return (err); 571 789 ahrens } 572 789 ahrens 573 789 ahrens static void 574 10922 Jeff mzap_create_impl(objset_t *os, uint64_t obj, int normflags, zap_flags_t flags, 575 10922 Jeff dmu_tx_t *tx) 576 789 ahrens { 577 789 ahrens dmu_buf_t *db; 578 789 ahrens mzap_phys_t *zp; 579 789 ahrens 580 1544 eschrock VERIFY(0 == dmu_buf_hold(os, obj, 0, FTAG, &db)); 581 789 ahrens 582 789 ahrens #ifdef ZFS_DEBUG 583 789 ahrens { 584 789 ahrens dmu_object_info_t doi; 585 789 ahrens dmu_object_info_from_db(db, &doi); 586 789 ahrens ASSERT(dmu_ot[doi.doi_type].ot_byteswap == zap_byteswap); 587 789 ahrens } 588 789 ahrens #endif 589 789 ahrens 590 789 ahrens dmu_buf_will_dirty(db, tx); 591 789 ahrens zp = db->db_data; 592 789 ahrens zp->mz_block_type = ZBT_MICRO; 593 789 ahrens zp->mz_salt = ((uintptr_t)db ^ (uintptr_t)tx ^ (obj << 1)) | 1ULL; 594 5331 amw zp->mz_normflags = normflags; 595 1544 eschrock dmu_buf_rele(db, FTAG); 596 10922 Jeff 597 10922 Jeff if (flags != 0) { 598 10922 Jeff zap_t *zap; 599 10922 Jeff /* Only fat zap supports flags; upgrade immediately. */ 600 10922 Jeff VERIFY(0 == zap_lockdir(os, obj, tx, RW_WRITER, 601 10922 Jeff B_FALSE, B_FALSE, &zap)); 602 10922 Jeff VERIFY3U(0, ==, mzap_upgrade(&zap, tx, flags)); 603 10922 Jeff zap_unlockdir(zap); 604 10922 Jeff } 605 789 ahrens } 606 789 ahrens 607 789 ahrens int 608 789 ahrens zap_create_claim(objset_t *os, uint64_t obj, dmu_object_type_t ot, 609 789 ahrens dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) 610 789 ahrens { 611 5331 amw return (zap_create_claim_norm(os, obj, 612 5331 amw 0, ot, bonustype, bonuslen, tx)); 613 5331 amw } 614 5331 amw 615 5331 amw int 616 5331 amw zap_create_claim_norm(objset_t *os, uint64_t obj, int normflags, 617 5331 amw dmu_object_type_t ot, 618 5331 amw dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) 619 5331 amw { 620 789 ahrens int err; 621 789 ahrens 622 789 ahrens err = dmu_object_claim(os, obj, ot, 0, bonustype, bonuslen, tx); 623 789 ahrens if (err != 0) 624 789 ahrens return (err); 625 10922 Jeff mzap_create_impl(os, obj, normflags, 0, tx); 626 789 ahrens return (0); 627 789 ahrens } 628 789 ahrens 629 789 ahrens uint64_t 630 789 ahrens zap_create(objset_t *os, dmu_object_type_t ot, 631 789 ahrens dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) 632 789 ahrens { 633 5331 amw return (zap_create_norm(os, 0, ot, bonustype, bonuslen, tx)); 634 5331 amw } 635 5331 amw 636 5331 amw uint64_t 637 5331 amw zap_create_norm(objset_t *os, int normflags, dmu_object_type_t ot, 638 5331 amw dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) 639 5331 amw { 640 789 ahrens uint64_t obj = dmu_object_alloc(os, ot, 0, bonustype, bonuslen, tx); 641 789 ahrens 642 10922 Jeff mzap_create_impl(os, obj, normflags, 0, tx); 643 10922 Jeff return (obj); 644 10922 Jeff } 645 10922 Jeff 646 10922 Jeff uint64_t 647 10922 Jeff zap_create_flags(objset_t *os, int normflags, zap_flags_t flags, 648 10922 Jeff dmu_object_type_t ot, int leaf_blockshift, int indirect_blockshift, 649 10922 Jeff dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx) 650 10922 Jeff { 651 10922 Jeff uint64_t obj = dmu_object_alloc(os, ot, 0, bonustype, bonuslen, tx); 652 10922 Jeff 653 10922 Jeff ASSERT(leaf_blockshift >= SPA_MINBLOCKSHIFT && 654 10922 Jeff leaf_blockshift <= SPA_MAXBLOCKSHIFT && 655 10922 Jeff indirect_blockshift >= SPA_MINBLOCKSHIFT && 656 10922 Jeff indirect_blockshift <= SPA_MAXBLOCKSHIFT); 657 10922 Jeff 658 10922 Jeff VERIFY(dmu_object_set_blocksize(os, obj, 659 10922 Jeff 1ULL << leaf_blockshift, indirect_blockshift, tx) == 0); 660 10922 Jeff 661 10922 Jeff mzap_create_impl(os, obj, normflags, flags, tx); 662 789 ahrens return (obj); 663 789 ahrens } 664 789 ahrens 665 789 ahrens int 666 789 ahrens zap_destroy(objset_t *os, uint64_t zapobj, dmu_tx_t *tx) 667 789 ahrens { 668 789 ahrens /* 669 789 ahrens * dmu_object_free will free the object number and free the 670 789 ahrens * data. Freeing the data will cause our pageout function to be 671 789 ahrens * called, which will destroy our data (zap_leaf_t's and zap_t). 672 789 ahrens */ 673 789 ahrens 674 789 ahrens return (dmu_object_free(os, zapobj, tx)); 675 789 ahrens } 676 789 ahrens 677 789 ahrens _NOTE(ARGSUSED(0)) 678 789 ahrens void 679 2641 ahrens zap_evict(dmu_buf_t *db, void *vzap) 680 789 ahrens { 681 2641 ahrens zap_t *zap = vzap; 682 789 ahrens 683 789 ahrens rw_destroy(&zap->zap_rwlock); 684 789 ahrens 685 1491 ahrens if (zap->zap_ismicro) 686 789 ahrens mze_destroy(zap); 687 4831 gw25295 else 688 4831 gw25295 mutex_destroy(&zap->zap_f.zap_num_entries_mtx); 689 789 ahrens 690 789 ahrens kmem_free(zap, sizeof (zap_t)); 691 789 ahrens } 692 789 ahrens 693 789 ahrens int 694 789 ahrens zap_count(objset_t *os, uint64_t zapobj, uint64_t *count) 695 789 ahrens { 696 789 ahrens zap_t *zap; 697 789 ahrens int err; 698 789 ahrens 699 5384 ahrens err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 700 789 ahrens if (err) 701 789 ahrens return (err); 702 789 ahrens if (!zap->zap_ismicro) { 703 789 ahrens err = fzap_count(zap, count); 704 789 ahrens } else { 705 789 ahrens *count = zap->zap_m.zap_num_entries; 706 789 ahrens } 707 789 ahrens zap_unlockdir(zap); 708 789 ahrens return (err); 709 789 ahrens } 710 789 ahrens 711 789 ahrens /* 712 5331 amw * zn may be NULL; if not specified, it will be computed if needed. 713 5331 amw * See also the comment above zap_entry_normalization_conflict(). 714 5331 amw */ 715 5331 amw static boolean_t 716 5331 amw mzap_normalization_conflict(zap_t *zap, zap_name_t *zn, mzap_ent_t *mze) 717 5331 amw { 718 5331 amw mzap_ent_t *other; 719 5331 amw int direction = AVL_BEFORE; 720 5331 amw boolean_t allocdzn = B_FALSE; 721 5331 amw 722 5331 amw if (zap->zap_normflags == 0) 723 5331 amw return (B_FALSE); 724 5331 amw 725 5331 amw again: 726 5331 amw for (other = avl_walk(&zap->zap_m.zap_avl, mze, direction); 727 5331 amw other && other->mze_hash == mze->mze_hash; 728 5331 amw other = avl_walk(&zap->zap_m.zap_avl, other, direction)) { 729 5331 amw 730 5331 amw if (zn == NULL) { 731 5331 amw zn = zap_name_alloc(zap, mze->mze_phys.mze_name, 732 5331 amw MT_FIRST); 733 5331 amw allocdzn = B_TRUE; 734 5331 amw } 735 5331 amw if (zap_match(zn, other->mze_phys.mze_name)) { 736 5331 amw if (allocdzn) 737 5331 amw zap_name_free(zn); 738 5331 amw return (B_TRUE); 739 5331 amw } 740 5331 amw } 741 5331 amw 742 5331 amw if (direction == AVL_BEFORE) { 743 5331 amw direction = AVL_AFTER; 744 5331 amw goto again; 745 5331 amw } 746 5331 amw 747 5331 amw if (allocdzn) 748 5331 amw zap_name_free(zn); 749 5331 amw return (B_FALSE); 750 5331 amw } 751 5331 amw 752 5331 amw /* 753 5331 amw * Routines for manipulating attributes. 754 789 ahrens */ 755 789 ahrens 756 789 ahrens int 757 789 ahrens zap_lookup(objset_t *os, uint64_t zapobj, const char *name, 758 789 ahrens uint64_t integer_size, uint64_t num_integers, void *buf) 759 789 ahrens { 760 5331 amw return (zap_lookup_norm(os, zapobj, name, integer_size, 761 5331 amw num_integers, buf, MT_EXACT, NULL, 0, NULL)); 762 5331 amw } 763 5331 amw 764 5331 amw int 765 5331 amw zap_lookup_norm(objset_t *os, uint64_t zapobj, const char *name, 766 5331 amw uint64_t integer_size, uint64_t num_integers, void *buf, 767 5331 amw matchtype_t mt, char *realname, int rn_len, 768 5331 amw boolean_t *ncp) 769 5331 amw { 770 789 ahrens zap_t *zap; 771 789 ahrens int err; 772 789 ahrens mzap_ent_t *mze; 773 5331 amw zap_name_t *zn; 774 789 ahrens 775 5384 ahrens err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 776 789 ahrens if (err) 777 789 ahrens return (err); 778 5331 amw zn = zap_name_alloc(zap, name, mt); 779 5331 amw if (zn == NULL) { 780 5331 amw zap_unlockdir(zap); 781 5331 amw return (ENOTSUP); 782 5331 amw } 783 5331 amw 784 789 ahrens if (!zap->zap_ismicro) { 785 5331 amw err = fzap_lookup(zn, integer_size, num_integers, buf, 786 5331 amw realname, rn_len, ncp); 787 789 ahrens } else { 788 5331 amw mze = mze_find(zn); 789 789 ahrens if (mze == NULL) { 790 789 ahrens err = ENOENT; 791 789 ahrens } else { 792 5331 amw if (num_integers < 1) { 793 789 ahrens err = EOVERFLOW; 794 5331 amw } else if (integer_size != 8) { 795 789 ahrens err = EINVAL; 796 5331 amw } else { 797 789 ahrens *(uint64_t *)buf = mze->mze_phys.mze_value; 798 5331 amw (void) strlcpy(realname, 799 5331 amw mze->mze_phys.mze_name, rn_len); 800 5331 amw if (ncp) { 801 5331 amw *ncp = mzap_normalization_conflict(zap, 802 5331 amw zn, mze); 803 5331 amw } 804 5331 amw } 805 789 ahrens } 806 789 ahrens } 807 5331 amw zap_name_free(zn); 808 789 ahrens zap_unlockdir(zap); 809 789 ahrens return (err); 810 789 ahrens } 811 789 ahrens 812 789 ahrens int 813 10922 Jeff zap_lookup_uint64(objset_t *os, uint64_t zapobj, const uint64_t *key, 814 10922 Jeff int key_numints, uint64_t integer_size, uint64_t num_integers, void *buf) 815 10922 Jeff { 816 10922 Jeff zap_t *zap; 817 10922 Jeff int err; 818 10922 Jeff zap_name_t *zn; 819 10922 Jeff 820 10922 Jeff err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 821 10922 Jeff if (err) 822 10922 Jeff return (err); 823 10922 Jeff zn = zap_name_alloc_uint64(zap, key, key_numints); 824 10922 Jeff if (zn == NULL) { 825 10922 Jeff zap_unlockdir(zap); 826 10922 Jeff return (ENOTSUP); 827 10922 Jeff } 828 10922 Jeff 829 10922 Jeff err = fzap_lookup(zn, integer_size, num_integers, buf, 830 10922 Jeff NULL, 0, NULL); 831 10922 Jeff zap_name_free(zn); 832 10922 Jeff zap_unlockdir(zap); 833 10922 Jeff return (err); 834 10922 Jeff } 835 10922 Jeff 836 10922 Jeff int 837 11022 Tom zap_contains(objset_t *os, uint64_t zapobj, const char *name) 838 11022 Tom { 839 11022 Tom int err = (zap_lookup_norm(os, zapobj, name, 0, 840 11022 Tom 0, NULL, MT_EXACT, NULL, 0, NULL)); 841 11022 Tom if (err == EOVERFLOW || err == EINVAL) 842 11022 Tom err = 0; /* found, but skipped reading the value */ 843 11022 Tom return (err); 844 11022 Tom } 845 11022 Tom 846 11022 Tom int 847 789 ahrens zap_length(objset_t *os, uint64_t zapobj, const char *name, 848 789 ahrens uint64_t *integer_size, uint64_t *num_integers) 849 789 ahrens { 850 789 ahrens zap_t *zap; 851 789 ahrens int err; 852 789 ahrens mzap_ent_t *mze; 853 5331 amw zap_name_t *zn; 854 789 ahrens 855 5384 ahrens err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 856 789 ahrens if (err) 857 789 ahrens return (err); 858 5331 amw zn = zap_name_alloc(zap, name, MT_EXACT); 859 5331 amw if (zn == NULL) { 860 5331 amw zap_unlockdir(zap); 861 5331 amw return (ENOTSUP); 862 5331 amw } 863 789 ahrens if (!zap->zap_ismicro) { 864 5331 amw err = fzap_length(zn, integer_size, num_integers); 865 789 ahrens } else { 866 5331 amw mze = mze_find(zn); 867 789 ahrens if (mze == NULL) { 868 789 ahrens err = ENOENT; 869 789 ahrens } else { 870 789 ahrens if (integer_size) 871 789 ahrens *integer_size = 8; 872 789 ahrens if (num_integers) 873 789 ahrens *num_integers = 1; 874 789 ahrens } 875 789 ahrens } 876 5331 amw zap_name_free(zn); 877 789 ahrens zap_unlockdir(zap); 878 789 ahrens return (err); 879 789 ahrens } 880 789 ahrens 881 10922 Jeff int 882 10922 Jeff zap_length_uint64(objset_t *os, uint64_t zapobj, const uint64_t *key, 883 10922 Jeff int key_numints, uint64_t *integer_size, uint64_t *num_integers) 884 10922 Jeff { 885 10922 Jeff zap_t *zap; 886 10922 Jeff int err; 887 10922 Jeff zap_name_t *zn; 888 10922 Jeff 889 10922 Jeff err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 890 10922 Jeff if (err) 891 10922 Jeff return (err); 892 10922 Jeff zn = zap_name_alloc_uint64(zap, key, key_numints); 893 10922 Jeff if (zn == NULL) { 894 10922 Jeff zap_unlockdir(zap); 895 10922 Jeff return (ENOTSUP); 896 10922 Jeff } 897 10922 Jeff err = fzap_length(zn, integer_size, num_integers); 898 10922 Jeff zap_name_free(zn); 899 10922 Jeff zap_unlockdir(zap); 900 10922 Jeff return (err); 901 10922 Jeff } 902 10922 Jeff 903 789 ahrens static void 904 5331 amw mzap_addent(zap_name_t *zn, uint64_t value) 905 789 ahrens { 906 789 ahrens int i; 907 5331 amw zap_t *zap = zn->zn_zap; 908 789 ahrens int start = zap->zap_m.zap_alloc_next; 909 789 ahrens uint32_t cd; 910 789 ahrens 911 789 ahrens ASSERT(RW_WRITE_HELD(&zap->zap_rwlock)); 912 789 ahrens 913 789 ahrens #ifdef ZFS_DEBUG 914 789 ahrens for (i = 0; i < zap->zap_m.zap_num_chunks; i++) { 915 789 ahrens mzap_ent_phys_t *mze = &zap->zap_m.zap_phys->mz_chunk[i]; 916 10922 Jeff ASSERT(strcmp(zn->zn_key_orig, mze->mze_name) != 0); 917 789 ahrens } 918 789 ahrens #endif 919 789 ahrens 920 5331 amw cd = mze_find_unused_cd(zap, zn->zn_hash); 921 789 ahrens /* given the limited size of the microzap, this can't happen */ 922 10922 Jeff ASSERT(cd < zap_maxcd(zap)); 923 789 ahrens 924 789 ahrens again: 925 789 ahrens for (i = start; i < zap->zap_m.zap_num_chunks; i++) { 926 789 ahrens mzap_ent_phys_t *mze = &zap->zap_m.zap_phys->mz_chunk[i]; 927 789 ahrens if (mze->mze_name[0] == 0) { 928 789 ahrens mze->mze_value = value; 929 789 ahrens mze->mze_cd = cd; 930 10922 Jeff (void) strcpy(mze->mze_name, zn->zn_key_orig); 931 789 ahrens zap->zap_m.zap_num_entries++; 932 789 ahrens zap->zap_m.zap_alloc_next = i+1; 933 789 ahrens if (zap->zap_m.zap_alloc_next == 934 789 ahrens zap->zap_m.zap_num_chunks) 935 789 ahrens zap->zap_m.zap_alloc_next = 0; 936 5331 amw mze_insert(zap, i, zn->zn_hash, mze); 937 789 ahrens return; 938 789 ahrens } 939 789 ahrens } 940 789 ahrens if (start != 0) { 941 789 ahrens start = 0; 942 789 ahrens goto again; 943 789 ahrens } 944 789 ahrens ASSERT(!"out of entries!"); 945 789 ahrens } 946 789 ahrens 947 789 ahrens int 948 10922 Jeff zap_add(objset_t *os, uint64_t zapobj, const char *key, 949 789 ahrens int integer_size, uint64_t num_integers, 950 789 ahrens const void *val, dmu_tx_t *tx) 951 789 ahrens { 952 789 ahrens zap_t *zap; 953 789 ahrens int err; 954 789 ahrens mzap_ent_t *mze; 955 789 ahrens const uint64_t *intval = val; 956 5331 amw zap_name_t *zn; 957 789 ahrens 958 5384 ahrens err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, TRUE, &zap); 959 789 ahrens if (err) 960 789 ahrens return (err); 961 10922 Jeff zn = zap_name_alloc(zap, key, MT_EXACT); 962 5331 amw if (zn == NULL) { 963 5331 amw zap_unlockdir(zap); 964 5331 amw return (ENOTSUP); 965 5331 amw } 966 789 ahrens if (!zap->zap_ismicro) { 967 5331 amw err = fzap_add(zn, integer_size, num_integers, val, tx); 968 5497 bonwick zap = zn->zn_zap; /* fzap_add() may change zap */ 969 789 ahrens } else if (integer_size != 8 || num_integers != 1 || 970 10922 Jeff strlen(key) >= MZAP_NAME_LEN) { 971 10922 Jeff err = mzap_upgrade(&zn->zn_zap, tx, 0); 972 5497 bonwick if (err == 0) 973 5497 bonwick err = fzap_add(zn, integer_size, num_integers, val, tx); 974 5497 bonwick zap = zn->zn_zap; /* fzap_add() may change zap */ 975 789 ahrens } else { 976 5331 amw mze = mze_find(zn); 977 789 ahrens if (mze != NULL) { 978 789 ahrens err = EEXIST; 979 789 ahrens } else { 980 5331 amw mzap_addent(zn, *intval); 981 789 ahrens } 982 789 ahrens } 983 5497 bonwick ASSERT(zap == zn->zn_zap); 984 10922 Jeff zap_name_free(zn); 985 10922 Jeff if (zap != NULL) /* may be NULL if fzap_add() failed */ 986 10922 Jeff zap_unlockdir(zap); 987 10922 Jeff return (err); 988 10922 Jeff } 989 10922 Jeff 990 10922 Jeff int 991 10922 Jeff zap_add_uint64(objset_t *os, uint64_t zapobj, const uint64_t *key, 992 10922 Jeff int key_numints, int integer_size, uint64_t num_integers, 993 10922 Jeff const void *val, dmu_tx_t *tx) 994 10922 Jeff { 995 10922 Jeff zap_t *zap; 996 10922 Jeff int err; 997 10922 Jeff zap_name_t *zn; 998 10922 Jeff 999 10922 Jeff err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, TRUE, &zap); 1000 10922 Jeff if (err) 1001 10922 Jeff return (err); 1002 10922 Jeff zn = zap_name_alloc_uint64(zap, key, key_numints); 1003 10922 Jeff if (zn == NULL) { 1004 10922 Jeff zap_unlockdir(zap); 1005 10922 Jeff return (ENOTSUP); 1006 10922 Jeff } 1007 10922 Jeff err = fzap_add(zn, integer_size, num_integers, val, tx); 1008 10922 Jeff zap = zn->zn_zap; /* fzap_add() may change zap */ 1009 5331 amw zap_name_free(zn); 1010 5497 bonwick if (zap != NULL) /* may be NULL if fzap_add() failed */ 1011 5497 bonwick zap_unlockdir(zap); 1012 789 ahrens return (err); 1013 789 ahrens } 1014 789 ahrens 1015 789 ahrens int 1016 789 ahrens zap_update(objset_t *os, uint64_t zapobj, const char *name, 1017 789 ahrens int integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx) 1018 789 ahrens { 1019 789 ahrens zap_t *zap; 1020 789 ahrens mzap_ent_t *mze; 1021 789 ahrens const uint64_t *intval = val; 1022 5331 amw zap_name_t *zn; 1023 789 ahrens int err; 1024 789 ahrens 1025 5384 ahrens err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, TRUE, &zap); 1026 789 ahrens if (err) 1027 789 ahrens return (err); 1028 5331 amw zn = zap_name_alloc(zap, name, MT_EXACT); 1029 5331 amw if (zn == NULL) { 1030 5331 amw zap_unlockdir(zap); 1031 5331 amw return (ENOTSUP); 1032 5331 amw } 1033 789 ahrens if (!zap->zap_ismicro) { 1034 5331 amw err = fzap_update(zn, integer_size, num_integers, val, tx); 1035 5497 bonwick zap = zn->zn_zap; /* fzap_update() may change zap */ 1036 789 ahrens } else if (integer_size != 8 || num_integers != 1 || 1037 789 ahrens strlen(name) >= MZAP_NAME_LEN) { 1038 789 ahrens dprintf("upgrading obj %llu: intsz=%u numint=%llu name=%s\n", 1039 789 ahrens zapobj, integer_size, num_integers, name); 1040 10922 Jeff err = mzap_upgrade(&zn->zn_zap, tx, 0); 1041 5497 bonwick if (err == 0) 1042 5497 bonwick err = fzap_update(zn, integer_size, num_integers, 1043 5497 bonwick val, tx); 1044 5497 bonwick zap = zn->zn_zap; /* fzap_update() may change zap */ 1045 789 ahrens } else { 1046 5331 amw mze = mze_find(zn); 1047 789 ahrens if (mze != NULL) { 1048 789 ahrens mze->mze_phys.mze_value = *intval; 1049 789 ahrens zap->zap_m.zap_phys->mz_chunk 1050 789 ahrens [mze->mze_chunkid].mze_value = *intval; 1051 789 ahrens } else { 1052 5331 amw mzap_addent(zn, *intval); 1053 789 ahrens } 1054 789 ahrens } 1055 5497 bonwick ASSERT(zap == zn->zn_zap); 1056 10922 Jeff zap_name_free(zn); 1057 10922 Jeff if (zap != NULL) /* may be NULL if fzap_upgrade() failed */ 1058 10922 Jeff zap_unlockdir(zap); 1059 10922 Jeff return (err); 1060 10922 Jeff } 1061 10922 Jeff 1062 10922 Jeff int 1063 10922 Jeff zap_update_uint64(objset_t *os, uint64_t zapobj, const uint64_t *key, 1064 10922 Jeff int key_numints, 1065 10922 Jeff int integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx) 1066 10922 Jeff { 1067 10922 Jeff zap_t *zap; 1068 10922 Jeff zap_name_t *zn; 1069 10922 Jeff int err; 1070 10922 Jeff 1071 10922 Jeff err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, TRUE, &zap); 1072 10922 Jeff if (err) 1073 10922 Jeff return (err); 1074 10922 Jeff zn = zap_name_alloc_uint64(zap, key, key_numints); 1075 10922 Jeff if (zn == NULL) { 1076 10922 Jeff zap_unlockdir(zap); 1077 10922 Jeff return (ENOTSUP); 1078 10922 Jeff } 1079 10922 Jeff err = fzap_update(zn, integer_size, num_integers, val, tx); 1080 10922 Jeff zap = zn->zn_zap; /* fzap_update() may change zap */ 1081 5331 amw zap_name_free(zn); 1082 5497 bonwick if (zap != NULL) /* may be NULL if fzap_upgrade() failed */ 1083 5497 bonwick zap_unlockdir(zap); 1084 2641 ahrens return (err); 1085 789 ahrens } 1086 789 ahrens 1087 789 ahrens int 1088 789 ahrens zap_remove(objset_t *os, uint64_t zapobj, const char *name, dmu_tx_t *tx) 1089 789 ahrens { 1090 5331 amw return (zap_remove_norm(os, zapobj, name, MT_EXACT, tx)); 1091 5331 amw } 1092 5331 amw 1093 5331 amw int 1094 5331 amw zap_remove_norm(objset_t *os, uint64_t zapobj, const char *name, 1095 5331 amw matchtype_t mt, dmu_tx_t *tx) 1096 5331 amw { 1097 789 ahrens zap_t *zap; 1098 789 ahrens int err; 1099 789 ahrens mzap_ent_t *mze; 1100 5331 amw zap_name_t *zn; 1101 789 ahrens 1102 5384 ahrens err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, FALSE, &zap); 1103 789 ahrens if (err) 1104 789 ahrens return (err); 1105 5331 amw zn = zap_name_alloc(zap, name, mt); 1106 5331 amw if (zn == NULL) { 1107 5331 amw zap_unlockdir(zap); 1108 5331 amw return (ENOTSUP); 1109 5331 amw } 1110 789 ahrens if (!zap->zap_ismicro) { 1111 5331 amw err = fzap_remove(zn, tx); 1112 789 ahrens } else { 1113 5331 amw mze = mze_find(zn); 1114 789 ahrens if (mze == NULL) { 1115 789 ahrens err = ENOENT; 1116 789 ahrens } else { 1117 789 ahrens zap->zap_m.zap_num_entries--; 1118 789 ahrens bzero(&zap->zap_m.zap_phys->mz_chunk[mze->mze_chunkid], 1119 789 ahrens sizeof (mzap_ent_phys_t)); 1120 789 ahrens mze_remove(zap, mze); 1121 789 ahrens } 1122 789 ahrens } 1123 5331 amw zap_name_free(zn); 1124 789 ahrens zap_unlockdir(zap); 1125 789 ahrens return (err); 1126 789 ahrens } 1127 789 ahrens 1128 10922 Jeff int 1129 10922 Jeff zap_remove_uint64(objset_t *os, uint64_t zapobj, const uint64_t *key, 1130 10922 Jeff int key_numints, dmu_tx_t *tx) 1131 10922 Jeff { 1132 10922 Jeff zap_t *zap; 1133 10922 Jeff int err; 1134 10922 Jeff zap_name_t *zn; 1135 10922 Jeff 1136 10922 Jeff err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, FALSE, &zap); 1137 10922 Jeff if (err) 1138 10922 Jeff return (err); 1139 10922 Jeff zn = zap_name_alloc_uint64(zap, key, key_numints); 1140 10922 Jeff if (zn == NULL) { 1141 10922 Jeff zap_unlockdir(zap); 1142 10922 Jeff return (ENOTSUP); 1143 10922 Jeff } 1144 10922 Jeff err = fzap_remove(zn, tx); 1145 10922 Jeff zap_name_free(zn); 1146 10922 Jeff zap_unlockdir(zap); 1147 10922 Jeff return (err); 1148 10922 Jeff } 1149 10922 Jeff 1150 789 ahrens /* 1151 789 ahrens * Routines for iterating over the attributes. 1152 789 ahrens */ 1153 789 ahrens 1154 789 ahrens void 1155 789 ahrens zap_cursor_init_serialized(zap_cursor_t *zc, objset_t *os, uint64_t zapobj, 1156 789 ahrens uint64_t serialized) 1157 789 ahrens { 1158 789 ahrens zc->zc_objset = os; 1159 885 ahrens zc->zc_zap = NULL; 1160 885 ahrens zc->zc_leaf = NULL; 1161 789 ahrens zc->zc_zapobj = zapobj; 1162 10922 Jeff zc->zc_serialized = serialized; 1163 10922 Jeff zc->zc_hash = 0; 1164 10922 Jeff zc->zc_cd = 0; 1165 885 ahrens } 1166 885 ahrens 1167 885 ahrens void 1168 885 ahrens zap_cursor_init(zap_cursor_t *zc, objset_t *os, uint64_t zapobj) 1169 885 ahrens { 1170 885 ahrens zap_cursor_init_serialized(zc, os, zapobj, 0); 1171 885 ahrens } 1172 885 ahrens 1173 885 ahrens void 1174 885 ahrens zap_cursor_fini(zap_cursor_t *zc) 1175 885 ahrens { 1176 885 ahrens if (zc->zc_zap) { 1177 885 ahrens rw_enter(&zc->zc_zap->zap_rwlock, RW_READER); 1178 885 ahrens zap_unlockdir(zc->zc_zap); 1179 885 ahrens zc->zc_zap = NULL; 1180 885 ahrens } 1181 885 ahrens if (zc->zc_leaf) { 1182 885 ahrens rw_enter(&zc->zc_leaf->l_rwlock, RW_READER); 1183 885 ahrens zap_put_leaf(zc->zc_leaf); 1184 885 ahrens zc->zc_leaf = NULL; 1185 885 ahrens } 1186 885 ahrens zc->zc_objset = NULL; 1187 789 ahrens } 1188 789 ahrens 1189 789 ahrens uint64_t 1190 789 ahrens zap_cursor_serialize(zap_cursor_t *zc) 1191 789 ahrens { 1192 789 ahrens if (zc->zc_hash == -1ULL) 1193 789 ahrens return (-1ULL); 1194 10922 Jeff if (zc->zc_zap == NULL) 1195 10922 Jeff return (zc->zc_serialized); 1196 10922 Jeff ASSERT((zc->zc_hash & zap_maxcd(zc->zc_zap)) == 0); 1197 10922 Jeff ASSERT(zc->zc_cd < zap_maxcd(zc->zc_zap)); 1198 10922 Jeff 1199 10922 Jeff /* 1200 10922 Jeff * We want to keep the high 32 bits of the cursor zero if we can, so 1201 10922 Jeff * that 32-bit programs can access this. So usually use a small 1202 10922 Jeff * (28-bit) hash value so we can fit 4 bits of cd into the low 32-bits 1203 10922 Jeff * of the cursor. 1204 10922 Jeff * 1205 10922 Jeff * [ collision differentiator | zap_hashbits()-bit hash value ] 1206 10922 Jeff */ 1207 10922 Jeff return ((zc->zc_hash >> (64 - zap_hashbits(zc->zc_zap))) | 1208 10922 Jeff ((uint64_t)zc->zc_cd << zap_hashbits(zc->zc_zap))); 1209 789 ahrens } 1210 789 ahrens 1211 789 ahrens int 1212 789 ahrens zap_cursor_retrieve(zap_cursor_t *zc, zap_attribute_t *za) 1213 789 ahrens { 1214 789 ahrens int err; 1215 789 ahrens avl_index_t idx; 1216 789 ahrens mzap_ent_t mze_tofind; 1217 789 ahrens mzap_ent_t *mze; 1218 789 ahrens 1219 789 ahrens if (zc->zc_hash == -1ULL) 1220 789 ahrens return (ENOENT); 1221 789 ahrens 1222 885 ahrens if (zc->zc_zap == NULL) { 1223 10922 Jeff int hb; 1224 885 ahrens err = zap_lockdir(zc->zc_objset, zc->zc_zapobj, NULL, 1225 5384 ahrens RW_READER, TRUE, FALSE, &zc->zc_zap); 1226 885 ahrens if (err) 1227 885 ahrens return (err); 1228 10922 Jeff 1229 10922 Jeff /* 1230 10922 Jeff * To support zap_cursor_init_serialized, advance, retrieve, 1231 10922 Jeff * we must add to the existing zc_cd, which may already 1232 10922 Jeff * be 1 due to the zap_cursor_advance. 1233 10922 Jeff */ 1234 10922 Jeff ASSERT(zc->zc_hash == 0); 1235 10922 Jeff hb = zap_hashbits(zc->zc_zap); 1236 10922 Jeff zc->zc_hash = zc->zc_serialized << (64 - hb); 1237 10922 Jeff zc->zc_cd += zc->zc_serialized >> hb; 1238 10922 Jeff if (zc->zc_cd >= zap_maxcd(zc->zc_zap)) /* corrupt serialized */ 1239 10922 Jeff zc->zc_cd = 0; 1240 885 ahrens } else { 1241 885 ahrens rw_enter(&zc->zc_zap->zap_rwlock, RW_READER); 1242 885 ahrens } 1243 885 ahrens if (!zc->zc_zap->zap_ismicro) { 1244 885 ahrens err = fzap_cursor_retrieve(zc->zc_zap, zc, za); 1245 789 ahrens } else { 1246 789 ahrens err = ENOENT; 1247 789 ahrens 1248 789 ahrens mze_tofind.mze_hash = zc->zc_hash; 1249 789 ahrens mze_tofind.mze_phys.mze_cd = zc->zc_cd; 1250 789 ahrens 1251 885 ahrens mze = avl_find(&zc->zc_zap->zap_m.zap_avl, &mze_tofind, &idx); 1252 885 ahrens if (mze == NULL) { 1253 885 ahrens mze = avl_nearest(&zc->zc_zap->zap_m.zap_avl, 1254 885 ahrens idx, AVL_AFTER); 1255 885 ahrens } 1256 789 ahrens if (mze) { 1257 5331 amw ASSERT(0 == bcmp(&mze->mze_phys, 1258 5331 amw &zc->zc_zap->zap_m.zap_phys->mz_chunk 1259 5331 amw [mze->mze_chunkid], sizeof (mze->mze_phys))); 1260 5331 amw 1261 5331 amw za->za_normalization_conflict = 1262 5331 amw mzap_normalization_conflict(zc->zc_zap, NULL, mze); 1263 789 ahrens za->za_integer_length = 8; 1264 789 ahrens za->za_num_integers = 1; 1265 789 ahrens za->za_first_integer = mze->mze_phys.mze_value; 1266 789 ahrens (void) strcpy(za->za_name, mze->mze_phys.mze_name); 1267 789 ahrens zc->zc_hash = mze->mze_hash; 1268 789 ahrens zc->zc_cd = mze->mze_phys.mze_cd; 1269 789 ahrens err = 0; 1270 789 ahrens } else { 1271 789 ahrens zc->zc_hash = -1ULL; 1272 789 ahrens } 1273 789 ahrens } 1274 885 ahrens rw_exit(&zc->zc_zap->zap_rwlock); 1275 789 ahrens return (err); 1276 789 ahrens } 1277 789 ahrens 1278 789 ahrens void 1279 789 ahrens zap_cursor_advance(zap_cursor_t *zc) 1280 789 ahrens { 1281 789 ahrens if (zc->zc_hash == -1ULL) 1282 789 ahrens return; 1283 789 ahrens zc->zc_cd++; 1284 789 ahrens } 1285 789 ahrens 1286 789 ahrens int 1287 10612 Ricardo zap_cursor_move_to_key(zap_cursor_t *zc, const char *name, matchtype_t mt) 1288 10612 Ricardo { 1289 10612 Ricardo int err = 0; 1290 10612 Ricardo mzap_ent_t *mze; 1291 10612 Ricardo zap_name_t *zn; 1292 10612 Ricardo 1293 10612 Ricardo if (zc->zc_zap == NULL) { 1294 10612 Ricardo err = zap_lockdir(zc->zc_objset, zc->zc_zapobj, NULL, 1295 10612 Ricardo RW_READER, TRUE, FALSE, &zc->zc_zap); 1296 10612 Ricardo if (err) 1297 10612 Ricardo return (err); 1298 10612 Ricardo } else { 1299 10612 Ricardo rw_enter(&zc->zc_zap->zap_rwlock, RW_READER); 1300 10612 Ricardo } 1301 10612 Ricardo 1302 10612 Ricardo zn = zap_name_alloc(zc->zc_zap, name, mt); 1303 10612 Ricardo if (zn == NULL) { 1304 10612 Ricardo rw_exit(&zc->zc_zap->zap_rwlock); 1305 10612 Ricardo return (ENOTSUP); 1306 10612 Ricardo } 1307 10612 Ricardo 1308 10612 Ricardo if (!zc->zc_zap->zap_ismicro) { 1309 10612 Ricardo err = fzap_cursor_move_to_key(zc, zn); 1310 10612 Ricardo } else { 1311 10612 Ricardo mze = mze_find(zn); 1312 10612 Ricardo if (mze == NULL) { 1313 10612 Ricardo err = ENOENT; 1314 10612 Ricardo goto out; 1315 10612 Ricardo } 1316 10612 Ricardo zc->zc_hash = mze->mze_hash; 1317 10612 Ricardo zc->zc_cd = mze->mze_phys.mze_cd; 1318 10612 Ricardo } 1319 10612 Ricardo 1320 10612 Ricardo out: 1321 10612 Ricardo zap_name_free(zn); 1322 10612 Ricardo rw_exit(&zc->zc_zap->zap_rwlock); 1323 10612 Ricardo return (err); 1324 10612 Ricardo } 1325 10612 Ricardo 1326 10612 Ricardo int 1327 789 ahrens zap_get_stats(objset_t *os, uint64_t zapobj, zap_stats_t *zs) 1328 789 ahrens { 1329 789 ahrens int err; 1330 789 ahrens zap_t *zap; 1331 789 ahrens 1332 5384 ahrens err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 1333 789 ahrens if (err) 1334 789 ahrens return (err); 1335 789 ahrens 1336 789 ahrens bzero(zs, sizeof (zap_stats_t)); 1337 789 ahrens 1338 789 ahrens if (zap->zap_ismicro) { 1339 789 ahrens zs->zs_blocksize = zap->zap_dbuf->db_size; 1340 789 ahrens zs->zs_num_entries = zap->zap_m.zap_num_entries; 1341 789 ahrens zs->zs_num_blocks = 1; 1342 789 ahrens } else { 1343 789 ahrens fzap_get_stats(zap, zs); 1344 789 ahrens } 1345 789 ahrens zap_unlockdir(zap); 1346 789 ahrens return (0); 1347 789 ahrens } 1348 9653 Sanjeev 1349 9653 Sanjeev int 1350 9653 Sanjeev zap_count_write(objset_t *os, uint64_t zapobj, const char *name, int add, 1351 9873 Sanjeev uint64_t *towrite, uint64_t *tooverwrite) 1352 9653 Sanjeev { 1353 9653 Sanjeev zap_t *zap; 1354 9653 Sanjeev int err = 0; 1355 9653 Sanjeev 1356 9653 Sanjeev 1357 9653 Sanjeev /* 1358 9653 Sanjeev * Since, we don't have a name, we cannot figure out which blocks will 1359 9653 Sanjeev * be affected in this operation. So, account for the worst case : 1360 9653 Sanjeev * - 3 blocks overwritten: target leaf, ptrtbl block, header block 1361 9653 Sanjeev * - 4 new blocks written if adding: 1362 9653 Sanjeev * - 2 blocks for possibly split leaves, 1363 9653 Sanjeev * - 2 grown ptrtbl blocks 1364 9653 Sanjeev * 1365 9653 Sanjeev * This also accomodates the case where an add operation to a fairly 1366 9653 Sanjeev * large microzap results in a promotion to fatzap. 1367 9653 Sanjeev */ 1368 9653 Sanjeev if (name == NULL) { 1369 9653 Sanjeev *towrite += (3 + (add ? 4 : 0)) * SPA_MAXBLOCKSIZE; 1370 9653 Sanjeev return (err); 1371 9653 Sanjeev } 1372 9653 Sanjeev 1373 9653 Sanjeev /* 1374 9653 Sanjeev * We lock the zap with adding == FALSE. Because, if we pass 1375 9653 Sanjeev * the actual value of add, it could trigger a mzap_upgrade(). 1376 9653 Sanjeev * At present we are just evaluating the possibility of this operation 1377 9653 Sanjeev * and hence we donot want to trigger an upgrade. 1378 9653 Sanjeev */ 1379 9653 Sanjeev err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, FALSE, &zap); 1380 9653 Sanjeev if (err) 1381 9653 Sanjeev return (err); 1382 9653 Sanjeev 1383 9653 Sanjeev if (!zap->zap_ismicro) { 1384 9653 Sanjeev zap_name_t *zn = zap_name_alloc(zap, name, MT_EXACT); 1385 9653 Sanjeev if (zn) { 1386 9653 Sanjeev err = fzap_count_write(zn, add, towrite, 1387 9653 Sanjeev tooverwrite); 1388 9653 Sanjeev zap_name_free(zn); 1389 9653 Sanjeev } else { 1390 9653 Sanjeev /* 1391 9653 Sanjeev * We treat this case as similar to (name == NULL) 1392 9653 Sanjeev */ 1393 9653 Sanjeev *towrite += (3 + (add ? 4 : 0)) * SPA_MAXBLOCKSIZE; 1394 9653 Sanjeev } 1395 9653 Sanjeev } else { 1396 9873 Sanjeev /* 1397 9873 Sanjeev * We are here if (name != NULL) and this is a micro-zap. 1398 9873 Sanjeev * We account for the header block depending on whether it 1399 9873 Sanjeev * is freeable. 1400 9873 Sanjeev * 1401 9873 Sanjeev * Incase of an add-operation it is hard to find out 1402 9873 Sanjeev * if this add will promote this microzap to fatzap. 1403 9873 Sanjeev * Hence, we consider the worst case and account for the 1404 9873 Sanjeev * blocks assuming this microzap would be promoted to a 1405 9873 Sanjeev * fatzap. 1406 9873 Sanjeev * 1407 9873 Sanjeev * 1 block overwritten : header block 1408 9873 Sanjeev * 4 new blocks written : 2 new split leaf, 2 grown 1409 9873 Sanjeev * ptrtbl blocks 1410 9873 Sanjeev */ 1411 9873 Sanjeev if (dmu_buf_freeable(zap->zap_dbuf)) 1412 9873 Sanjeev *tooverwrite += SPA_MAXBLOCKSIZE; 1413 9873 Sanjeev else 1414 9873 Sanjeev *towrite += SPA_MAXBLOCKSIZE; 1415 9873 Sanjeev 1416 9873 Sanjeev if (add) { 1417 9873 Sanjeev *towrite += 4 * SPA_MAXBLOCKSIZE; 1418 9653 Sanjeev } 1419 9653 Sanjeev } 1420 9653 Sanjeev 1421 9653 Sanjeev zap_unlockdir(zap); 1422 9653 Sanjeev return (err); 1423 9653 Sanjeev } 1424