annotate usr/src/uts/common/fs/zfs/dmu.c @ 2237:45affe88ed99

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