xref: /titanic_41/usr/src/uts/common/fs/zfs/dmu.c (revision 69bbc66400b6af121ee9f95667811cc0acd84d6e)
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 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include <sys/dmu.h>
29 #include <sys/dmu_impl.h>
30 #include <sys/dmu_tx.h>
31 #include <sys/dbuf.h>
32 #include <sys/dnode.h>
33 #include <sys/zfs_context.h>
34 #include <sys/dmu_objset.h>
35 #include <sys/dmu_traverse.h>
36 #include <sys/dsl_dataset.h>
37 #include <sys/dsl_dir.h>
38 #include <sys/dsl_pool.h>
39 #include <sys/dmu_zfetch.h>
40 #include <sys/zfs_ioctl.h>
41 #include <sys/zap.h>
42 #include <sys/zio_checksum.h>
43 
44 const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
45 	{	byteswap_uint8_array,	TRUE,	"unallocated"		},
46 	{	zap_byteswap,		TRUE,	"object directory"	},
47 	{	byteswap_uint64_array,	TRUE,	"object array"		},
48 	{	byteswap_uint8_array,	TRUE,	"packed nvlist"		},
49 	{	byteswap_uint64_array,	TRUE,	"packed nvlist size"	},
50 	{	byteswap_uint64_array,	TRUE,	"bplist"		},
51 	{	byteswap_uint64_array,	TRUE,	"bplist header"		},
52 	{	byteswap_uint64_array,	TRUE,	"SPA space map header"	},
53 	{	byteswap_uint64_array,	TRUE,	"SPA space map"		},
54 	{	byteswap_uint64_array,	TRUE,	"ZIL intent log"	},
55 	{	dnode_buf_byteswap,	TRUE,	"DMU dnode"		},
56 	{	dmu_objset_byteswap,	TRUE,	"DMU objset"		},
57 	{	byteswap_uint64_array,	TRUE,	"DSL directory"		},
58 	{	zap_byteswap,		TRUE,	"DSL directory child map"},
59 	{	zap_byteswap,		TRUE,	"DSL dataset snap map"	},
60 	{	zap_byteswap,		TRUE,	"DSL props"		},
61 	{	byteswap_uint64_array,	TRUE,	"DSL dataset"		},
62 	{	zfs_znode_byteswap,	TRUE,	"ZFS znode"		},
63 	{	zfs_acl_byteswap,	TRUE,	"ZFS ACL"		},
64 	{	byteswap_uint8_array,	FALSE,	"ZFS plain file"	},
65 	{	zap_byteswap,		TRUE,	"ZFS directory"		},
66 	{	zap_byteswap,		TRUE,	"ZFS master node"	},
67 	{	zap_byteswap,		TRUE,	"ZFS delete queue"	},
68 	{	byteswap_uint8_array,	FALSE,	"zvol object"		},
69 	{	zap_byteswap,		TRUE,	"zvol prop"		},
70 	{	byteswap_uint8_array,	FALSE,	"other uint8[]"		},
71 	{	byteswap_uint64_array,	FALSE,	"other uint64[]"	},
72 	{	zap_byteswap,		TRUE,	"other ZAP"		},
73 	{	zap_byteswap,		TRUE,	"persistent error log"	},
74 };
75 
76 int
77 dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
78     void *tag, dmu_buf_t **dbp)
79 {
80 	dnode_t *dn;
81 	uint64_t blkid;
82 	dmu_buf_impl_t *db;
83 	int err;
84 
85 	err = dnode_hold(os->os, object, FTAG, &dn);
86 	if (err)
87 		return (err);
88 	blkid = dbuf_whichblock(dn, offset);
89 	rw_enter(&dn->dn_struct_rwlock, RW_READER);
90 	db = dbuf_hold(dn, blkid, tag);
91 	rw_exit(&dn->dn_struct_rwlock);
92 	if (db == NULL) {
93 		err = EIO;
94 	} else {
95 		err = dbuf_read(db, NULL, DB_RF_CANFAIL);
96 		if (err) {
97 			dbuf_rele(db, tag);
98 			db = NULL;
99 		}
100 	}
101 
102 	dnode_rele(dn, FTAG);
103 	*dbp = &db->db;
104 	return (err);
105 }
106 
107 int
108 dmu_bonus_max(void)
109 {
110 	return (DN_MAX_BONUSLEN);
111 }
112 
113 /*
114  * returns ENOENT, EIO, or 0.
115  */
116 int
117 dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp)
118 {
119 	dnode_t *dn;
120 	int err, count;
121 	dmu_buf_impl_t *db;
122 
123 	err = dnode_hold(os->os, object, FTAG, &dn);
124 	if (err)
125 		return (err);
126 
127 	rw_enter(&dn->dn_struct_rwlock, RW_READER);
128 	if (dn->dn_bonus == NULL) {
129 		rw_exit(&dn->dn_struct_rwlock);
130 		rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
131 		if (dn->dn_bonus == NULL)
132 			dn->dn_bonus = dbuf_create_bonus(dn);
133 	}
134 	db = dn->dn_bonus;
135 	rw_exit(&dn->dn_struct_rwlock);
136 	mutex_enter(&db->db_mtx);
137 	count = refcount_add(&db->db_holds, tag);
138 	mutex_exit(&db->db_mtx);
139 	if (count == 1)
140 		dnode_add_ref(dn, db);
141 	dnode_rele(dn, FTAG);
142 
143 	VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED));
144 
145 	*dbp = &db->db;
146 	return (0);
147 }
148 
149 int
150 dmu_buf_hold_array(objset_t *os, uint64_t object, uint64_t offset,
151     uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
152 {
153 	dnode_t *dn;
154 	dmu_buf_t **dbp;
155 	uint64_t blkid, nblks, i;
156 	uint32_t flags;
157 	int err;
158 	zio_t *zio;
159 
160 	ASSERT(length <= DMU_MAX_ACCESS);
161 
162 	if (length == 0) {
163 		if (numbufsp)
164 			*numbufsp = 0;
165 		*dbpp = NULL;
166 		return (0);
167 	}
168 
169 	flags = DB_RF_CANFAIL | DB_RF_NEVERWAIT;
170 	if (length > zfetch_array_rd_sz)
171 		flags |= DB_RF_NOPREFETCH;
172 
173 	err = dnode_hold(os->os, object, FTAG, &dn);
174 	if (err)
175 		return (err);
176 
177 	rw_enter(&dn->dn_struct_rwlock, RW_READER);
178 	if (dn->dn_datablkshift) {
179 		int blkshift = dn->dn_datablkshift;
180 		nblks = (P2ROUNDUP(offset+length, 1ULL<<blkshift) -
181 			P2ALIGN(offset, 1ULL<<blkshift)) >> blkshift;
182 	} else {
183 		ASSERT3U(offset + length, <=, dn->dn_datablksz);
184 		nblks = 1;
185 	}
186 	dbp = kmem_zalloc(sizeof (dmu_buf_t *) * nblks, KM_SLEEP);
187 
188 	zio = zio_root(dn->dn_objset->os_spa, NULL, NULL, TRUE);
189 	blkid = dbuf_whichblock(dn, offset);
190 	for (i = 0; i < nblks; i++) {
191 		dmu_buf_impl_t *db = dbuf_hold(dn, blkid+i, tag);
192 		if (db == NULL) {
193 			rw_exit(&dn->dn_struct_rwlock);
194 			dmu_buf_rele_array(dbp, nblks, tag);
195 			dnode_rele(dn, FTAG);
196 			zio_nowait(zio);
197 			return (EIO);
198 		}
199 		/* initiate async i/o */
200 		if (read && db->db_state == DB_UNCACHED) {
201 			rw_exit(&dn->dn_struct_rwlock);
202 			(void) dbuf_read(db, zio, flags);
203 			rw_enter(&dn->dn_struct_rwlock, RW_READER);
204 		}
205 		dbp[i] = &db->db;
206 	}
207 	rw_exit(&dn->dn_struct_rwlock);
208 	dnode_rele(dn, FTAG);
209 
210 	/* wait for async i/o */
211 	err = zio_wait(zio);
212 	if (err) {
213 		dmu_buf_rele_array(dbp, nblks, tag);
214 		return (err);
215 	}
216 
217 	/* wait for other io to complete */
218 	if (read) {
219 		for (i = 0; i < nblks; i++) {
220 			dmu_buf_impl_t *db = (dmu_buf_impl_t *)dbp[i];
221 			mutex_enter(&db->db_mtx);
222 			while (db->db_state == DB_READ ||
223 			    db->db_state == DB_FILL)
224 				cv_wait(&db->db_changed, &db->db_mtx);
225 			if (db->db_state == DB_UNCACHED)
226 				err = EIO;
227 			mutex_exit(&db->db_mtx);
228 			if (err) {
229 				dmu_buf_rele_array(dbp, nblks, tag);
230 				return (err);
231 			}
232 		}
233 	}
234 
235 	*numbufsp = nblks;
236 	*dbpp = dbp;
237 	return (0);
238 }
239 
240 void
241 dmu_buf_rele_array(dmu_buf_t **dbp_fake, int numbufs, void *tag)
242 {
243 	int i;
244 	dmu_buf_impl_t **dbp = (dmu_buf_impl_t **)dbp_fake;
245 
246 	if (numbufs == 0)
247 		return;
248 
249 	for (i = 0; i < numbufs; i++) {
250 		if (dbp[i])
251 			dbuf_rele(dbp[i], tag);
252 	}
253 
254 	kmem_free(dbp, sizeof (dmu_buf_t *) * numbufs);
255 }
256 
257 void
258 dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset, uint64_t len)
259 {
260 	dnode_t *dn;
261 	uint64_t blkid;
262 	int nblks, i, err;
263 
264 	if (len == 0) {  /* they're interested in the bonus buffer */
265 		dn = os->os->os_meta_dnode;
266 
267 		if (object == 0 || object >= DN_MAX_OBJECT)
268 			return;
269 
270 		rw_enter(&dn->dn_struct_rwlock, RW_READER);
271 		blkid = dbuf_whichblock(dn, object * sizeof (dnode_phys_t));
272 		dbuf_prefetch(dn, blkid);
273 		rw_exit(&dn->dn_struct_rwlock);
274 		return;
275 	}
276 
277 	/*
278 	 * XXX - Note, if the dnode for the requested object is not
279 	 * already cached, we will do a *synchronous* read in the
280 	 * dnode_hold() call.  The same is true for any indirects.
281 	 */
282 	err = dnode_hold(os->os, object, FTAG, &dn);
283 	if (err != 0)
284 		return;
285 
286 	rw_enter(&dn->dn_struct_rwlock, RW_READER);
287 	if (dn->dn_datablkshift) {
288 		int blkshift = dn->dn_datablkshift;
289 		nblks = (P2ROUNDUP(offset+len, 1<<blkshift) -
290 			P2ALIGN(offset, 1<<blkshift)) >> blkshift;
291 	} else {
292 		nblks = (offset < dn->dn_datablksz);
293 	}
294 
295 	if (nblks != 0) {
296 		blkid = dbuf_whichblock(dn, offset);
297 		for (i = 0; i < nblks; i++)
298 			dbuf_prefetch(dn, blkid+i);
299 	}
300 
301 	rw_exit(&dn->dn_struct_rwlock);
302 
303 	dnode_rele(dn, FTAG);
304 }
305 
306 int
307 dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
308     uint64_t size, dmu_tx_t *tx)
309 {
310 	dnode_t *dn;
311 	int err = dnode_hold(os->os, object, FTAG, &dn);
312 	if (err)
313 		return (err);
314 	ASSERT(offset < UINT64_MAX);
315 	ASSERT(size == -1ULL || size <= UINT64_MAX - offset);
316 	dnode_free_range(dn, offset, size, tx);
317 	dnode_rele(dn, FTAG);
318 	return (0);
319 }
320 
321 int
322 dmu_read(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
323     void *buf)
324 {
325 	dnode_t *dn;
326 	dmu_buf_t **dbp;
327 	int numbufs, i, err;
328 
329 	/*
330 	 * Deal with odd block sizes, where there can't be data past the
331 	 * first block.
332 	 */
333 	err = dnode_hold(os->os, object, FTAG, &dn);
334 	if (err)
335 		return (err);
336 	if (dn->dn_datablkshift == 0) {
337 		int newsz = offset > dn->dn_datablksz ? 0 :
338 		    MIN(size, dn->dn_datablksz - offset);
339 		bzero((char *)buf + newsz, size - newsz);
340 		size = newsz;
341 	}
342 	dnode_rele(dn, FTAG);
343 
344 	while (size > 0) {
345 		uint64_t mylen = MIN(size, DMU_MAX_ACCESS / 2);
346 		int err;
347 
348 		/*
349 		 * NB: we could do this block-at-a-time, but it's nice
350 		 * to be reading in parallel.
351 		 */
352 		err = dmu_buf_hold_array(os, object, offset, mylen,
353 		    TRUE, FTAG, &numbufs, &dbp);
354 		if (err)
355 			return (err);
356 
357 		for (i = 0; i < numbufs; i++) {
358 			int tocpy;
359 			int bufoff;
360 			dmu_buf_t *db = dbp[i];
361 
362 			ASSERT(size > 0);
363 
364 			bufoff = offset - db->db_offset;
365 			tocpy = (int)MIN(db->db_size - bufoff, size);
366 
367 			bcopy((char *)db->db_data + bufoff, buf, tocpy);
368 
369 			offset += tocpy;
370 			size -= tocpy;
371 			buf = (char *)buf + tocpy;
372 		}
373 		dmu_buf_rele_array(dbp, numbufs, FTAG);
374 	}
375 	return (0);
376 }
377 
378 void
379 dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
380     const void *buf, dmu_tx_t *tx)
381 {
382 	dmu_buf_t **dbp;
383 	int numbufs, i;
384 
385 	VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
386 	    FALSE, FTAG, &numbufs, &dbp));
387 
388 	for (i = 0; i < numbufs; i++) {
389 		int tocpy;
390 		int bufoff;
391 		dmu_buf_t *db = dbp[i];
392 
393 		ASSERT(size > 0);
394 
395 		bufoff = offset - db->db_offset;
396 		tocpy = (int)MIN(db->db_size - bufoff, size);
397 
398 		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
399 
400 		if (tocpy == db->db_size)
401 			dmu_buf_will_fill(db, tx);
402 		else
403 			dmu_buf_will_dirty(db, tx);
404 
405 		bcopy(buf, (char *)db->db_data + bufoff, tocpy);
406 
407 		if (tocpy == db->db_size)
408 			dmu_buf_fill_done(db, tx);
409 
410 		offset += tocpy;
411 		size -= tocpy;
412 		buf = (char *)buf + tocpy;
413 	}
414 	dmu_buf_rele_array(dbp, numbufs, FTAG);
415 }
416 
417 #ifdef _KERNEL
418 int
419 dmu_write_uio(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
420     uio_t *uio, dmu_tx_t *tx)
421 {
422 	dmu_buf_t **dbp;
423 	int numbufs, i;
424 	int err = 0;
425 
426 	err = dmu_buf_hold_array(os, object, offset, size,
427 	    FALSE, FTAG, &numbufs, &dbp);
428 	if (err)
429 		return (err);
430 
431 	for (i = 0; i < numbufs; i++) {
432 		int tocpy;
433 		int bufoff;
434 		dmu_buf_t *db = dbp[i];
435 
436 		ASSERT(size > 0);
437 
438 		bufoff = offset - db->db_offset;
439 		tocpy = (int)MIN(db->db_size - bufoff, size);
440 
441 		ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
442 
443 		if (tocpy == db->db_size)
444 			dmu_buf_will_fill(db, tx);
445 		else
446 			dmu_buf_will_dirty(db, tx);
447 
448 		/*
449 		 * XXX uiomove could block forever (eg. nfs-backed
450 		 * pages).  There needs to be a uiolockdown() function
451 		 * to lock the pages in memory, so that uiomove won't
452 		 * block.
453 		 */
454 		err = uiomove((char *)db->db_data + bufoff, tocpy,
455 		    UIO_WRITE, uio);
456 
457 		if (tocpy == db->db_size)
458 			dmu_buf_fill_done(db, tx);
459 
460 		if (err)
461 			break;
462 
463 		offset += tocpy;
464 		size -= tocpy;
465 	}
466 	dmu_buf_rele_array(dbp, numbufs, FTAG);
467 	return (err);
468 }
469 #endif
470 
471 struct backuparg {
472 	dmu_replay_record_t *drr;
473 	vnode_t *vp;
474 	objset_t *os;
475 	zio_cksum_t zc;
476 	int err;
477 };
478 
479 static int
480 dump_bytes(struct backuparg *ba, void *buf, int len)
481 {
482 	ssize_t resid; /* have to get resid to get detailed errno */
483 	ASSERT3U(len % 8, ==, 0);
484 
485 	fletcher_4_incremental_native(buf, len, &ba->zc);
486 	ba->err = vn_rdwr(UIO_WRITE, ba->vp,
487 	    (caddr_t)buf, len,
488 	    0, UIO_SYSSPACE, FAPPEND, RLIM64_INFINITY, CRED(), &resid);
489 	return (ba->err);
490 }
491 
492 static int
493 dump_free(struct backuparg *ba, uint64_t object, uint64_t offset,
494     uint64_t length)
495 {
496 	/* write a FREE record */
497 	bzero(ba->drr, sizeof (dmu_replay_record_t));
498 	ba->drr->drr_type = DRR_FREE;
499 	ba->drr->drr_u.drr_free.drr_object = object;
500 	ba->drr->drr_u.drr_free.drr_offset = offset;
501 	ba->drr->drr_u.drr_free.drr_length = length;
502 
503 	if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
504 		return (EINTR);
505 	return (0);
506 }
507 
508 static int
509 dump_data(struct backuparg *ba, dmu_object_type_t type,
510     uint64_t object, uint64_t offset, int blksz, void *data)
511 {
512 	/* write a DATA record */
513 	bzero(ba->drr, sizeof (dmu_replay_record_t));
514 	ba->drr->drr_type = DRR_WRITE;
515 	ba->drr->drr_u.drr_write.drr_object = object;
516 	ba->drr->drr_u.drr_write.drr_type = type;
517 	ba->drr->drr_u.drr_write.drr_offset = offset;
518 	ba->drr->drr_u.drr_write.drr_length = blksz;
519 
520 	if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
521 		return (EINTR);
522 	if (dump_bytes(ba, data, blksz))
523 		return (EINTR);
524 	return (0);
525 }
526 
527 static int
528 dump_freeobjects(struct backuparg *ba, uint64_t firstobj, uint64_t numobjs)
529 {
530 	/* write a FREEOBJECTS record */
531 	bzero(ba->drr, sizeof (dmu_replay_record_t));
532 	ba->drr->drr_type = DRR_FREEOBJECTS;
533 	ba->drr->drr_u.drr_freeobjects.drr_firstobj = firstobj;
534 	ba->drr->drr_u.drr_freeobjects.drr_numobjs = numobjs;
535 
536 	if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
537 		return (EINTR);
538 	return (0);
539 }
540 
541 static int
542 dump_dnode(struct backuparg *ba, uint64_t object, dnode_phys_t *dnp)
543 {
544 	if (dnp == NULL || dnp->dn_type == DMU_OT_NONE)
545 		return (dump_freeobjects(ba, object, 1));
546 
547 	/* write an OBJECT record */
548 	bzero(ba->drr, sizeof (dmu_replay_record_t));
549 	ba->drr->drr_type = DRR_OBJECT;
550 	ba->drr->drr_u.drr_object.drr_object = object;
551 	ba->drr->drr_u.drr_object.drr_type = dnp->dn_type;
552 	ba->drr->drr_u.drr_object.drr_bonustype = dnp->dn_bonustype;
553 	ba->drr->drr_u.drr_object.drr_blksz =
554 	    dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT;
555 	ba->drr->drr_u.drr_object.drr_bonuslen = dnp->dn_bonuslen;
556 	ba->drr->drr_u.drr_object.drr_checksum = dnp->dn_checksum;
557 	ba->drr->drr_u.drr_object.drr_compress = dnp->dn_compress;
558 
559 	if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
560 		return (EINTR);
561 
562 	if (dump_bytes(ba, DN_BONUS(dnp), P2ROUNDUP(dnp->dn_bonuslen, 8)))
563 		return (EINTR);
564 
565 	/* free anything past the end of the file */
566 	if (dump_free(ba, object, (dnp->dn_maxblkid + 1) *
567 	    (dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT), -1ULL))
568 		return (EINTR);
569 	if (ba->err)
570 		return (EINTR);
571 	return (0);
572 }
573 
574 #define	BP_SPAN(dnp, level) \
575 	(((uint64_t)dnp->dn_datablkszsec) << (SPA_MINBLOCKSHIFT + \
576 	(level) * (dnp->dn_indblkshift - SPA_BLKPTRSHIFT)))
577 
578 static int
579 backup_cb(traverse_blk_cache_t *bc, spa_t *spa, void *arg)
580 {
581 	struct backuparg *ba = arg;
582 	uint64_t object = bc->bc_bookmark.zb_object;
583 	int level = bc->bc_bookmark.zb_level;
584 	uint64_t blkid = bc->bc_bookmark.zb_blkid;
585 	blkptr_t *bp = bc->bc_blkptr.blk_birth ? &bc->bc_blkptr : NULL;
586 	dmu_object_type_t type = bp ? BP_GET_TYPE(bp) : DMU_OT_NONE;
587 	void *data = bc->bc_data;
588 	int err = 0;
589 
590 	if (issig(JUSTLOOKING) && issig(FORREAL))
591 		return (EINTR);
592 
593 	ASSERT(data || bp == NULL);
594 
595 	if (bp == NULL && object == 0) {
596 		uint64_t span = BP_SPAN(bc->bc_dnode, level);
597 		uint64_t dnobj = (blkid * span) >> DNODE_SHIFT;
598 		err = dump_freeobjects(ba, dnobj, span >> DNODE_SHIFT);
599 	} else if (bp == NULL) {
600 		uint64_t span = BP_SPAN(bc->bc_dnode, level);
601 		err = dump_free(ba, object, blkid * span, span);
602 	} else if (data && level == 0 && type == DMU_OT_DNODE) {
603 		dnode_phys_t *blk = data;
604 		int i;
605 		int blksz = BP_GET_LSIZE(bp);
606 
607 		for (i = 0; i < blksz >> DNODE_SHIFT; i++) {
608 			uint64_t dnobj =
609 			    (blkid << (DNODE_BLOCK_SHIFT - DNODE_SHIFT)) + i;
610 			err = dump_dnode(ba, dnobj, blk+i);
611 			if (err)
612 				break;
613 		}
614 	} else if (level == 0 &&
615 	    type != DMU_OT_DNODE && type != DMU_OT_OBJSET) {
616 		int blksz = BP_GET_LSIZE(bp);
617 		if (data == NULL) {
618 			arc_buf_t *abuf;
619 			zbookmark_t zb;
620 
621 			zb.zb_objset = ba->os->os->os_dsl_dataset->ds_object;
622 			zb.zb_object = object;
623 			zb.zb_level = level;
624 			zb.zb_blkid = blkid;
625 			(void) arc_read(NULL, spa, bp,
626 			    dmu_ot[type].ot_byteswap, arc_getbuf_func, &abuf,
627 			    ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_MUSTSUCCEED,
628 			    ARC_WAIT, &zb);
629 
630 			if (abuf) {
631 				err = dump_data(ba, type, object, blkid * blksz,
632 				    blksz, abuf->b_data);
633 				(void) arc_buf_remove_ref(abuf, &abuf);
634 			}
635 		} else {
636 			err = dump_data(ba, type, object, blkid * blksz,
637 			    blksz, data);
638 		}
639 	}
640 
641 	ASSERT(err == 0 || err == EINTR);
642 	return (err);
643 }
644 
645 int
646 dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, vnode_t *vp)
647 {
648 	dsl_dataset_t *ds = tosnap->os->os_dsl_dataset;
649 	dsl_dataset_t *fromds = fromsnap ? fromsnap->os->os_dsl_dataset : NULL;
650 	dmu_replay_record_t *drr;
651 	struct backuparg ba;
652 	int err;
653 
654 	/* tosnap must be a snapshot */
655 	if (ds->ds_phys->ds_next_snap_obj == 0)
656 		return (EINVAL);
657 
658 	/* fromsnap must be an earlier snapshot from the same fs as tosnap */
659 	if (fromds && (ds->ds_dir != fromds->ds_dir ||
660 	    fromds->ds_phys->ds_creation_txg >=
661 	    ds->ds_phys->ds_creation_txg))
662 		return (EXDEV);
663 
664 	drr = kmem_zalloc(sizeof (dmu_replay_record_t), KM_SLEEP);
665 	drr->drr_type = DRR_BEGIN;
666 	drr->drr_u.drr_begin.drr_magic = DMU_BACKUP_MAGIC;
667 	drr->drr_u.drr_begin.drr_version = DMU_BACKUP_VERSION;
668 	drr->drr_u.drr_begin.drr_creation_time =
669 	    ds->ds_phys->ds_creation_time;
670 	drr->drr_u.drr_begin.drr_type = tosnap->os->os_phys->os_type;
671 	drr->drr_u.drr_begin.drr_toguid = ds->ds_phys->ds_guid;
672 	if (fromds)
673 		drr->drr_u.drr_begin.drr_fromguid = fromds->ds_phys->ds_guid;
674 	dsl_dataset_name(ds, drr->drr_u.drr_begin.drr_toname);
675 
676 	ba.drr = drr;
677 	ba.vp = vp;
678 	ba.os = tosnap;
679 	ZIO_SET_CHECKSUM(&ba.zc, 0, 0, 0, 0);
680 
681 	if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t))) {
682 		kmem_free(drr, sizeof (dmu_replay_record_t));
683 		return (ba.err);
684 	}
685 
686 	err = traverse_dsl_dataset(ds,
687 	    fromds ? fromds->ds_phys->ds_creation_txg : 0,
688 	    ADVANCE_PRE | ADVANCE_HOLES | ADVANCE_DATA | ADVANCE_NOLOCK,
689 	    backup_cb, &ba);
690 
691 	if (err) {
692 		if (err == EINTR && ba.err)
693 			err = ba.err;
694 		return (err);
695 	}
696 
697 	bzero(drr, sizeof (dmu_replay_record_t));
698 	drr->drr_type = DRR_END;
699 	drr->drr_u.drr_end.drr_checksum = ba.zc;
700 
701 	if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t)))
702 		return (ba.err);
703 
704 	kmem_free(drr, sizeof (dmu_replay_record_t));
705 
706 	return (0);
707 }
708 
709 struct restorearg {
710 	int err;
711 	int byteswap;
712 	vnode_t *vp;
713 	char *buf;
714 	uint64_t voff;
715 	int buflen; /* number of valid bytes in buf */
716 	int bufoff; /* next offset to read */
717 	int bufsize; /* amount of memory allocated for buf */
718 	zio_cksum_t zc;
719 };
720 
721 static int
722 replay_incremental_sync(dsl_dir_t *dd, void *arg, dmu_tx_t *tx)
723 {
724 	struct drr_begin *drrb = arg;
725 	dsl_dataset_t *ds = NULL;
726 	dsl_dataset_t *ds_prev = NULL;
727 	const char *snapname;
728 	int err = EINVAL;
729 	uint64_t val;
730 
731 	/* this must be a filesytem */
732 	if (dd->dd_phys->dd_head_dataset_obj == 0)
733 		goto die;
734 
735 	err = dsl_dataset_open_obj(dd->dd_pool,
736 	    dd->dd_phys->dd_head_dataset_obj,
737 	    NULL, DS_MODE_EXCLUSIVE, FTAG, &ds);
738 	if (err)
739 		goto die;
740 
741 	if (ds == NULL) {
742 		err = EBUSY;
743 		goto die;
744 	}
745 
746 	/* must already be a snapshot of this fs */
747 	if (ds->ds_phys->ds_prev_snap_obj == 0) {
748 		err = ENODEV;
749 		goto die;
750 	}
751 
752 	/* most recent snapshot must match fromguid */
753 	err = dsl_dataset_open_obj(dd->dd_pool,
754 	    ds->ds_phys->ds_prev_snap_obj, NULL,
755 	    DS_MODE_STANDARD | DS_MODE_READONLY, FTAG, &ds_prev);
756 	if (err)
757 		goto die;
758 	if (ds_prev->ds_phys->ds_guid != drrb->drr_fromguid) {
759 		err = ENODEV;
760 		goto die;
761 	}
762 
763 	/* must not have any changes since most recent snapshot */
764 	if (ds->ds_phys->ds_bp.blk_birth >
765 	    ds_prev->ds_phys->ds_creation_txg) {
766 		err = ETXTBSY;
767 		goto die;
768 	}
769 
770 	/* new snapshot name must not exist */
771 	snapname = strrchr(drrb->drr_toname, '@');
772 	if (snapname == NULL) {
773 		err = EEXIST;
774 		goto die;
775 	}
776 	snapname++;
777 	err = zap_lookup(dd->dd_pool->dp_meta_objset,
778 	    ds->ds_phys->ds_snapnames_zapobj, snapname, 8, 1, &val);
779 	if (err != ENOENT) {
780 		if (err == 0)
781 			err = EEXIST;
782 		dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
783 		dsl_dataset_close(ds_prev, DS_MODE_STANDARD, FTAG);
784 		return (err);
785 	}
786 
787 	dsl_dataset_close(ds_prev, DS_MODE_STANDARD, FTAG);
788 
789 	/* The point of no (unsuccessful) return. */
790 
791 	dmu_buf_will_dirty(ds->ds_dbuf, tx);
792 	ds->ds_phys->ds_inconsistent = TRUE;
793 
794 	dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
795 	return (0);
796 
797 die:
798 	if (ds_prev)
799 		dsl_dataset_close(ds_prev, DS_MODE_STANDARD, FTAG);
800 	if (ds)
801 		dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
802 	return (err);
803 }
804 
805 static int
806 replay_full_sync(dsl_dir_t *dd, void *arg, dmu_tx_t *tx)
807 {
808 	struct drr_begin *drrb = arg;
809 	int err;
810 	char *fsfullname, *fslastname, *cp;
811 	dsl_dataset_t *ds;
812 
813 	fsfullname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
814 	(void) strncpy(fsfullname, drrb->drr_toname, MAXNAMELEN);
815 	cp = strchr(fsfullname, '@');
816 	if (cp == NULL) {
817 		kmem_free(fsfullname, MAXNAMELEN);
818 		return (EINVAL);
819 	}
820 	*cp = '\0';
821 	fslastname = strrchr(fsfullname, '/');
822 	if (fslastname == NULL) {
823 		kmem_free(fsfullname, MAXNAMELEN);
824 		return (EINVAL);
825 	}
826 	fslastname++;
827 
828 	err = dsl_dataset_create_sync(dd, fsfullname, fslastname, NULL, tx);
829 	if (err) {
830 		kmem_free(fsfullname, MAXNAMELEN);
831 		return (err);
832 	}
833 
834 	/* the point of no (unsuccessful) return */
835 
836 	VERIFY(0 == dsl_dataset_open_spa(dd->dd_pool->dp_spa, fsfullname,
837 	    DS_MODE_EXCLUSIVE, FTAG, &ds));
838 	kmem_free(fsfullname, MAXNAMELEN);
839 
840 	(void) dmu_objset_create_impl(dsl_dataset_get_spa(ds),
841 	    ds, drrb->drr_type, tx);
842 
843 	dmu_buf_will_dirty(ds->ds_dbuf, tx);
844 	ds->ds_phys->ds_inconsistent = TRUE;
845 
846 	dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
847 	return (0);
848 }
849 
850 static int
851 replay_end_sync(dsl_dir_t *dd, void *arg, dmu_tx_t *tx)
852 {
853 	struct drr_begin *drrb = arg;
854 	int err;
855 	char *snapname;
856 	dsl_dataset_t *ds;
857 
858 	/* XXX verify that drr_toname is in dd */
859 
860 	snapname = strchr(drrb->drr_toname, '@');
861 	if (snapname == NULL)
862 		return (EINVAL);
863 	snapname++;
864 
865 	/* create snapshot */
866 	err = dsl_dataset_snapshot_sync(dd, snapname, tx);
867 	if (err)
868 		return (err);
869 
870 	/* set snapshot's creation time and guid */
871 	VERIFY(0 == dsl_dataset_open_spa(dd->dd_pool->dp_spa, drrb->drr_toname,
872 	    DS_MODE_PRIMARY | DS_MODE_READONLY | DS_MODE_INCONSISTENT,
873 	    FTAG, &ds));
874 
875 	dmu_buf_will_dirty(ds->ds_dbuf, tx);
876 	ds->ds_phys->ds_creation_time = drrb->drr_creation_time;
877 	ds->ds_phys->ds_guid = drrb->drr_toguid;
878 	ds->ds_phys->ds_inconsistent = FALSE;
879 
880 	dsl_dataset_close(ds, DS_MODE_PRIMARY, FTAG);
881 
882 	VERIFY(0 == dsl_dataset_open_obj(dd->dd_pool,
883 	    dd->dd_phys->dd_head_dataset_obj,
884 	    NULL, DS_MODE_STANDARD | DS_MODE_INCONSISTENT, FTAG, &ds));
885 	dmu_buf_will_dirty(ds->ds_dbuf, tx);
886 	ds->ds_phys->ds_inconsistent = FALSE;
887 	dsl_dataset_close(ds, DS_MODE_STANDARD, FTAG);
888 
889 	return (0);
890 }
891 
892 void *
893 restore_read(struct restorearg *ra, int len)
894 {
895 	void *rv;
896 
897 	/* some things will require 8-byte alignment, so everything must */
898 	ASSERT3U(len % 8, ==, 0);
899 
900 	while (ra->buflen - ra->bufoff < len) {
901 		ssize_t resid;
902 		int leftover = ra->buflen - ra->bufoff;
903 
904 		(void) memmove(ra->buf, ra->buf + ra->bufoff, leftover);
905 		ra->err = vn_rdwr(UIO_READ, ra->vp,
906 		    (caddr_t)ra->buf + leftover, ra->bufsize - leftover,
907 		    ra->voff, UIO_SYSSPACE, FAPPEND,
908 		    RLIM64_INFINITY, CRED(), &resid);
909 
910 		ra->voff += ra->bufsize - leftover - resid;
911 		ra->buflen = ra->bufsize - resid;
912 		ra->bufoff = 0;
913 		if (resid == ra->bufsize - leftover)
914 			ra->err = EINVAL;
915 		if (ra->err)
916 			return (NULL);
917 		/* Could compute checksum here? */
918 	}
919 
920 	ASSERT3U(ra->bufoff % 8, ==, 0);
921 	ASSERT3U(ra->buflen - ra->bufoff, >=, len);
922 	rv = ra->buf + ra->bufoff;
923 	ra->bufoff += len;
924 	if (ra->byteswap)
925 		fletcher_4_incremental_byteswap(rv, len, &ra->zc);
926 	else
927 		fletcher_4_incremental_native(rv, len, &ra->zc);
928 	return (rv);
929 }
930 
931 static void
932 backup_byteswap(dmu_replay_record_t *drr)
933 {
934 #define	DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
935 #define	DO32(X) (drr->drr_u.X = BSWAP_32(drr->drr_u.X))
936 	drr->drr_type = BSWAP_32(drr->drr_type);
937 	switch (drr->drr_type) {
938 	case DRR_BEGIN:
939 		DO64(drr_begin.drr_magic);
940 		DO64(drr_begin.drr_version);
941 		DO64(drr_begin.drr_creation_time);
942 		DO32(drr_begin.drr_type);
943 		DO64(drr_begin.drr_toguid);
944 		DO64(drr_begin.drr_fromguid);
945 		break;
946 	case DRR_OBJECT:
947 		DO64(drr_object.drr_object);
948 		/* DO64(drr_object.drr_allocation_txg); */
949 		DO32(drr_object.drr_type);
950 		DO32(drr_object.drr_bonustype);
951 		DO32(drr_object.drr_blksz);
952 		DO32(drr_object.drr_bonuslen);
953 		break;
954 	case DRR_FREEOBJECTS:
955 		DO64(drr_freeobjects.drr_firstobj);
956 		DO64(drr_freeobjects.drr_numobjs);
957 		break;
958 	case DRR_WRITE:
959 		DO64(drr_write.drr_object);
960 		DO32(drr_write.drr_type);
961 		DO64(drr_write.drr_offset);
962 		DO64(drr_write.drr_length);
963 		break;
964 	case DRR_FREE:
965 		DO64(drr_free.drr_object);
966 		DO64(drr_free.drr_offset);
967 		DO64(drr_free.drr_length);
968 		break;
969 	case DRR_END:
970 		DO64(drr_end.drr_checksum.zc_word[0]);
971 		DO64(drr_end.drr_checksum.zc_word[1]);
972 		DO64(drr_end.drr_checksum.zc_word[2]);
973 		DO64(drr_end.drr_checksum.zc_word[3]);
974 		break;
975 	}
976 #undef DO64
977 #undef DO32
978 }
979 
980 static int
981 restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
982 {
983 	int err;
984 	dmu_tx_t *tx;
985 
986 	err = dmu_object_info(os, drro->drr_object, NULL);
987 
988 	if (err != 0 && err != ENOENT)
989 		return (EINVAL);
990 
991 	if (drro->drr_type == DMU_OT_NONE ||
992 	    drro->drr_type >= DMU_OT_NUMTYPES ||
993 	    drro->drr_bonustype >= DMU_OT_NUMTYPES ||
994 	    drro->drr_checksum >= ZIO_CHECKSUM_FUNCTIONS ||
995 	    drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS ||
996 	    P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) ||
997 	    drro->drr_blksz < SPA_MINBLOCKSIZE ||
998 	    drro->drr_blksz > SPA_MAXBLOCKSIZE ||
999 	    drro->drr_bonuslen > DN_MAX_BONUSLEN) {
1000 		return (EINVAL);
1001 	}
1002 
1003 	tx = dmu_tx_create(os);
1004 
1005 	if (err == ENOENT) {
1006 		/* currently free, want to be allocated */
1007 		dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT);
1008 		dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, 1);
1009 		err = dmu_tx_assign(tx, TXG_WAIT);
1010 		if (err) {
1011 			dmu_tx_abort(tx);
1012 			return (err);
1013 		}
1014 		err = dmu_object_claim(os, drro->drr_object,
1015 		    drro->drr_type, drro->drr_blksz,
1016 		    drro->drr_bonustype, drro->drr_bonuslen, tx);
1017 	} else {
1018 		/* currently allocated, want to be allocated */
1019 		dmu_tx_hold_bonus(tx, drro->drr_object);
1020 		/*
1021 		 * We may change blocksize, so need to
1022 		 * hold_write
1023 		 */
1024 		dmu_tx_hold_write(tx, drro->drr_object, 0, 1);
1025 		err = dmu_tx_assign(tx, TXG_WAIT);
1026 		if (err) {
1027 			dmu_tx_abort(tx);
1028 			return (err);
1029 		}
1030 
1031 		err = dmu_object_reclaim(os, drro->drr_object,
1032 		    drro->drr_type, drro->drr_blksz,
1033 		    drro->drr_bonustype, drro->drr_bonuslen, tx);
1034 	}
1035 	if (err) {
1036 		dmu_tx_commit(tx);
1037 		return (EINVAL);
1038 	}
1039 
1040 	dmu_object_set_checksum(os, drro->drr_object, drro->drr_checksum, tx);
1041 	dmu_object_set_compress(os, drro->drr_object, drro->drr_compress, tx);
1042 
1043 	if (drro->drr_bonuslen) {
1044 		dmu_buf_t *db;
1045 		void *data;
1046 		VERIFY(0 == dmu_bonus_hold(os, drro->drr_object, FTAG, &db));
1047 		dmu_buf_will_dirty(db, tx);
1048 
1049 		ASSERT3U(db->db_size, ==, drro->drr_bonuslen);
1050 		data = restore_read(ra, P2ROUNDUP(db->db_size, 8));
1051 		if (data == NULL) {
1052 			dmu_tx_commit(tx);
1053 			return (ra->err);
1054 		}
1055 		bcopy(data, db->db_data, db->db_size);
1056 		if (ra->byteswap) {
1057 			dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data,
1058 			    drro->drr_bonuslen);
1059 		}
1060 		dmu_buf_rele(db, FTAG);
1061 	}
1062 	dmu_tx_commit(tx);
1063 	return (0);
1064 }
1065 
1066 /* ARGSUSED */
1067 static int
1068 restore_freeobjects(struct restorearg *ra, objset_t *os,
1069     struct drr_freeobjects *drrfo)
1070 {
1071 	uint64_t obj;
1072 
1073 	if (drrfo->drr_firstobj + drrfo->drr_numobjs < drrfo->drr_firstobj)
1074 		return (EINVAL);
1075 
1076 	for (obj = drrfo->drr_firstobj;
1077 	    obj < drrfo->drr_firstobj + drrfo->drr_numobjs; obj++) {
1078 		dmu_tx_t *tx;
1079 		int err;
1080 
1081 		if (dmu_object_info(os, obj, NULL) != 0)
1082 			continue;
1083 
1084 		tx = dmu_tx_create(os);
1085 		dmu_tx_hold_bonus(tx, obj);
1086 		err = dmu_tx_assign(tx, TXG_WAIT);
1087 		if (err) {
1088 			dmu_tx_abort(tx);
1089 			return (err);
1090 		}
1091 		err = dmu_object_free(os, obj, tx);
1092 		dmu_tx_commit(tx);
1093 		if (err && err != ENOENT)
1094 			return (EINVAL);
1095 	}
1096 	return (0);
1097 }
1098 
1099 static int
1100 restore_write(struct restorearg *ra, objset_t *os,
1101     struct drr_write *drrw)
1102 {
1103 	dmu_tx_t *tx;
1104 	void *data;
1105 	int err;
1106 
1107 	if (drrw->drr_offset + drrw->drr_length < drrw->drr_offset ||
1108 	    drrw->drr_type >= DMU_OT_NUMTYPES)
1109 		return (EINVAL);
1110 
1111 	data = restore_read(ra, drrw->drr_length);
1112 	if (data == NULL)
1113 		return (ra->err);
1114 
1115 	if (dmu_object_info(os, drrw->drr_object, NULL) != 0)
1116 		return (EINVAL);
1117 
1118 	tx = dmu_tx_create(os);
1119 
1120 	dmu_tx_hold_write(tx, drrw->drr_object,
1121 	    drrw->drr_offset, drrw->drr_length);
1122 	err = dmu_tx_assign(tx, TXG_WAIT);
1123 	if (err) {
1124 		dmu_tx_abort(tx);
1125 		return (err);
1126 	}
1127 	if (ra->byteswap)
1128 		dmu_ot[drrw->drr_type].ot_byteswap(data, drrw->drr_length);
1129 	dmu_write(os, drrw->drr_object,
1130 	    drrw->drr_offset, drrw->drr_length, data, tx);
1131 	dmu_tx_commit(tx);
1132 	return (0);
1133 }
1134 
1135 /* ARGSUSED */
1136 static int
1137 restore_free(struct restorearg *ra, objset_t *os,
1138     struct drr_free *drrf)
1139 {
1140 	dmu_tx_t *tx;
1141 	int err;
1142 
1143 	if (drrf->drr_length != -1ULL &&
1144 	    drrf->drr_offset + drrf->drr_length < drrf->drr_offset)
1145 		return (EINVAL);
1146 
1147 	if (dmu_object_info(os, drrf->drr_object, NULL) != 0)
1148 		return (EINVAL);
1149 
1150 	tx = dmu_tx_create(os);
1151 
1152 	dmu_tx_hold_free(tx, drrf->drr_object,
1153 	    drrf->drr_offset, drrf->drr_length);
1154 	err = dmu_tx_assign(tx, TXG_WAIT);
1155 	if (err) {
1156 		dmu_tx_abort(tx);
1157 		return (err);
1158 	}
1159 	err = dmu_free_range(os, drrf->drr_object,
1160 	    drrf->drr_offset, drrf->drr_length, tx);
1161 	dmu_tx_commit(tx);
1162 	return (err);
1163 }
1164 
1165 int
1166 dmu_recvbackup(char *tosnap, struct drr_begin *drrb, uint64_t *sizep,
1167     vnode_t *vp, uint64_t voffset)
1168 {
1169 	struct restorearg ra;
1170 	dmu_replay_record_t *drr;
1171 	char *cp;
1172 	dsl_dir_t *dd = NULL;
1173 	objset_t *os = NULL;
1174 	zio_cksum_t pzc;
1175 
1176 	bzero(&ra, sizeof (ra));
1177 	ra.vp = vp;
1178 	ra.voff = voffset;
1179 	ra.bufsize = 1<<20;
1180 	ra.buf = kmem_alloc(ra.bufsize, KM_SLEEP);
1181 
1182 	if (drrb->drr_magic == DMU_BACKUP_MAGIC) {
1183 		ra.byteswap = FALSE;
1184 	} else if (drrb->drr_magic == BSWAP_64(DMU_BACKUP_MAGIC)) {
1185 		ra.byteswap = TRUE;
1186 	} else {
1187 		ra.err = EINVAL;
1188 		goto out;
1189 	}
1190 
1191 	/*
1192 	 * NB: this assumes that struct drr_begin will be the largest in
1193 	 * dmu_replay_record_t's drr_u, and thus we don't need to pad it
1194 	 * with zeros to make it the same length as we wrote out.
1195 	 */
1196 	((dmu_replay_record_t *)ra.buf)->drr_type = DRR_BEGIN;
1197 	((dmu_replay_record_t *)ra.buf)->drr_pad = 0;
1198 	((dmu_replay_record_t *)ra.buf)->drr_u.drr_begin = *drrb;
1199 	if (ra.byteswap) {
1200 		fletcher_4_incremental_byteswap(ra.buf,
1201 		    sizeof (dmu_replay_record_t), &ra.zc);
1202 	} else {
1203 		fletcher_4_incremental_native(ra.buf,
1204 		    sizeof (dmu_replay_record_t), &ra.zc);
1205 	}
1206 	(void) strcpy(drrb->drr_toname, tosnap); /* for the sync funcs */
1207 
1208 	if (ra.byteswap) {
1209 		drrb->drr_magic = BSWAP_64(drrb->drr_magic);
1210 		drrb->drr_version = BSWAP_64(drrb->drr_version);
1211 		drrb->drr_creation_time = BSWAP_64(drrb->drr_creation_time);
1212 		drrb->drr_type = BSWAP_32(drrb->drr_type);
1213 		drrb->drr_toguid = BSWAP_64(drrb->drr_toguid);
1214 		drrb->drr_fromguid = BSWAP_64(drrb->drr_fromguid);
1215 	}
1216 
1217 	ASSERT3U(drrb->drr_magic, ==, DMU_BACKUP_MAGIC);
1218 
1219 	if (drrb->drr_version != DMU_BACKUP_VERSION ||
1220 	    drrb->drr_type >= DMU_OST_NUMTYPES ||
1221 	    strchr(drrb->drr_toname, '@') == NULL) {
1222 		ra.err = EINVAL;
1223 		goto out;
1224 	}
1225 
1226 	/*
1227 	 * Process the begin in syncing context.
1228 	 */
1229 	if (drrb->drr_fromguid) {
1230 		/* incremental backup */
1231 
1232 		cp = strchr(tosnap, '@');
1233 		*cp = '\0';
1234 		ra.err = dsl_dir_open(tosnap, FTAG, &dd, NULL);
1235 		*cp = '@';
1236 		if (ra.err)
1237 			goto out;
1238 
1239 		ra.err = dsl_dir_sync_task(dd, replay_incremental_sync,
1240 		    drrb, 1<<20);
1241 	} else {
1242 		/* full backup */
1243 		const char *tail;
1244 
1245 		cp = strchr(tosnap, '@');
1246 		*cp = '\0';
1247 		ra.err = dsl_dir_open(tosnap, FTAG, &dd, &tail);
1248 		*cp = '@';
1249 		if (ra.err)
1250 			goto out;
1251 		if (tail == NULL) {
1252 			ra.err = EEXIST;
1253 			goto out;
1254 		}
1255 
1256 		ra.err = dsl_dir_sync_task(dd, replay_full_sync,
1257 		    drrb, 1<<20);
1258 	}
1259 	if (ra.err)
1260 		goto out;
1261 
1262 	/*
1263 	 * Open the objset we are modifying.
1264 	 */
1265 
1266 	cp = strchr(tosnap, '@');
1267 	*cp = '\0';
1268 	ra.err = dmu_objset_open(tosnap, DMU_OST_ANY,
1269 	    DS_MODE_PRIMARY | DS_MODE_INCONSISTENT, &os);
1270 	*cp = '@';
1271 	ASSERT3U(ra.err, ==, 0);
1272 
1273 	/*
1274 	 * Read records and process them.
1275 	 */
1276 	pzc = ra.zc;
1277 	while (ra.err == 0 &&
1278 	    NULL != (drr = restore_read(&ra, sizeof (*drr)))) {
1279 		if (issig(JUSTLOOKING) && issig(FORREAL)) {
1280 			ra.err = EINTR;
1281 			goto out;
1282 		}
1283 
1284 		if (ra.byteswap)
1285 			backup_byteswap(drr);
1286 
1287 		switch (drr->drr_type) {
1288 		case DRR_OBJECT:
1289 		{
1290 			/*
1291 			 * We need to make a copy of the record header,
1292 			 * because restore_{object,write} may need to
1293 			 * restore_read(), which will invalidate drr.
1294 			 */
1295 			struct drr_object drro = drr->drr_u.drr_object;
1296 			ra.err = restore_object(&ra, os, &drro);
1297 			break;
1298 		}
1299 		case DRR_FREEOBJECTS:
1300 		{
1301 			struct drr_freeobjects drrfo =
1302 			    drr->drr_u.drr_freeobjects;
1303 			ra.err = restore_freeobjects(&ra, os, &drrfo);
1304 			break;
1305 		}
1306 		case DRR_WRITE:
1307 		{
1308 			struct drr_write drrw = drr->drr_u.drr_write;
1309 			ra.err = restore_write(&ra, os, &drrw);
1310 			break;
1311 		}
1312 		case DRR_FREE:
1313 		{
1314 			struct drr_free drrf = drr->drr_u.drr_free;
1315 			ra.err = restore_free(&ra, os, &drrf);
1316 			break;
1317 		}
1318 		case DRR_END:
1319 		{
1320 			struct drr_end drre = drr->drr_u.drr_end;
1321 			/*
1322 			 * We compare against the *previous* checksum
1323 			 * value, because the stored checksum is of
1324 			 * everything before the DRR_END record.
1325 			 */
1326 			if (drre.drr_checksum.zc_word[0] != 0 &&
1327 			    ((drre.drr_checksum.zc_word[0] - pzc.zc_word[0]) |
1328 			    (drre.drr_checksum.zc_word[1] - pzc.zc_word[1]) |
1329 			    (drre.drr_checksum.zc_word[2] - pzc.zc_word[2]) |
1330 			    (drre.drr_checksum.zc_word[3] - pzc.zc_word[3]))) {
1331 				ra.err = ECKSUM;
1332 				goto out;
1333 			}
1334 
1335 			/*
1336 			 * dd may be the parent of the dd we are
1337 			 * restoring into (eg. if it's a full backup).
1338 			 */
1339 			ra.err = dsl_dir_sync_task(dmu_objset_ds(os)->
1340 			    ds_dir, replay_end_sync, drrb, 1<<20);
1341 			goto out;
1342 		}
1343 		default:
1344 			ra.err = EINVAL;
1345 			goto out;
1346 		}
1347 		pzc = ra.zc;
1348 	}
1349 
1350 out:
1351 	if (os)
1352 		dmu_objset_close(os);
1353 
1354 	/*
1355 	 * Make sure we don't rollback/destroy unless we actually
1356 	 * processed the begin properly.  'os' will only be set if this
1357 	 * is the case.
1358 	 */
1359 	if (ra.err && os && dd && tosnap && strchr(tosnap, '@')) {
1360 		/*
1361 		 * rollback or destroy what we created, so we don't
1362 		 * leave it in the restoring state.
1363 		 */
1364 		txg_wait_synced(dd->dd_pool, 0);
1365 		if (drrb->drr_fromguid) {
1366 			/* incremental: rollback to most recent snapshot */
1367 			(void) dsl_dir_sync_task(dd,
1368 			    dsl_dataset_rollback_sync, NULL, 0);
1369 		} else {
1370 			/* full: destroy whole fs */
1371 			cp = strchr(tosnap, '@');
1372 			*cp = '\0';
1373 			cp = strchr(tosnap, '/');
1374 			if (cp) {
1375 				(void) dsl_dir_sync_task(dd,
1376 				    dsl_dir_destroy_sync, cp+1, 0);
1377 			}
1378 			cp = strchr(tosnap, '\0');
1379 			*cp = '@';
1380 		}
1381 
1382 	}
1383 
1384 	if (dd)
1385 		dsl_dir_close(dd, FTAG);
1386 	kmem_free(ra.buf, ra.bufsize);
1387 	if (sizep)
1388 		*sizep = ra.voff;
1389 	return (ra.err);
1390 }
1391 
1392 /*
1393  * Intent log support: sync the block at <os, object, offset> to disk.
1394  * N.B. and XXX: the caller is responsible for serializing dmu_sync()s
1395  * of the same block, and for making sure that the data isn't changing
1396  * while dmu_sync() is writing it.
1397  *
1398  * Return values:
1399  *
1400  *	EALREADY: this txg has already been synced, so there's nothing to to.
1401  *		The caller should not log the write.
1402  *
1403  *	ENOENT: the block was dbuf_free_range()'d, so there's nothing to do.
1404  *		The caller should not log the write.
1405  *
1406  *	EINPROGRESS: the block is in the process of being synced by the
1407  *		usual mechanism (spa_sync()), so we can't sync it here.
1408  *		The caller should txg_wait_synced() and not log the write.
1409  *
1410  *	EBUSY: another thread is trying to dmu_sync() the same dbuf.
1411  *		(This case cannot arise under the current locking rules.)
1412  *		The caller should txg_wait_synced() and not log the write.
1413  *
1414  *	ESTALE: the block was dirtied or freed while we were writing it,
1415  *		so the data is no longer valid.
1416  *		The caller should txg_wait_synced() and not log the write.
1417  *
1418  *	0: success.  Sets *bp to the blkptr just written, and sets
1419  *		*blkoff to the data's offset within that block.
1420  *		The caller should log this blkptr/blkoff in its lr_write_t.
1421  */
1422 int
1423 dmu_sync(objset_t *os, uint64_t object, uint64_t offset, uint64_t *blkoff,
1424     blkptr_t *bp, uint64_t txg)
1425 {
1426 	objset_impl_t *osi = os->os;
1427 	dsl_pool_t *dp = osi->os_dsl_dataset->ds_dir->dd_pool;
1428 	tx_state_t *tx = &dp->dp_tx;
1429 	dmu_buf_impl_t *db;
1430 	blkptr_t *blk;
1431 	int err;
1432 	zbookmark_t zb;
1433 
1434 	ASSERT(RW_LOCK_HELD(&tx->tx_suspend));
1435 	ASSERT(BP_IS_HOLE(bp));
1436 	ASSERT(txg != 0);
1437 
1438 	dprintf("dmu_sync txg=%llu, s,o,q %llu %llu %llu\n",
1439 	    txg, tx->tx_synced_txg, tx->tx_open_txg, tx->tx_quiesced_txg);
1440 
1441 	/*
1442 	 * XXX why is this routine using dmu_buf_*() and casting between
1443 	 * dmu_buf_impl_t and dmu_buf_t?
1444 	 */
1445 
1446 	/*
1447 	 * If this txg already synced, there's nothing to do.
1448 	 */
1449 	if (txg <= tx->tx_synced_txg) {
1450 		/*
1451 		 * If we're running ziltest, we need the blkptr regardless.
1452 		 */
1453 		if (txg > spa_freeze_txg(dp->dp_spa)) {
1454 			err = dmu_buf_hold(os, object, offset,
1455 			    FTAG, (dmu_buf_t **)&db);
1456 			if (err)
1457 				return (err);
1458 			/* if db_blkptr == NULL, this was an empty write */
1459 			if (db->db_blkptr)
1460 				*bp = *db->db_blkptr; /* structure assignment */
1461 			else
1462 				bzero(bp, sizeof (blkptr_t));
1463 			*blkoff = offset - db->db.db_offset;
1464 			ASSERT3U(*blkoff, <, db->db.db_size);
1465 			dmu_buf_rele((dmu_buf_t *)db, FTAG);
1466 			return (0);
1467 		}
1468 		return (EALREADY);
1469 	}
1470 
1471 	/*
1472 	 * If this txg is in the middle of syncing, just wait for it.
1473 	 */
1474 	if (txg == tx->tx_syncing_txg) {
1475 		ASSERT(txg != tx->tx_open_txg);
1476 		return (EINPROGRESS);
1477 	}
1478 
1479 	err = dmu_buf_hold(os, object, offset, FTAG, (dmu_buf_t **)&db);
1480 	if (err)
1481 		return (err);
1482 
1483 	mutex_enter(&db->db_mtx);
1484 
1485 	/*
1486 	 * If this dbuf isn't dirty, must have been free_range'd.
1487 	 * There's no need to log writes to freed blocks, so we're done.
1488 	 */
1489 	if (!list_link_active(&db->db_dirty_node[txg&TXG_MASK])) {
1490 		mutex_exit(&db->db_mtx);
1491 		dmu_buf_rele((dmu_buf_t *)db, FTAG);
1492 		return (ENOENT);
1493 	}
1494 
1495 	blk = db->db_d.db_overridden_by[txg&TXG_MASK];
1496 
1497 	/*
1498 	 * If we already did a dmu_sync() of this dbuf in this txg,
1499 	 * free the old block before writing the new one.
1500 	 */
1501 	if (blk != NULL) {
1502 		ASSERT(blk != IN_DMU_SYNC);
1503 		if (blk == IN_DMU_SYNC) {
1504 			mutex_exit(&db->db_mtx);
1505 			dmu_buf_rele((dmu_buf_t *)db, FTAG);
1506 			return (EBUSY);
1507 		}
1508 		arc_release(db->db_d.db_data_old[txg&TXG_MASK], db);
1509 		if (!BP_IS_HOLE(blk)) {
1510 			(void) arc_free(NULL, osi->os_spa, txg, blk,
1511 			    NULL, NULL, ARC_WAIT);
1512 		}
1513 		kmem_free(blk, sizeof (blkptr_t));
1514 	}
1515 
1516 	db->db_d.db_overridden_by[txg&TXG_MASK] = IN_DMU_SYNC;
1517 	mutex_exit(&db->db_mtx);
1518 
1519 	blk = kmem_alloc(sizeof (blkptr_t), KM_SLEEP);
1520 	blk->blk_birth = 0; /* mark as invalid */
1521 
1522 	zb.zb_objset = osi->os_dsl_dataset->ds_object;
1523 	zb.zb_object = db->db.db_object;
1524 	zb.zb_level = db->db_level;
1525 	zb.zb_blkid = db->db_blkid;
1526 	err = arc_write(NULL, osi->os_spa,
1527 	    zio_checksum_select(db->db_dnode->dn_checksum, osi->os_checksum),
1528 	    zio_compress_select(db->db_dnode->dn_compress, osi->os_compress),
1529 	    dmu_get_replication_level(osi->os_spa, &zb, db->db_dnode->dn_type),
1530 	    txg, blk, db->db_d.db_data_old[txg&TXG_MASK], NULL, NULL,
1531 	    ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, ARC_WAIT, &zb);
1532 	ASSERT(err == 0);
1533 
1534 	if (!BP_IS_HOLE(blk)) {
1535 		blk->blk_fill = 1;
1536 		BP_SET_TYPE(blk, db->db_dnode->dn_type);
1537 		BP_SET_LEVEL(blk, 0);
1538 	}
1539 
1540 	/* copy the block pointer back to caller */
1541 	*bp = *blk; /* structure assignment */
1542 	*blkoff = offset - db->db.db_offset;
1543 	ASSERT3U(*blkoff, <, db->db.db_size);
1544 
1545 	mutex_enter(&db->db_mtx);
1546 	if (db->db_d.db_overridden_by[txg&TXG_MASK] != IN_DMU_SYNC) {
1547 		/* we were dirtied/freed during the sync */
1548 		ASSERT3P(db->db_d.db_overridden_by[txg&TXG_MASK], ==, NULL);
1549 		arc_release(db->db_d.db_data_old[txg&TXG_MASK], db);
1550 		mutex_exit(&db->db_mtx);
1551 		dmu_buf_rele((dmu_buf_t *)db, FTAG);
1552 		/* Note that this block does not free on disk until txg syncs */
1553 
1554 		/*
1555 		 * XXX can we use ARC_NOWAIT here?
1556 		 * XXX should we be ignoring the return code?
1557 		 */
1558 		if (!BP_IS_HOLE(blk)) {
1559 			(void) arc_free(NULL, osi->os_spa, txg, blk,
1560 			    NULL, NULL, ARC_WAIT);
1561 		}
1562 		kmem_free(blk, sizeof (blkptr_t));
1563 		return (ESTALE);
1564 	}
1565 
1566 	db->db_d.db_overridden_by[txg&TXG_MASK] = blk;
1567 	mutex_exit(&db->db_mtx);
1568 	dmu_buf_rele((dmu_buf_t *)db, FTAG);
1569 	ASSERT3U(txg, >, tx->tx_syncing_txg);
1570 	return (0);
1571 }
1572 
1573 uint64_t
1574 dmu_object_max_nonzero_offset(objset_t *os, uint64_t object)
1575 {
1576 	dnode_t *dn;
1577 
1578 	/* XXX assumes dnode_hold will not get an i/o error */
1579 	(void) dnode_hold(os->os, object, FTAG, &dn);
1580 	uint64_t rv = dnode_max_nonzero_offset(dn);
1581 	dnode_rele(dn, FTAG);
1582 	return (rv);
1583 }
1584 
1585 int
1586 dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size, int ibs,
1587 	dmu_tx_t *tx)
1588 {
1589 	dnode_t *dn;
1590 	int err;
1591 
1592 	err = dnode_hold(os->os, object, FTAG, &dn);
1593 	if (err)
1594 		return (err);
1595 	err = dnode_set_blksz(dn, size, ibs, tx);
1596 	dnode_rele(dn, FTAG);
1597 	return (err);
1598 }
1599 
1600 void
1601 dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
1602 	dmu_tx_t *tx)
1603 {
1604 	dnode_t *dn;
1605 
1606 	/* XXX assumes dnode_hold will not get an i/o error */
1607 	(void) dnode_hold(os->os, object, FTAG, &dn);
1608 	ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
1609 	dn->dn_checksum = checksum;
1610 	dnode_setdirty(dn, tx);
1611 	dnode_rele(dn, FTAG);
1612 }
1613 
1614 void
1615 dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
1616 	dmu_tx_t *tx)
1617 {
1618 	dnode_t *dn;
1619 
1620 	/* XXX assumes dnode_hold will not get an i/o error */
1621 	(void) dnode_hold(os->os, object, FTAG, &dn);
1622 	ASSERT(compress < ZIO_COMPRESS_FUNCTIONS);
1623 	dn->dn_compress = compress;
1624 	dnode_setdirty(dn, tx);
1625 	dnode_rele(dn, FTAG);
1626 }
1627 
1628 /*
1629  * XXX - eventually, this should take into account per-dataset (or
1630  *       even per-object?) user requests for higher levels of replication.
1631  */
1632 int
1633 dmu_get_replication_level(spa_t *spa, zbookmark_t *zb, dmu_object_type_t ot)
1634 {
1635 	int ncopies = 1;
1636 
1637 	if (dmu_ot[ot].ot_metadata)
1638 		ncopies++;
1639 	if (zb->zb_level != 0)
1640 		ncopies++;
1641 	if (zb->zb_objset == 0 && zb->zb_object == 0)
1642 		ncopies++;
1643 	return (MIN(ncopies, spa_max_replication(spa)));
1644 }
1645 
1646 int
1647 dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
1648 {
1649 	dnode_t *dn;
1650 	int i, err;
1651 
1652 	err = dnode_hold(os->os, object, FTAG, &dn);
1653 	if (err)
1654 		return (err);
1655 	/*
1656 	 * Sync any current changes before
1657 	 * we go trundling through the block pointers.
1658 	 */
1659 	for (i = 0; i < TXG_SIZE; i++) {
1660 		if (list_link_active(&dn->dn_dirty_link[i]))
1661 			break;
1662 	}
1663 	if (i != TXG_SIZE) {
1664 		dnode_rele(dn, FTAG);
1665 		txg_wait_synced(dmu_objset_pool(os), 0);
1666 		err = dnode_hold(os->os, object, FTAG, &dn);
1667 		if (err)
1668 			return (err);
1669 	}
1670 
1671 	err = dnode_next_offset(dn, hole, off, 1, 1);
1672 	dnode_rele(dn, FTAG);
1673 
1674 	return (err);
1675 }
1676 
1677 void
1678 dmu_object_info_from_dnode(dnode_t *dn, dmu_object_info_t *doi)
1679 {
1680 	rw_enter(&dn->dn_struct_rwlock, RW_READER);
1681 	mutex_enter(&dn->dn_mtx);
1682 
1683 	doi->doi_data_block_size = dn->dn_datablksz;
1684 	doi->doi_metadata_block_size = dn->dn_indblkshift ?
1685 	    1ULL << dn->dn_indblkshift : 0;
1686 	doi->doi_indirection = dn->dn_nlevels;
1687 	doi->doi_checksum = dn->dn_checksum;
1688 	doi->doi_compress = dn->dn_compress;
1689 	doi->doi_physical_blks = dn->dn_phys->dn_secphys;
1690 	doi->doi_max_block_offset = dn->dn_phys->dn_maxblkid;
1691 	doi->doi_type = dn->dn_type;
1692 	doi->doi_bonus_size = dn->dn_bonuslen;
1693 	doi->doi_bonus_type = dn->dn_bonustype;
1694 
1695 	mutex_exit(&dn->dn_mtx);
1696 	rw_exit(&dn->dn_struct_rwlock);
1697 }
1698 
1699 /*
1700  * Get information on a DMU object.
1701  * If doi is NULL, just indicates whether the object exists.
1702  */
1703 int
1704 dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
1705 {
1706 	dnode_t *dn;
1707 	int err = dnode_hold(os->os, object, FTAG, &dn);
1708 
1709 	if (err)
1710 		return (err);
1711 
1712 	if (doi != NULL)
1713 		dmu_object_info_from_dnode(dn, doi);
1714 
1715 	dnode_rele(dn, FTAG);
1716 	return (0);
1717 }
1718 
1719 /*
1720  * As above, but faster; can be used when you have a held dbuf in hand.
1721  */
1722 void
1723 dmu_object_info_from_db(dmu_buf_t *db, dmu_object_info_t *doi)
1724 {
1725 	dmu_object_info_from_dnode(((dmu_buf_impl_t *)db)->db_dnode, doi);
1726 }
1727 
1728 /*
1729  * Faster still when you only care about the size.
1730  * This is specifically optimized for zfs_getattr().
1731  */
1732 void
1733 dmu_object_size_from_db(dmu_buf_t *db, uint32_t *blksize, u_longlong_t *nblk512)
1734 {
1735 	dnode_t *dn = ((dmu_buf_impl_t *)db)->db_dnode;
1736 
1737 	*blksize = dn->dn_datablksz;
1738 	*nblk512 = dn->dn_phys->dn_secphys + 1;	/* add 1 for dnode space */
1739 }
1740 
1741 /*
1742  * Given a bookmark, return the name of the dataset, object, and range in
1743  * human-readable format.
1744  */
1745 int
1746 spa_bookmark_name(spa_t *spa, zbookmark_t *zb, char *dsname, size_t dslen,
1747     char *objname, size_t objlen, char *range, size_t rangelen)
1748 {
1749 	dsl_pool_t *dp;
1750 	dsl_dataset_t *ds = NULL;
1751 	objset_t *os = NULL;
1752 	dnode_t *dn = NULL;
1753 	int err, shift;
1754 
1755 	if (dslen < MAXNAMELEN || objlen < 32 || rangelen < 64)
1756 		return (ENOSPC);
1757 
1758 	dp = spa_get_dsl(spa);
1759 	if (zb->zb_objset != 0) {
1760 		rw_enter(&dp->dp_config_rwlock, RW_READER);
1761 		err = dsl_dataset_open_obj(dp, zb->zb_objset,
1762 		    NULL, DS_MODE_NONE, FTAG, &ds);
1763 		if (err) {
1764 			rw_exit(&dp->dp_config_rwlock);
1765 			return (err);
1766 		}
1767 		dsl_dataset_name(ds, dsname);
1768 		dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
1769 		rw_exit(&dp->dp_config_rwlock);
1770 
1771 		err = dmu_objset_open(dsname, DMU_OST_ANY, DS_MODE_NONE, &os);
1772 		if (err)
1773 			goto out;
1774 
1775 	} else {
1776 		dsl_dataset_name(NULL, dsname);
1777 		os = dp->dp_meta_objset;
1778 	}
1779 
1780 
1781 	if (zb->zb_object == DMU_META_DNODE_OBJECT) {
1782 		(void) strncpy(objname, "mdn", objlen);
1783 	} else {
1784 		(void) snprintf(objname, objlen, "%lld",
1785 		    (longlong_t)zb->zb_object);
1786 	}
1787 
1788 	err = dnode_hold(os->os, zb->zb_object, FTAG, &dn);
1789 	if (err)
1790 		goto out;
1791 
1792 	shift = (dn->dn_datablkshift?dn->dn_datablkshift:SPA_MAXBLOCKSHIFT) +
1793 	    zb->zb_level * (dn->dn_indblkshift - SPA_BLKPTRSHIFT);
1794 	(void) snprintf(range, rangelen, "%llu-%llu",
1795 	    (u_longlong_t)(zb->zb_blkid << shift),
1796 	    (u_longlong_t)((zb->zb_blkid+1) << shift));
1797 
1798 out:
1799 	if (dn)
1800 		dnode_rele(dn, FTAG);
1801 	if (os && os != dp->dp_meta_objset)
1802 		dmu_objset_close(os);
1803 	return (err);
1804 }
1805 
1806 void
1807 byteswap_uint64_array(void *vbuf, size_t size)
1808 {
1809 	uint64_t *buf = vbuf;
1810 	size_t count = size >> 3;
1811 	int i;
1812 
1813 	ASSERT((size & 7) == 0);
1814 
1815 	for (i = 0; i < count; i++)
1816 		buf[i] = BSWAP_64(buf[i]);
1817 }
1818 
1819 void
1820 byteswap_uint32_array(void *vbuf, size_t size)
1821 {
1822 	uint32_t *buf = vbuf;
1823 	size_t count = size >> 2;
1824 	int i;
1825 
1826 	ASSERT((size & 3) == 0);
1827 
1828 	for (i = 0; i < count; i++)
1829 		buf[i] = BSWAP_32(buf[i]);
1830 }
1831 
1832 void
1833 byteswap_uint16_array(void *vbuf, size_t size)
1834 {
1835 	uint16_t *buf = vbuf;
1836 	size_t count = size >> 1;
1837 	int i;
1838 
1839 	ASSERT((size & 1) == 0);
1840 
1841 	for (i = 0; i < count; i++)
1842 		buf[i] = BSWAP_16(buf[i]);
1843 }
1844 
1845 /* ARGSUSED */
1846 void
1847 byteswap_uint8_array(void *vbuf, size_t size)
1848 {
1849 }
1850 
1851 void
1852 dmu_init(void)
1853 {
1854 	dbuf_init();
1855 	dnode_init();
1856 	arc_init();
1857 }
1858 
1859 void
1860 dmu_fini(void)
1861 {
1862 	arc_fini();
1863 	dnode_fini();
1864 	dbuf_fini();
1865 }
1866