annotate usr/src/uts/common/fs/zfs/dmu.c @ 3689:75b45bbf8f18 onnv_59

6460622 zio_nowait() doesn't live up to its name
author ek110237
date Tue, 20 Feb 2007 22:55:55 -0800
parents 6b28ebc717aa
children 00e75dc8b749
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 /*
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3025
diff changeset
22 * Copyright 2007 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 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
364 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
365 return (err);
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
366
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
367 /*
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
368 * Deal with odd block sizes, where there can't be data past the first
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
369 * block. If we ever do the tail block optimization, we will need to
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
370 * handle that here as well.
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
371 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
372 if (dn->dn_datablkshift == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
373 int newsz = offset > dn->dn_datablksz ? 0 :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
374 MIN(size, dn->dn_datablksz - offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
375 bzero((char *)buf + newsz, size - newsz);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
376 size = newsz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
377 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
379 while (size > 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
380 uint64_t mylen = MIN(size, DMU_MAX_ACCESS / 2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
381 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
382
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
383 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
384 * NB: we could do this block-at-a-time, but it's nice
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
385 * to be reading in parallel.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
386 */
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
387 err = dmu_buf_hold_array_by_dnode(dn, offset, mylen,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
388 TRUE, FTAG, &numbufs, &dbp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
389 if (err)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
390 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
391
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
392 for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
393 int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
394 int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
395 dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
396
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
397 ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
398
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
399 bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
400 tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
401
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
402 bcopy((char *)db->db_data + bufoff, buf, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
403
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
404 offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
405 size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
406 buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
407 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
408 dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
409 }
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2743
diff changeset
410 dnode_rele(dn, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
411 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
412 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
413
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
414 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
415 dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
416 const void *buf, dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
417 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
418 dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
419 int numbufs, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
420
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
421 if (size == 0)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
422 return;
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
423
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
424 VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
425 FALSE, FTAG, &numbufs, &dbp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
426
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
427 for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
428 int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
429 int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
430 dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
431
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
432 ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
433
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
434 bufoff = offset - db->db_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
435 tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
436
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
437 ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
438
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
439 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
440 dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
441 else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
442 dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
443
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
444 bcopy(buf, (char *)db->db_data + bufoff, tocpy);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
445
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
446 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
447 dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
448
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
449 offset += tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
450 size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
451 buf = (char *)buf + tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
452 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
453 dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
454 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
455
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
456 #ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
457 int
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
458 dmu_read_uio(objset_t *os, uint64_t object, uio_t *uio, uint64_t size)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
459 {
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
460 dmu_buf_t **dbp;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
461 int numbufs, i, err;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
462
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
463 /*
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
464 * NB: we could do this block-at-a-time, but it's nice
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
465 * to be reading in parallel.
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
466 */
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
467 err = dmu_buf_hold_array(os, object, uio->uio_loffset, size, TRUE, FTAG,
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
468 &numbufs, &dbp);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
469 if (err)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
470 return (err);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
471
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
472 for (i = 0; i < numbufs; i++) {
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
473 int tocpy;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
474 int bufoff;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
475 dmu_buf_t *db = dbp[i];
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
476
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
477 ASSERT(size > 0);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
478
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
479 bufoff = uio->uio_loffset - db->db_offset;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
480 tocpy = (int)MIN(db->db_size - bufoff, size);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
481
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
482 err = uiomove((char *)db->db_data + bufoff, tocpy,
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
483 UIO_READ, uio);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
484 if (err)
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
485 break;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
486
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
487 size -= tocpy;
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
488 }
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
489 dmu_buf_rele_array(dbp, numbufs, FTAG);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
490
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
491 return (err);
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
492 }
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
493
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
494 int
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
495 dmu_write_uio(objset_t *os, uint64_t object, uio_t *uio, uint64_t size,
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
496 dmu_tx_t *tx)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
497 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
498 dmu_buf_t **dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
499 int numbufs, i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
500 int err = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
501
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
502 if (size == 0)
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
503 return (0);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
504
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
505 err = dmu_buf_hold_array(os, object, uio->uio_loffset, size,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
506 FALSE, FTAG, &numbufs, &dbp);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
507 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
508 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
509
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
510 for (i = 0; i < numbufs; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
511 int tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
512 int bufoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
513 dmu_buf_t *db = dbp[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
514
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
515 ASSERT(size > 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
516
3638
6b28ebc717aa 6496357 spec_fsync() is useless on devices that do write caching
billm
parents: 3547
diff changeset
517 bufoff = uio->uio_loffset - db->db_offset;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
518 tocpy = (int)MIN(db->db_size - bufoff, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
519
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
520 ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
521
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
522 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
523 dmu_buf_will_fill(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
524 else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
525 dmu_buf_will_dirty(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
526
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
527 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
528 * XXX uiomove could block forever (eg. nfs-backed
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
529 * pages). There needs to be a uiolockdown() function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
530 * to lock the pages in memory, so that uiomove won't
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
531 * block.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
532 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
533 err = uiomove((char *)db->db_data + bufoff, tocpy,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
534 UIO_WRITE, uio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
535
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
536 if (tocpy == db->db_size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
537 dmu_buf_fill_done(db, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
538
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
539 if (err)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
540 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
541
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
542 size -= tocpy;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
543 }
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
544 dmu_buf_rele_array(dbp, numbufs, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
545 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
546 }
2688
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
547
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
548 int
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
549 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
550 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
551 {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
552 dmu_buf_t **dbp;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
553 int numbufs, i;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
554 int err;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
555
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
556 if (size == 0)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
557 return (0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
558
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
559 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
560 FALSE, FTAG, &numbufs, &dbp);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
561 if (err)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
562 return (err);
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 for (i = 0; i < numbufs; i++) {
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
565 int tocpy, copied, thiscpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
566 int bufoff;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
567 dmu_buf_t *db = dbp[i];
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
568 caddr_t va;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
569
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
570 ASSERT(size > 0);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
571 ASSERT3U(db->db_size, >=, PAGESIZE);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
572
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
573 bufoff = offset - db->db_offset;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
574 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
575
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
576 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
577
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
578 if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
579 dmu_buf_will_fill(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
580 else
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
581 dmu_buf_will_dirty(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
582
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
583 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
584 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
585 thiscpy = MIN(PAGESIZE, tocpy - copied);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
586 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
587 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
588 ppmapout(va);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
589 pp = pp->p_next;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
590 bufoff += PAGESIZE;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
591 }
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
592
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
593 if (tocpy == db->db_size)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
594 dmu_buf_fill_done(db, tx);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
595
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
596 if (err)
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
597 break;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
598
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
599 offset += tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
600 size -= tocpy;
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
601 }
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
602 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
603 return (err);
12e2ad22b970 6447701 ZFS hangs when iSCSI Target attempts to initialize its backing store
maybee
parents: 2676
diff changeset
604 }
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
605 #endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
606
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
607 typedef struct {
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
608 dbuf_dirty_record_t *dr;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
609 dmu_sync_cb_t *done;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
610 void *arg;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
611 } dmu_sync_arg_t;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
612
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
613 /* ARGSUSED */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
614 static void
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
615 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
616 {
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
617 dmu_sync_arg_t *in = varg;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
618 dbuf_dirty_record_t *dr = in->dr;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
619 dmu_buf_impl_t *db = dr->dr_dbuf;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
620 dmu_sync_cb_t *done = in->done;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
621
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
622 if (!BP_IS_HOLE(zio->io_bp)) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
623 zio->io_bp->blk_fill = 1;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
624 BP_SET_TYPE(zio->io_bp, db->db_dnode->dn_type);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
625 BP_SET_LEVEL(zio->io_bp, 0);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
626 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
627
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
628 mutex_enter(&db->db_mtx);
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
629 ASSERT(dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
630 dr->dt.dl.dr_overridden_by = *zio->io_bp; /* structure assignment */
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
631 dr->dt.dl.dr_override_state = DR_OVERRIDDEN;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
632 cv_broadcast(&db->db_changed);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
633 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
634
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
635 if (done)
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
636 done(&(db->db), in->arg);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
637
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
638 kmem_free(in, sizeof (dmu_sync_arg_t));
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
639 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
640
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
641 /*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
642 * Intent log support: sync the block associated with db to disk.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
643 * 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
644 * data isn't changing while dmu_sync() is writing it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
645 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
646 * Return values:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
647 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
648 * EEXIST: this txg has already been synced, so there's nothing to to.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
649 * The caller should not log the write.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
650 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
651 * ENOENT: the block was dbuf_free_range()'d, so there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
652 * The caller should not log the write.
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 * EALREADY: this block is already in the process of being synced.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
655 * The caller should track its progress (somehow).
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
656 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
657 * EINPROGRESS: the IO has been initiated.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
658 * The caller should log this blkptr in the callback.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
659 *
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
660 * 0: completed. Sets *bp to the blkptr just written.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
661 * The caller should log this blkptr immediately.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
662 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
663 int
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
664 dmu_sync(zio_t *pio, dmu_buf_t *db_fake,
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
665 blkptr_t *bp, uint64_t txg, dmu_sync_cb_t *done, void *arg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
666 {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
667 dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
668 objset_impl_t *os = db->db_objset;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
669 dsl_pool_t *dp = os->os_dsl_dataset->ds_dir->dd_pool;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
670 tx_state_t *tx = &dp->dp_tx;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
671 dbuf_dirty_record_t *dr;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
672 dmu_sync_arg_t *in;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
673 zbookmark_t zb;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
674 zio_t *zio;
3689
75b45bbf8f18 6460622 zio_nowait() doesn't live up to its name
ek110237
parents: 3638
diff changeset
675 int zio_flags;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
676 int err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
677
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
678 ASSERT(BP_IS_HOLE(bp));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
679 ASSERT(txg != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
680
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
681
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
682 dprintf("dmu_sync txg=%llu, s,o,q %llu %llu %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
683 txg, tx->tx_synced_txg, tx->tx_open_txg, tx->tx_quiesced_txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
684
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
685 /*
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
686 * XXX - would be nice if we could do this without suspending...
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
687 */
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
688 txg_suspend(dp);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
689
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
690 /*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
691 * If this txg already synced, there's nothing to do.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
692 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
693 if (txg <= tx->tx_synced_txg) {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
694 txg_resume(dp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
695 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
696 * If we're running ziltest, we need the blkptr regardless.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
697 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
698 if (txg > spa_freeze_txg(dp->dp_spa)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
699 /* if db_blkptr == NULL, this was an empty write */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
700 if (db->db_blkptr)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
701 *bp = *db->db_blkptr; /* structure assignment */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
702 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
703 }
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
704 return (EEXIST);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
705 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
706
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
707 mutex_enter(&db->db_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
708
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
709 if (txg == tx->tx_syncing_txg) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
710 while (db->db_data_pending) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
711 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
712 * IO is in-progress. Wait for it to finish.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
713 * XXX - would be nice to be able to somehow "attach"
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
714 * this zio to the parent zio passed in.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
715 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
716 cv_wait(&db->db_changed, &db->db_mtx);
2391
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
717 if (!db->db_data_pending &&
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
718 db->db_blkptr && BP_IS_HOLE(db->db_blkptr)) {
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
719 /*
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
720 * IO was compressed away
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
721 */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
722 *bp = *db->db_blkptr; /* structure assignment */
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
723 mutex_exit(&db->db_mtx);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
724 txg_resume(dp);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
725 return (0);
2fa3fd1db808 6447377 ZFS prefetch is inconsistant
maybee
parents: 2237
diff changeset
726 }
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
727 ASSERT(db->db_data_pending ||
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
728 (db->db_blkptr && db->db_blkptr->blk_birth == txg));
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
729 }
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 if (db->db_blkptr && db->db_blkptr->blk_birth == txg) {
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
732 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
733 * IO is already completed.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
734 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
735 *bp = *db->db_blkptr; /* structure assignment */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
736 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
737 txg_resume(dp);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
738 return (0);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
739 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
740 }
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
741
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
742 dr = db->db_last_dirty;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
743 while (dr && dr->dr_txg > txg)
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
744 dr = dr->dr_next;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
745 if (dr == NULL || dr->dr_txg < txg) {
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
746 /*
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
747 * This dbuf isn't dirty, must have been free_range'd.
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
748 * 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
749 */
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
750 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
751 txg_resume(dp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
752 return (ENOENT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
753 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
754
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
755 ASSERT(dr->dr_txg == txg);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
756 if (dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC) {
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
757 /*
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
758 * We have already issued a sync write for this buffer.
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
759 */
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
760 mutex_exit(&db->db_mtx);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
761 txg_resume(dp);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
762 return (EALREADY);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
763 } else if (dr->dt.dl.dr_override_state == DR_OVERRIDDEN) {
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
764 /*
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
765 * This buffer has already been synced. It could not
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
766 * have been dirtied since, or we would have cleared the state.
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
767 */
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
768 *bp = dr->dt.dl.dr_overridden_by; /* structure assignment */
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
769 mutex_exit(&db->db_mtx);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
770 txg_resume(dp);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
771 return (0);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
772 }
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
773
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
774 dr->dt.dl.dr_override_state = DR_IN_DMU_SYNC;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
775 in = kmem_alloc(sizeof (dmu_sync_arg_t), KM_SLEEP);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
776 in->dr = dr;
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
777 in->done = done;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
778 in->arg = arg;
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
779 mutex_exit(&db->db_mtx);
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
780 txg_resume(dp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
781
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
782 zb.zb_objset = os->os_dsl_dataset->ds_object;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
783 zb.zb_object = db->db.db_object;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
784 zb.zb_level = db->db_level;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
785 zb.zb_blkid = db->db_blkid;
3689
75b45bbf8f18 6460622 zio_nowait() doesn't live up to its name
ek110237
parents: 3638
diff changeset
786 zio_flags = ZIO_FLAG_MUSTSUCCEED;
75b45bbf8f18 6460622 zio_nowait() doesn't live up to its name
ek110237
parents: 3638
diff changeset
787 if (dmu_ot[db->db_dnode->dn_type].ot_metadata || zb.zb_level != 0)
75b45bbf8f18 6460622 zio_nowait() doesn't live up to its name
ek110237
parents: 3638
diff changeset
788 zio_flags |= ZIO_FLAG_METADATA;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
789 zio = arc_write(pio, os->os_spa,
2237
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
790 zio_checksum_select(db->db_dnode->dn_checksum, os->os_checksum),
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
791 zio_compress_select(db->db_dnode->dn_compress, os->os_compress),
45affe88ed99 6416482 filebench oltp workload hangs in zfs
maybee
parents: 2199
diff changeset
792 dmu_get_replication_level(os->os_spa, &zb, db->db_dnode->dn_type),
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
793 txg, bp, dr->dt.dl.dr_data, NULL, dmu_sync_done, in,
3689
75b45bbf8f18 6460622 zio_nowait() doesn't live up to its name
ek110237
parents: 3638
diff changeset
794 ZIO_PRIORITY_SYNC_WRITE, zio_flags, &zb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
795
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
796 if (pio) {
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
797 zio_nowait(zio);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
798 err = EINPROGRESS;
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
799 } else {
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
800 err = zio_wait(zio);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
801 ASSERT(err == 0);
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
802 }
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
803 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
804 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
805
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
806 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
807 dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size, int ibs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
808 dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
809 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
810 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
811 int err;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
812
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
813 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
814 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
815 return (err);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
816 err = dnode_set_blksz(dn, size, ibs, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
817 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
818 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
819 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
820
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
821 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
822 dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
823 dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
824 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
825 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
826
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
827 /* XXX assumes dnode_hold will not get an i/o error */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
828 (void) dnode_hold(os->os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
829 ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
830 dn->dn_checksum = checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
831 dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
832 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
833 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
834
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
835 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
836 dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
837 dmu_tx_t *tx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
838 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
839 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
840
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
841 /* XXX assumes dnode_hold will not get an i/o error */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
842 (void) dnode_hold(os->os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
843 ASSERT(compress < ZIO_COMPRESS_FUNCTIONS);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
844 dn->dn_compress = compress;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
845 dnode_setdirty(dn, tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
846 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
847 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
848
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
849 /*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
850 * 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
851 * 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
852 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
853 int
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
854 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
855 {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
856 int ncopies = 1;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
857
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
858 if (dmu_ot[ot].ot_metadata)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
859 ncopies++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
860 if (zb->zb_level != 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
861 ncopies++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
862 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
863 ncopies++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
864 return (MIN(ncopies, spa_max_replication(spa)));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
865 }
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1731
diff changeset
866
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
867 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
868 dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
869 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
870 dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
871 int i, err;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
872
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
873 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
874 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
875 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
876 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
877 * Sync any current changes before
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
878 * we go trundling through the block pointers.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
879 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
880 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
881 if (list_link_active(&dn->dn_dirty_link[i]))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
882 break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
883 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
884 if (i != TXG_SIZE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
885 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
886 txg_wait_synced(dmu_objset_pool(os), 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
887 err = dnode_hold(os->os, object, FTAG, &dn);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
888 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
889 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
890 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
891
3025
4e5ee8301d84 6424466 "panic: data after EOF" when unmounting abused pool
ahrens
parents: 2986
diff changeset
892 err = dnode_next_offset(dn, hole, off, 1, 1, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
893 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
894
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
895 return (err);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
896 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
897
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
898 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
899 dmu_object_info_from_dnode(dnode_t *dn, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
900 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
901 rw_enter(&dn->dn_struct_rwlock, RW_READER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
902 mutex_enter(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
903
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
904 doi->doi_data_block_size = dn->dn_datablksz;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
905 doi->doi_metadata_block_size = dn->dn_indblkshift ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
906 1ULL << dn->dn_indblkshift : 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
907 doi->doi_indirection = dn->dn_nlevels;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
908 doi->doi_checksum = dn->dn_checksum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
909 doi->doi_compress = dn->dn_compress;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
910 doi->doi_physical_blks = (DN_USED_BYTES(dn->dn_phys) +
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
911 SPA_MINBLOCKSIZE/2) >> SPA_MINBLOCKSHIFT;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
912 doi->doi_max_block_offset = dn->dn_phys->dn_maxblkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
913 doi->doi_type = dn->dn_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
914 doi->doi_bonus_size = dn->dn_bonuslen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
915 doi->doi_bonus_type = dn->dn_bonustype;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
916
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
917 mutex_exit(&dn->dn_mtx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
918 rw_exit(&dn->dn_struct_rwlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
919 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
920
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
921 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
922 * Get information on a DMU object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
923 * If doi is NULL, just indicates whether the object exists.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
924 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
925 int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
926 dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
927 {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
928 dnode_t *dn;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
929 int err = dnode_hold(os->os, object, FTAG, &dn);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
930
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
931 if (err)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 789
diff changeset
932 return (err);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
933
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
934 if (doi != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
935 dmu_object_info_from_dnode(dn, doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
936
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
937 dnode_rele(dn, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
938 return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
939 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
940
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
941 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
942 * As above, but faster; can be used when you have a held dbuf in hand.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
943 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
944 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
945 dmu_object_info_from_db(dmu_buf_t *db, dmu_object_info_t *doi)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
946 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
947 dmu_object_info_from_dnode(((dmu_buf_impl_t *)db)->db_dnode, doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
948 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
949
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
950 /*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
951 * Faster still when you only care about the size.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
952 * This is specifically optimized for zfs_getattr().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
953 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
954 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
955 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
956 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
957 dnode_t *dn = ((dmu_buf_impl_t *)db)->db_dnode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
958
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
959 *blksize = dn->dn_datablksz;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
960 /* add 1 for dnode space */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
961 *nblk512 = ((DN_USED_BYTES(dn->dn_phys) + SPA_MINBLOCKSIZE/2) >>
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1775
diff changeset
962 SPA_MINBLOCKSHIFT) + 1;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
963 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
964
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
965 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
966 byteswap_uint64_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
967 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
968 uint64_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
969 size_t count = size >> 3;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
970 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
971
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
972 ASSERT((size & 7) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
973
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
974 for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
975 buf[i] = BSWAP_64(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
976 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
977
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
978 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
979 byteswap_uint32_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
980 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
981 uint32_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
982 size_t count = size >> 2;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
983 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
984
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
985 ASSERT((size & 3) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
986
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
987 for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
988 buf[i] = BSWAP_32(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
989 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
990
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
991 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
992 byteswap_uint16_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
993 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
994 uint16_t *buf = vbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
995 size_t count = size >> 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
996 int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
997
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
998 ASSERT((size & 1) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
999
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1000 for (i = 0; i < count; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1001 buf[i] = BSWAP_16(buf[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1002 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1003
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1004 /* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1005 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1006 byteswap_uint8_array(void *vbuf, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1007 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1008 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1009
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1010 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1011 dmu_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1012 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1013 dbuf_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1014 dnode_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1015 arc_init();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1016 }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1017
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1018 void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1019 dmu_fini(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1020 {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1021 arc_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1022 dnode_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1023 dbuf_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
1024 }