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