annotate usr/src/uts/common/fs/zfs/dmu.c @ 2986:c782fcf7a319

6485204 more tuneable tweakin
author ek110237
date Thu, 26 Oct 2006 14:05:48 -0700
parents acfcfefbc60d
children 4e5ee8301d84
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>
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
40 #include <sys/dsl_prop.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
41 #include <sys/dmu_zfetch.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
42 #include <sys/zfs_ioctl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
43 #include <sys/zap.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
44 #include <sys/zio_checksum.h>
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
45 #ifdef _KERNEL
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
46 #include <sys/vmsystm.h>
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
47 #endif
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
48
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
49 const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
50 { byteswap_uint8_array, TRUE, "unallocated" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
51 { zap_byteswap, TRUE, "object directory" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
52 { byteswap_uint64_array, TRUE, "object array" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
53 { byteswap_uint8_array, TRUE, "packed nvlist" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
54 { byteswap_uint64_array, TRUE, "packed nvlist size" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
55 { byteswap_uint64_array, TRUE, "bplist" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
56 { byteswap_uint64_array, TRUE, "bplist header" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
57 { byteswap_uint64_array, TRUE, "SPA space map header" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
58 { byteswap_uint64_array, TRUE, "SPA space map" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
59 { byteswap_uint64_array, TRUE, "ZIL intent log" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
60 { dnode_buf_byteswap, TRUE, "DMU dnode" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
61 { dmu_objset_byteswap, TRUE, "DMU objset" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
62 { byteswap_uint64_array, TRUE, "DSL directory" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
63 { zap_byteswap, TRUE, "DSL directory child map"},
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
64 { zap_byteswap, TRUE, "DSL dataset snap map" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
65 { zap_byteswap, TRUE, "DSL props" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
66 { byteswap_uint64_array, TRUE, "DSL dataset" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
67 { zfs_znode_byteswap, TRUE, "ZFS znode" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
68 { zfs_acl_byteswap, TRUE, "ZFS ACL" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
69 { byteswap_uint8_array, FALSE, "ZFS plain file" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
70 { zap_byteswap, TRUE, "ZFS directory" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
71 { zap_byteswap, TRUE, "ZFS master node" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
72 { zap_byteswap, TRUE, "ZFS delete queue" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
73 { byteswap_uint8_array, FALSE, "zvol object" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
74 { zap_byteswap, TRUE, "zvol prop" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
75 { byteswap_uint8_array, FALSE, "other uint8[]" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
76 { byteswap_uint64_array, FALSE, "other uint64[]" },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
77 { zap_byteswap, TRUE, "other ZAP" },
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
78 { zap_byteswap, TRUE, "persistent error log" },
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
79 { byteswap_uint8_array, TRUE, "SPA history" },
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
80 { byteswap_uint64_array, TRUE, "SPA history offsets" },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
81 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
82
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
83 int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
84 dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
85 void *tag, dmu_buf_t **dbp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
86 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
87 dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
88 uint64_t blkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
89 dmu_buf_impl_t *db;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
90 int err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
91
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
92 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
93 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
94 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
95 blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
96 rw_enter(&dn->dn_struct_rwlock, RW_READER);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
97 db = dbuf_hold(dn, blkid, tag);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
98 rw_exit(&dn->dn_struct_rwlock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
99 if (db == NULL) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
100 err = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
101 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
102 err = dbuf_read(db, NULL, DB_RF_CANFAIL);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
103 if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
104 dbuf_rele(db, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
105 db = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
106 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
107 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
108
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
109 dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
110 *dbp = &db->db;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
111 return (err);
789
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 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
115 dmu_bonus_max(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
116 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
117 return (DN_MAX_BONUSLEN);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
118 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
119
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
120 /*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
121 * returns ENOENT, EIO, or 0.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
122 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
123 int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
124 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
125 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
126 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
127 int err, count;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
128 dmu_buf_impl_t *db;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
129
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
130 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
131 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
132 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
133
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
134 rw_enter(&dn->dn_struct_rwlock, RW_READER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
135 if (dn->dn_bonus == NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
136 rw_exit(&dn->dn_struct_rwlock);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
137 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
138 if (dn->dn_bonus == NULL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
139 dn->dn_bonus = dbuf_create_bonus(dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
140 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
141 db = dn->dn_bonus;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
142 rw_exit(&dn->dn_struct_rwlock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
143 mutex_enter(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
144 count = refcount_add(&db->db_holds, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
145 mutex_exit(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
146 if (count == 1)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
147 dnode_add_ref(dn, db);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
148 dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
149
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
150 VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
151
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
152 *dbp = &db->db;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
153 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
154 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
155
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
156 /*
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
157 * Note: longer-term, we should modify all of the dmu_buf_*() interfaces
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
158 * to take a held dnode rather than <os, object> -- the lookup is wasteful,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
159 * and can induce severe lock contention when writing to several files
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
160 * whose dnodes are in the same block.
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
161 */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
162 static int
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
163 dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
164 uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
165 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
166 dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
167 uint64_t blkid, nblks, i;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
168 uint32_t flags;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
169 int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
170 zio_t *zio;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
171
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
172 ASSERT(length <= DMU_MAX_ACCESS);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
173
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
174 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
175 if (length > zfetch_array_rd_sz)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
176 flags |= DB_RF_NOPREFETCH;
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 zio_nowait(zio);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
197 return (EIO);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
198 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
199 /* initiate async i/o */
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
200 if (read) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
201 rw_exit(&dn->dn_struct_rwlock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
202 (void) dbuf_read(db, zio, flags);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
203 rw_enter(&dn->dn_struct_rwlock, RW_READER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
204 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
205 dbp[i] = &db->db;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
206 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
207 rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
208
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
209 /* wait for async i/o */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
210 err = zio_wait(zio);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
211 if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
212 dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
213 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
214 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
215
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
216 /* wait for other io to complete */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
217 if (read) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
218 for (i = 0; i < nblks; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
219 dmu_buf_impl_t *db = (dmu_buf_impl_t *)dbp[i];
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
220 mutex_enter(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
221 while (db->db_state == DB_READ ||
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
222 db->db_state == DB_FILL)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
223 cv_wait(&db->db_changed, &db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
224 if (db->db_state == DB_UNCACHED)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
225 err = EIO;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
226 mutex_exit(&db->db_mtx);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
227 if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
228 dmu_buf_rele_array(dbp, nblks, tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
229 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
230 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
231 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
232 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
233
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
234 *numbufsp = nblks;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
235 *dbpp = dbp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
236 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
237 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
238
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
239 static int
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
240 dmu_buf_hold_array(objset_t *os, uint64_t object, uint64_t offset,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
241 uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
242 {
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
243 dnode_t *dn;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
244 int err;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
245
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
246 err = dnode_hold(os->os, object, FTAG, &dn);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
247 if (err)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
248 return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
249
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
250 err = dmu_buf_hold_array_by_dnode(dn, offset, length, read, tag,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
251 numbufsp, dbpp);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
252
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
253 dnode_rele(dn, FTAG);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
254
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
255 return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
256 }
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
257
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
258 int
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
259 dmu_buf_hold_array_by_bonus(dmu_buf_t *db, uint64_t offset,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
260 uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
261 {
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
262 dnode_t *dn = ((dmu_buf_impl_t *)db)->db_dnode;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
263 int err;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
264
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
265 err = dmu_buf_hold_array_by_dnode(dn, offset, length, read, tag,
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
266 numbufsp, dbpp);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
267
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
268 return (err);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
269 }
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
270
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
271 void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
272 dmu_buf_rele_array(dmu_buf_t **dbp_fake, int numbufs, void *tag)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
273 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
274 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
275 dmu_buf_impl_t **dbp = (dmu_buf_impl_t **)dbp_fake;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
276
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
277 if (numbufs == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
278 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
279
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
280 for (i = 0; i < numbufs; i++) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
281 if (dbp[i])
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
282 dbuf_rele(dbp[i], tag);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
283 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
284
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
285 kmem_free(dbp, sizeof (dmu_buf_t *) * numbufs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
286 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
287
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
288 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
289 dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset, uint64_t len)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
290 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
291 dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
292 uint64_t blkid;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
293 int nblks, i, err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
294
2986
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
295 if (zfs_prefetch_disable)
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
296 return;
c782fcf7a319 6485204 more tuneable tweakin
ek110237
parents: 2926
diff changeset
297
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
298 if (len == 0) { /* they're interested in the bonus buffer */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
299 dn = os->os->os_meta_dnode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
300
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
301 if (object == 0 || object >= DN_MAX_OBJECT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
302 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
303
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
304 rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
305 blkid = dbuf_whichblock(dn, object * sizeof (dnode_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
306 dbuf_prefetch(dn, blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
307 rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
308 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
309 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
310
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
311 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
312 * XXX - Note, if the dnode for the requested object is not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
313 * already cached, we will do a *synchronous* read in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
314 * dnode_hold() call. The same is true for any indirects.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
315 */
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
316 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
317 if (err != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
318 return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
320 rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
321 if (dn->dn_datablkshift) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
322 int blkshift = dn->dn_datablkshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
323 nblks = (P2ROUNDUP(offset+len, 1<<blkshift) -
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
324 P2ALIGN(offset, 1<<blkshift)) >> blkshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
325 } else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
326 nblks = (offset < dn->dn_datablksz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
327 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
328
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
329 if (nblks != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
330 blkid = dbuf_whichblock(dn, offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
331 for (i = 0; i < nblks; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
332 dbuf_prefetch(dn, blkid+i);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
333 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
334
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
335 rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
336
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
337 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
338 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
339
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
340 int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
341 dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
342 uint64_t size, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
343 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
344 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
345 int err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
346 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
347 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
348 ASSERT(offset < UINT64_MAX);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
349 ASSERT(size == -1ULL || size <= UINT64_MAX - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
350 dnode_free_range(dn, offset, size, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
351 dnode_rele(dn, FTAG);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
352 return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
353 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
354
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
355 int
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
356 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
357 void *buf)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
358 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
359 dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
360 dmu_buf_t **dbp;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
361 int numbufs, i, err;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
362
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
363 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
364 * Deal with odd block sizes, where there can't be data past the
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
365 * first block.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
366 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
367 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
368 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
369 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
370 if (dn->dn_datablkshift == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
371 int newsz = offset > dn->dn_datablksz ? 0 :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
372 MIN(size, dn->dn_datablksz - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
373 bzero((char *)buf + newsz, size - newsz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
374 size = newsz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
375 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
376
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
377 while (size > 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
378 uint64_t mylen = MIN(size, DMU_MAX_ACCESS / 2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
379 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
380
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
381 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
382 * NB: we could do this block-at-a-time, but it's nice
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
383 * to be reading in parallel.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
384 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
385 err = dmu_buf_hold_array_by_dnode(dn, offset, mylen,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
386 TRUE, FTAG, &numbufs, &dbp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
387 if (err)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
388 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
389
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
390 for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
391 int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
392 int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
393 dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
394
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
395 ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
396
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
397 bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
398 tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
399
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
400 bcopy((char *)db->db_data + bufoff, buf, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
401
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
402 offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
403 size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
404 buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
405 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
406 dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
407 }
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
408 dnode_rele(dn, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
409 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
410 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
411
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
412 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
413 dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
414 const void *buf, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
415 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
416 dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
417 int numbufs, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
418
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
419 if (size == 0)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
420 return;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
421
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
422 VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
423 FALSE, FTAG, &numbufs, &dbp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
424
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
425 for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
426 int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
427 int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
428 dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
429
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
430 ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
431
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
432 bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
433 tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
434
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
435 ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
436
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
437 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
438 dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
439 else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
440 dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
441
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
442 bcopy(buf, (char *)db->db_data + bufoff, tocpy);
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_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
446
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
447 offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
448 size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
449 buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
450 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
451 dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
452 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
453
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
454 #ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
455 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
456 dmu_write_uio(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
457 uio_t *uio, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
458 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
459 dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
460 int numbufs, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
461 int err = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
462
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
463 if (size == 0)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
464 return (0);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
465
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
466 err = dmu_buf_hold_array(os, object, offset, size,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
467 FALSE, FTAG, &numbufs, &dbp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
468 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
469 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
470
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
471 for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
472 int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
473 int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
474 dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
475
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
476 ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
477
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
478 bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
479 tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
480
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
481 ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
482
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
483 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
484 dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
485 else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
486 dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
487
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
488 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
489 * XXX uiomove could block forever (eg. nfs-backed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
490 * pages). There needs to be a uiolockdown() function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
491 * to lock the pages in memory, so that uiomove won't
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
492 * block.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
493 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
494 err = uiomove((char *)db->db_data + bufoff, tocpy,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
495 UIO_WRITE, uio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
496
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
497 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
498 dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
499
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
500 if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
501 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
502
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
503 offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
504 size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
505 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
506 dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
507 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
508 }
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
509
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
510 int
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
511 dmu_write_pages(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
512 page_t *pp, dmu_tx_t *tx)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
513 {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
514 dmu_buf_t **dbp;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
515 int numbufs, i;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
516 int err;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
517
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
518 if (size == 0)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
519 return (0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
520
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
521 err = dmu_buf_hold_array(os, object, offset, size,
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
522 FALSE, FTAG, &numbufs, &dbp);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
523 if (err)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
524 return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
525
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
526 for (i = 0; i < numbufs; i++) {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
527 int tocpy, copied, thiscpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
528 int bufoff;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
529 dmu_buf_t *db = dbp[i];
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
530 caddr_t va;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
531
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
532 ASSERT(size > 0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
533 ASSERT3U(db->db_size, >=, PAGESIZE);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
534
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
535 bufoff = offset - db->db_offset;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
536 tocpy = (int)MIN(db->db_size - bufoff, size);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
537
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
538 ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
539
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
540 if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
541 dmu_buf_will_fill(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
542 else
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
543 dmu_buf_will_dirty(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
544
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
545 for (copied = 0; copied < tocpy; copied += PAGESIZE) {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
546 ASSERT3U(pp->p_offset, ==, db->db_offset + bufoff);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
547 thiscpy = MIN(PAGESIZE, tocpy - copied);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
548 va = ppmapin(pp, PROT_READ, (caddr_t)-1);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
549 bcopy(va, (char *)db->db_data + bufoff, thiscpy);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
550 ppmapout(va);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
551 pp = pp->p_next;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
552 bufoff += PAGESIZE;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
553 }
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
554
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
555 if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
556 dmu_buf_fill_done(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
557
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
558 if (err)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
559 break;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
560
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
561 offset += tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
562 size -= tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
563 }
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
564 dmu_buf_rele_array(dbp, numbufs, FTAG);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
565 return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
566 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
567 #endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
568
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
569 typedef struct {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
570 uint64_t txg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
571 dmu_buf_impl_t *db;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
572 dmu_sync_cb_t *done;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
573 void *arg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
574 } dmu_sync_cbin_t;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
575
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
576 typedef union {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
577 dmu_sync_cbin_t data;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
578 blkptr_t blk;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
579 } dmu_sync_cbarg_t;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
580
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
581 /* ARGSUSED */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
582 static void
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
583 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
584 {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
585 dmu_sync_cbin_t *in = (dmu_sync_cbin_t *)varg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
586 dmu_buf_impl_t *db = in->db;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
587 uint64_t txg = in->txg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
588 dmu_sync_cb_t *done = in->done;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
589 void *arg = in->arg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
590 blkptr_t *blk = (blkptr_t *)varg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
591
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
592 if (!BP_IS_HOLE(zio->io_bp)) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
593 zio->io_bp->blk_fill = 1;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
594 BP_SET_TYPE(zio->io_bp, db->db_dnode->dn_type);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
595 BP_SET_LEVEL(zio->io_bp, 0);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
596 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
597
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
598 *blk = *zio->io_bp; /* structure assignment */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
599
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
600 mutex_enter(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
601 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
602 db->db_d.db_overridden_by[txg&TXG_MASK] = blk;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
603 cv_broadcast(&db->db_changed);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
604 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
605
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
606 if (done)
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
607 done(&(db->db), arg);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
608 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
609
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
610 /*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
611 * Intent log support: sync the block associated with db to disk.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
612 * 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
613 * data isn't changing while dmu_sync() is writing it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
614 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
615 * Return values:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
616 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
617 * EEXIST: this txg has already been synced, so there's nothing to to.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
618 * The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
619 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
620 * ENOENT: the block was dbuf_free_range()'d, so there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
621 * The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
622 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
623 * EALREADY: this block is already in the process of being synced.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
624 * The caller should track its progress (somehow).
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
625 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
626 * EINPROGRESS: the IO has been initiated.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
627 * The caller should log this blkptr in the callback.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
628 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
629 * 0: completed. Sets *bp to the blkptr just written.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
630 * The caller should log this blkptr immediately.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
631 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
632 int
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
633 dmu_sync(zio_t *pio, dmu_buf_t *db_fake,
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
634 blkptr_t *bp, uint64_t txg, dmu_sync_cb_t *done, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
635 {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
636 dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
637 objset_impl_t *os = db->db_objset;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
638 dsl_pool_t *dp = os->os_dsl_dataset->ds_dir->dd_pool;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
639 tx_state_t *tx = &dp->dp_tx;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
640 dmu_sync_cbin_t *in;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
641 blkptr_t *blk;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
642 zbookmark_t zb;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
643 uint32_t arc_flag;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
644 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
645
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
646 ASSERT(BP_IS_HOLE(bp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
647 ASSERT(txg != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
648
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
649
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
650 dprintf("dmu_sync txg=%llu, s,o,q %llu %llu %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
651 txg, tx->tx_synced_txg, tx->tx_open_txg, tx->tx_quiesced_txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
652
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
653 /*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
654 * XXX - would be nice if we could do this without suspending...
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
655 */
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
656 txg_suspend(dp);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
657
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
658 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
659 * If this txg already synced, there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
660 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
661 if (txg <= tx->tx_synced_txg) {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
662 txg_resume(dp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
663 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
664 * If we're running ziltest, we need the blkptr regardless.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
665 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
666 if (txg > spa_freeze_txg(dp->dp_spa)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
667 /* if db_blkptr == NULL, this was an empty write */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
668 if (db->db_blkptr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
669 *bp = *db->db_blkptr; /* structure assignment */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
670 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
671 }
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
672 return (EEXIST);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
673 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
674
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
675 mutex_enter(&db->db_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
676
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
677 blk = db->db_d.db_overridden_by[txg&TXG_MASK];
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
678 if (blk == IN_DMU_SYNC) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
679 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
680 * We have already issued a sync write for this buffer.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
681 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
682 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
683 txg_resume(dp);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
684 return (EALREADY);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
685 } else if (blk != NULL) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
686 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
687 * This buffer had already been synced. It could not
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
688 * have been dirtied since, or we would have cleared blk.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
689 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
690 *bp = *blk; /* structure assignment */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
691 mutex_exit(&db->db_mtx);
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
692 txg_resume(dp);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
693 return (0);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
694 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
695
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
696 if (txg == tx->tx_syncing_txg) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
697 while (db->db_data_pending) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
698 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
699 * IO is in-progress. Wait for it to finish.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
700 * XXX - would be nice to be able to somehow "attach"
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
701 * this zio to the parent zio passed in.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
702 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
703 cv_wait(&db->db_changed, &db->db_mtx);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
704 if (!db->db_data_pending &&
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
705 db->db_blkptr && BP_IS_HOLE(db->db_blkptr)) {
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
706 /*
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
707 * IO was compressed away
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
708 */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
709 *bp = *db->db_blkptr; /* structure assignment */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
710 mutex_exit(&db->db_mtx);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
711 txg_resume(dp);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
712 return (0);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
713 }
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
714 ASSERT(db->db_data_pending ||
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
715 (db->db_blkptr && db->db_blkptr->blk_birth == txg));
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
716 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
717
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
718 if (db->db_blkptr && db->db_blkptr->blk_birth == txg) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
719 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
720 * IO is already completed.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
721 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
722 *bp = *db->db_blkptr; /* structure assignment */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
723 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
724 txg_resume(dp);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
725 return (0);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
726 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
727 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
728
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
729 if (db->db_d.db_data_old[txg&TXG_MASK] == NULL) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
730 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
731 * This dbuf isn't dirty, must have been free_range'd.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
732 * 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
733 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
734 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
735 txg_resume(dp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
736 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
737 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
738
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
739 ASSERT(db->db_d.db_overridden_by[txg&TXG_MASK] == NULL);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
740 db->db_d.db_overridden_by[txg&TXG_MASK] = IN_DMU_SYNC;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
741 /*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
742 * XXX - a little ugly to stash the blkptr in the callback
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
743 * buffer. We always need to make sure the following is true:
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
744 * ASSERT(sizeof(blkptr_t) >= sizeof(dmu_sync_cbin_t));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
745 */
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
746 in = kmem_alloc(sizeof (blkptr_t), KM_SLEEP);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
747 in->db = db;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
748 in->txg = txg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
749 in->done = done;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
750 in->arg = arg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
751 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
752 txg_resume(dp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
753
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
754 arc_flag = pio == NULL ? ARC_WAIT : ARC_NOWAIT;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
755 zb.zb_objset = os->os_dsl_dataset->ds_object;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
756 zb.zb_object = db->db.db_object;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
757 zb.zb_level = db->db_level;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
758 zb.zb_blkid = db->db_blkid;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
759 err = arc_write(pio, os->os_spa,
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
760 zio_checksum_select(db->db_dnode->dn_checksum, os->os_checksum),
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
761 zio_compress_select(db->db_dnode->dn_compress, os->os_compress),
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
762 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
763 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
764 ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_MUSTSUCCEED, arc_flag, &zb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
765 ASSERT(err == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
766
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
767 return (arc_flag == ARC_NOWAIT ? EINPROGRESS : 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
768 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
769
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
770 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
771 dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size, int ibs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
772 dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
773 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
774 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
775 int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
776
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
777 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
778 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
779 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
780 err = dnode_set_blksz(dn, size, ibs, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
781 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
782 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
783 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
784
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
785 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
786 dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
787 dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
788 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
789 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
790
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
791 /* XXX assumes dnode_hold will not get an i/o error */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
792 (void) dnode_hold(os->os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
793 ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
794 dn->dn_checksum = checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
795 dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
796 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
797 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
798
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
799 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
800 dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
801 dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
802 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
803 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
804
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
805 /* XXX assumes dnode_hold will not get an i/o error */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
806 (void) dnode_hold(os->os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
807 ASSERT(compress < ZIO_COMPRESS_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
808 dn->dn_compress = compress;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
809 dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
810 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
811 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
812
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
813 /*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
814 * 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
815 * 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
816 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
817 int
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
818 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
819 {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
820 int ncopies = 1;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
821
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
822 if (dmu_ot[ot].ot_metadata)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
823 ncopies++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
824 if (zb->zb_level != 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
825 ncopies++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
826 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
827 ncopies++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
828 return (MIN(ncopies, spa_max_replication(spa)));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
829 }
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
830
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
831 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
832 dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
833 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
834 dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
835 int i, err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
836
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
837 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
838 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
839 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
840 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
841 * Sync any current changes before
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
842 * we go trundling through the block pointers.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
843 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
844 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
845 if (list_link_active(&dn->dn_dirty_link[i]))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
846 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
847 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
848 if (i != TXG_SIZE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
849 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
850 txg_wait_synced(dmu_objset_pool(os), 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
851 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
852 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
853 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
854 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
855
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
856 err = dnode_next_offset(dn, hole, off, 1, 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
857 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
858
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
859 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
860 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
861
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
862 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
863 dmu_object_info_from_dnode(dnode_t *dn, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
864 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
865 rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
866 mutex_enter(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
867
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
868 doi->doi_data_block_size = dn->dn_datablksz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
869 doi->doi_metadata_block_size = dn->dn_indblkshift ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
870 1ULL << dn->dn_indblkshift : 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
871 doi->doi_indirection = dn->dn_nlevels;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
872 doi->doi_checksum = dn->dn_checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
873 doi->doi_compress = dn->dn_compress;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
874 doi->doi_physical_blks = (DN_USED_BYTES(dn->dn_phys) +
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
875 SPA_MINBLOCKSIZE/2) >> SPA_MINBLOCKSHIFT;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
876 doi->doi_max_block_offset = dn->dn_phys->dn_maxblkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
877 doi->doi_type = dn->dn_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
878 doi->doi_bonus_size = dn->dn_bonuslen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
879 doi->doi_bonus_type = dn->dn_bonustype;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
880
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
881 mutex_exit(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
882 rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
883 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
884
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
885 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
886 * Get information on a DMU object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
887 * If doi is NULL, just indicates whether the object exists.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
888 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
889 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
890 dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
891 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
892 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
893 int err = dnode_hold(os->os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
894
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
895 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
896 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
897
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
898 if (doi != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
899 dmu_object_info_from_dnode(dn, doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
900
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
901 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
902 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
903 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
904
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
905 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
906 * As above, but faster; can be used when you have a held dbuf in hand.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
907 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
908 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
909 dmu_object_info_from_db(dmu_buf_t *db, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
910 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
911 dmu_object_info_from_dnode(((dmu_buf_impl_t *)db)->db_dnode, doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
912 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
913
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
914 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
915 * Faster still when you only care about the size.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
916 * This is specifically optimized for zfs_getattr().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
917 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
918 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
919 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
920 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
921 dnode_t *dn = ((dmu_buf_impl_t *)db)->db_dnode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
922
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
923 *blksize = dn->dn_datablksz;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
924 /* add 1 for dnode space */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
925 *nblk512 = ((DN_USED_BYTES(dn->dn_phys) + SPA_MINBLOCKSIZE/2) >>
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
926 SPA_MINBLOCKSHIFT) + 1;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
927 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
928
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
929 /*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
930 * Given a bookmark, return the name of the dataset, object, and range in
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
931 * human-readable format.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
932 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
933 int
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
934 spa_bookmark_name(spa_t *spa, zbookmark_t *zb, nvlist_t *nvl)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
935 {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
936 dsl_pool_t *dp;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
937 dsl_dataset_t *ds = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
938 objset_t *os = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
939 dnode_t *dn = NULL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
940 int err, shift;
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
941 char dsname[MAXNAMELEN];
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
942 char objname[32];
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
943 char range[64];
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
944
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
945 dp = spa_get_dsl(spa);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
946 if (zb->zb_objset != 0) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
947 rw_enter(&dp->dp_config_rwlock, RW_READER);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
948 err = dsl_dataset_open_obj(dp, zb->zb_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
949 NULL, DS_MODE_NONE, FTAG, &ds);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
950 if (err) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
951 rw_exit(&dp->dp_config_rwlock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
952 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
953 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
954 dsl_dataset_name(ds, dsname);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
955 dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
956 rw_exit(&dp->dp_config_rwlock);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
957
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
958 err = dmu_objset_open(dsname, DMU_OST_ANY, DS_MODE_NONE, &os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
959 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
960 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
961
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
962 } else {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
963 dsl_dataset_name(NULL, dsname);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
964 os = dp->dp_meta_objset;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
965 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
966
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
967
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
968 if (zb->zb_object == DMU_META_DNODE_OBJECT) {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
969 (void) strncpy(objname, "mdn", sizeof (objname));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
970 } else {
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
971 (void) snprintf(objname, sizeof (objname), "%lld",
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
972 (longlong_t)zb->zb_object);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
973 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
974
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
975 err = dnode_hold(os->os, zb->zb_object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
976 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
977 goto out;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
978
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
979 shift = (dn->dn_datablkshift?dn->dn_datablkshift:SPA_MAXBLOCKSHIFT) +
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
980 zb->zb_level * (dn->dn_indblkshift - SPA_BLKPTRSHIFT);
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
981 (void) snprintf(range, sizeof (range), "%llu-%llu",
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
982 (u_longlong_t)(zb->zb_blkid << shift),
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
983 (u_longlong_t)((zb->zb_blkid+1) << shift));
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
984
2676
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
985 if ((err = nvlist_add_string(nvl, ZPOOL_ERR_DATASET, dsname)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
986 (err = nvlist_add_string(nvl, ZPOOL_ERR_OBJECT, objname)) != 0 ||
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
987 (err = nvlist_add_string(nvl, ZPOOL_ERR_RANGE, range)) != 0)
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
988 goto out;
5cee47eddab6 PSARC 2006/486 ZFS canmount property
eschrock
parents: 2665
diff changeset
989
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
990 out:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
991 if (dn)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
992 dnode_rele(dn, FTAG);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
993 if (os && os != dp->dp_meta_objset)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
994 dmu_objset_close(os);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
995 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
996 }
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
997
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
998 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
999 byteswap_uint64_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1000 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1001 uint64_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1002 size_t count = size >> 3;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1003 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1004
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1005 ASSERT((size & 7) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1006
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1007 for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1008 buf[i] = BSWAP_64(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1009 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1010
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1011 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1012 byteswap_uint32_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1013 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1014 uint32_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1015 size_t count = size >> 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1016 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1017
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1018 ASSERT((size & 3) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1019
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1020 for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1021 buf[i] = BSWAP_32(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1022 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1023
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1024 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1025 byteswap_uint16_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1026 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1027 uint16_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1028 size_t count = size >> 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1029 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1030
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1031 ASSERT((size & 1) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1032
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1033 for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1034 buf[i] = BSWAP_16(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1035 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1036
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1037 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1038 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1039 byteswap_uint8_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1040 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1041 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1042
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1043 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1044 dmu_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1045 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1046 dbuf_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1047 dnode_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1048 arc_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1049 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1050
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1051 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1052 dmu_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1053 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1054 arc_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1055 dnode_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1056 dbuf_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1057 }