1*d9497217SMartin Matuska // SPDX-License-Identifier: CDDL-1.0
2*d9497217SMartin Matuska /*
3*d9497217SMartin Matuska * This file and its contents are supplied under the terms of the
4*d9497217SMartin Matuska * Common Development and Distribution License ("CDDL"), version 1.0.
5*d9497217SMartin Matuska * You may only use this file in accordance with the terms of version
6*d9497217SMartin Matuska * 1.0 of the CDDL.
7*d9497217SMartin Matuska *
8*d9497217SMartin Matuska * A full copy of the text of the CDDL should have accompanied this
9*d9497217SMartin Matuska * source. A copy of the CDDL is also available via the Internet at
10*d9497217SMartin Matuska * http://www.illumos.org/license/CDDL.
11*d9497217SMartin Matuska */
12*d9497217SMartin Matuska
13*d9497217SMartin Matuska /*
14*d9497217SMartin Matuska * Copyright (c) 2026, TrueNAS.
15*d9497217SMartin Matuska */
16*d9497217SMartin Matuska
17*d9497217SMartin Matuska #include <stdarg.h>
18*d9497217SMartin Matuska #include <stdio.h>
19*d9497217SMartin Matuska #include <stdlib.h>
20*d9497217SMartin Matuska #include <string.h>
21*d9497217SMartin Matuska
22*d9497217SMartin Matuska #include <sys/zfs_context.h>
23*d9497217SMartin Matuska #include <sys/dmu.h>
24*d9497217SMartin Matuska #include <sys/dmu_tx.h>
25*d9497217SMartin Matuska #include <sys/dnode.h>
26*d9497217SMartin Matuska #include <sys/dsl_dataset.h>
27*d9497217SMartin Matuska #include <sys/spa.h>
28*d9497217SMartin Matuska #include <sys/zfeature.h>
29*d9497217SMartin Matuska
30*d9497217SMartin Matuska #include "mock_dmu.h"
31*d9497217SMartin Matuska #include "unit.h"
32*d9497217SMartin Matuska
33*d9497217SMartin Matuska /*
34*d9497217SMartin Matuska * A mock dbuf. A real dmu_buf_t (first for casting) plus the attached user
35*d9497217SMartin Matuska * data pointer. Block data is stored in a separate allocation so that the
36*d9497217SMartin Matuska * struct address remains stable across block resizes.
37*d9497217SMartin Matuska */
38*d9497217SMartin Matuska struct mock_dbuf {
39*d9497217SMartin Matuska dmu_buf_t mdb_db;
40*d9497217SMartin Matuska dmu_buf_user_t *mdb_user;
41*d9497217SMartin Matuska mock_dnode_t *mdb_owner;
42*d9497217SMartin Matuska void *mdb_data;
43*d9497217SMartin Matuska };
44*d9497217SMartin Matuska typedef struct mock_dbuf mock_dbuf_t;
45*d9497217SMartin Matuska
46*d9497217SMartin Matuska /*
47*d9497217SMartin Matuska * A mock dnode. a real dnode_t (must be first for casting) with dn_type
48*d9497217SMartin Matuska * and dn_object set, plus a flat array of mock_dbuf_t indexed by block id.
49*d9497217SMartin Matuska */
50*d9497217SMartin Matuska struct mock_dnode {
51*d9497217SMartin Matuska dnode_t mdn_dn;
52*d9497217SMartin Matuska uint64_t mdn_refcount;
53*d9497217SMartin Matuska size_t mdn_blksize;
54*d9497217SMartin Matuska size_t mdn_nblocks;
55*d9497217SMartin Matuska mock_dbuf_t **mdn_blocks;
56*d9497217SMartin Matuska };
57*d9497217SMartin Matuska
58*d9497217SMartin Matuska /*
59*d9497217SMartin Matuska * A mock transaction. We only allocate and zero it, nothing currently uses
60*d9497217SMartin Matuska * any of its internals.
61*d9497217SMartin Matuska */
62*d9497217SMartin Matuska struct mock_dmu_tx {
63*d9497217SMartin Matuska dmu_tx_t mtx_tx;
64*d9497217SMartin Matuska };
65*d9497217SMartin Matuska
66*d9497217SMartin Matuska /* Mock dnode */
67*d9497217SMartin Matuska
68*d9497217SMartin Matuska static mock_dbuf_t *
mock_dnode_block_alloc(mock_dnode_t * mdn,uint64_t blkid)69*d9497217SMartin Matuska mock_dnode_block_alloc(mock_dnode_t *mdn, uint64_t blkid)
70*d9497217SMartin Matuska {
71*d9497217SMartin Matuska mock_dbuf_t *mdb = kmem_zalloc(sizeof (mock_dbuf_t), KM_SLEEP);
72*d9497217SMartin Matuska mdb->mdb_data = kmem_zalloc(mdn->mdn_blksize, KM_SLEEP);
73*d9497217SMartin Matuska
74*d9497217SMartin Matuska mdb->mdb_db.db_object = mdn->mdn_dn.dn_object;
75*d9497217SMartin Matuska mdb->mdb_db.db_offset = blkid * mdn->mdn_blksize;
76*d9497217SMartin Matuska mdb->mdb_db.db_size = mdn->mdn_blksize;
77*d9497217SMartin Matuska mdb->mdb_db.db_data = mdb->mdb_data;
78*d9497217SMartin Matuska mdb->mdb_owner = mdn;
79*d9497217SMartin Matuska
80*d9497217SMartin Matuska return (mdb);
81*d9497217SMartin Matuska }
82*d9497217SMartin Matuska
83*d9497217SMartin Matuska /* Grow the dbuf array if needed, then return (or create) the dbuf for blkid. */
84*d9497217SMartin Matuska static mock_dbuf_t *
mock_dnode_block_get(mock_dnode_t * mdn,uint64_t blkid)85*d9497217SMartin Matuska mock_dnode_block_get(mock_dnode_t *mdn, uint64_t blkid)
86*d9497217SMartin Matuska {
87*d9497217SMartin Matuska if (blkid >= mdn->mdn_nblocks) {
88*d9497217SMartin Matuska size_t new_n = blkid + 1;
89*d9497217SMartin Matuska mock_dbuf_t **new_blocks =
90*d9497217SMartin Matuska kmem_zalloc(new_n * sizeof (mock_dbuf_t *), KM_SLEEP);
91*d9497217SMartin Matuska if (mdn->mdn_blocks != NULL) {
92*d9497217SMartin Matuska memcpy(new_blocks, mdn->mdn_blocks,
93*d9497217SMartin Matuska mdn->mdn_nblocks * sizeof (mock_dbuf_t *));
94*d9497217SMartin Matuska kmem_free(mdn->mdn_blocks,
95*d9497217SMartin Matuska mdn->mdn_nblocks * sizeof (mock_dbuf_t *));
96*d9497217SMartin Matuska }
97*d9497217SMartin Matuska mdn->mdn_blocks = new_blocks;
98*d9497217SMartin Matuska mdn->mdn_nblocks = new_n;
99*d9497217SMartin Matuska }
100*d9497217SMartin Matuska
101*d9497217SMartin Matuska mock_dbuf_t *mdb = mdn->mdn_blocks[blkid];
102*d9497217SMartin Matuska if (mdb == NULL) {
103*d9497217SMartin Matuska mdb = mock_dnode_block_alloc(mdn, blkid);
104*d9497217SMartin Matuska mdn->mdn_blocks[blkid] = mdb;
105*d9497217SMartin Matuska }
106*d9497217SMartin Matuska return (mdb);
107*d9497217SMartin Matuska }
108*d9497217SMartin Matuska
109*d9497217SMartin Matuska mock_dnode_t *
mock_dnode_create(size_t blksize,dmu_object_type_t type)110*d9497217SMartin Matuska mock_dnode_create(size_t blksize, dmu_object_type_t type)
111*d9497217SMartin Matuska {
112*d9497217SMartin Matuska ASSERT(IS_P2ALIGNED(blksize, 512));
113*d9497217SMartin Matuska
114*d9497217SMartin Matuska mock_dnode_t *mdn = kmem_zalloc(sizeof (mock_dnode_t), KM_SLEEP);
115*d9497217SMartin Matuska mdn->mdn_refcount = 1;
116*d9497217SMartin Matuska mdn->mdn_dn.dn_type = type;
117*d9497217SMartin Matuska mdn->mdn_dn.dn_object = 1; /* arbitrary non-zero object number */
118*d9497217SMartin Matuska mdn->mdn_blksize = blksize;
119*d9497217SMartin Matuska
120*d9497217SMartin Matuska return (mdn);
121*d9497217SMartin Matuska }
122*d9497217SMartin Matuska
123*d9497217SMartin Matuska void
mock_dnode_destroy(mock_dnode_t * mdn)124*d9497217SMartin Matuska mock_dnode_destroy(mock_dnode_t *mdn)
125*d9497217SMartin Matuska {
126*d9497217SMartin Matuska for (size_t i = 0; i < mdn->mdn_nblocks; i++) {
127*d9497217SMartin Matuska mock_dbuf_t *mdb = mdn->mdn_blocks[i];
128*d9497217SMartin Matuska if (mdb == NULL)
129*d9497217SMartin Matuska continue;
130*d9497217SMartin Matuska
131*d9497217SMartin Matuska /*
132*d9497217SMartin Matuska * Call the sync evict callback if one is set, mimicking the
133*d9497217SMartin Matuska * real DMU when a buffer's refcount drops to zero.
134*d9497217SMartin Matuska */
135*d9497217SMartin Matuska if (mdb->mdb_user != NULL &&
136*d9497217SMartin Matuska mdb->mdb_user->dbu_evict_func_sync != NULL)
137*d9497217SMartin Matuska mdb->mdb_user->dbu_evict_func_sync(mdb->mdb_user);
138*d9497217SMartin Matuska
139*d9497217SMartin Matuska kmem_free(mdb->mdb_data, mdb->mdb_db.db_size);
140*d9497217SMartin Matuska kmem_free(mdb, sizeof (mock_dbuf_t));
141*d9497217SMartin Matuska }
142*d9497217SMartin Matuska
143*d9497217SMartin Matuska kmem_free(mdn->mdn_blocks,
144*d9497217SMartin Matuska mdn->mdn_nblocks * sizeof (mock_dbuf_t *));
145*d9497217SMartin Matuska kmem_free(mdn, sizeof (mock_dnode_t));
146*d9497217SMartin Matuska }
147*d9497217SMartin Matuska
148*d9497217SMartin Matuska size_t
mock_dnode_block_count(mock_dnode_t * mdn)149*d9497217SMartin Matuska mock_dnode_block_count(mock_dnode_t *mdn)
150*d9497217SMartin Matuska {
151*d9497217SMartin Matuska return (mdn->mdn_nblocks);
152*d9497217SMartin Matuska }
153*d9497217SMartin Matuska
154*d9497217SMartin Matuska const void *
mock_dnode_block_data(mock_dnode_t * mdn,uint64_t blkid)155*d9497217SMartin Matuska mock_dnode_block_data(mock_dnode_t *mdn, uint64_t blkid)
156*d9497217SMartin Matuska {
157*d9497217SMartin Matuska if (blkid >= mdn->mdn_nblocks)
158*d9497217SMartin Matuska return (NULL);
159*d9497217SMartin Matuska return (mdn->mdn_blocks[blkid]->mdb_db.db_data);
160*d9497217SMartin Matuska }
161*d9497217SMartin Matuska
162*d9497217SMartin Matuska uint64_t
mock_dnode_refcount(mock_dnode_t * mdn)163*d9497217SMartin Matuska mock_dnode_refcount(mock_dnode_t *mdn)
164*d9497217SMartin Matuska {
165*d9497217SMartin Matuska return (mdn->mdn_refcount);
166*d9497217SMartin Matuska }
167*d9497217SMartin Matuska
168*d9497217SMartin Matuska /* Mock transaction */
169*d9497217SMartin Matuska
170*d9497217SMartin Matuska mock_dmu_tx_t *
mock_tx_create(void)171*d9497217SMartin Matuska mock_tx_create(void)
172*d9497217SMartin Matuska {
173*d9497217SMartin Matuska return (kmem_zalloc(sizeof (mock_dmu_tx_t), KM_SLEEP));
174*d9497217SMartin Matuska }
175*d9497217SMartin Matuska
176*d9497217SMartin Matuska void
mock_tx_destroy(mock_dmu_tx_t * tx)177*d9497217SMartin Matuska mock_tx_destroy(mock_dmu_tx_t *tx)
178*d9497217SMartin Matuska {
179*d9497217SMartin Matuska kmem_free(tx, sizeof (mock_dmu_tx_t));
180*d9497217SMartin Matuska }
181*d9497217SMartin Matuska
182*d9497217SMartin Matuska /* DMU stubs, either no-op or light access to mock dnode internals. */
183*d9497217SMartin Matuska
184*d9497217SMartin Matuska int
dmu_buf_hold_by_dnode(dnode_t * dn,uint64_t offset,const void * tag,dmu_buf_t ** dbp,dmu_flags_t flags)185*d9497217SMartin Matuska dmu_buf_hold_by_dnode(dnode_t *dn, uint64_t offset, const void *tag,
186*d9497217SMartin Matuska dmu_buf_t **dbp, dmu_flags_t flags)
187*d9497217SMartin Matuska {
188*d9497217SMartin Matuska (void) tag; (void) flags;
189*d9497217SMartin Matuska
190*d9497217SMartin Matuska mock_dnode_t *mdn = (mock_dnode_t *)dn;
191*d9497217SMartin Matuska uint64_t blkid = offset / mdn->mdn_blksize;
192*d9497217SMartin Matuska mock_dbuf_t *mdb = mock_dnode_block_get(mdn, blkid);
193*d9497217SMartin Matuska
194*d9497217SMartin Matuska *dbp = &mdb->mdb_db;
195*d9497217SMartin Matuska return (0);
196*d9497217SMartin Matuska }
197*d9497217SMartin Matuska
198*d9497217SMartin Matuska void
dmu_buf_rele(dmu_buf_t * db,const void * tag)199*d9497217SMartin Matuska dmu_buf_rele(dmu_buf_t *db, const void *tag)
200*d9497217SMartin Matuska {
201*d9497217SMartin Matuska (void) db; (void) tag;
202*d9497217SMartin Matuska }
203*d9497217SMartin Matuska
204*d9497217SMartin Matuska void *
dmu_buf_get_user(dmu_buf_t * db)205*d9497217SMartin Matuska dmu_buf_get_user(dmu_buf_t *db)
206*d9497217SMartin Matuska {
207*d9497217SMartin Matuska mock_dbuf_t *mdb = (mock_dbuf_t *)db;
208*d9497217SMartin Matuska return (mdb->mdb_user);
209*d9497217SMartin Matuska }
210*d9497217SMartin Matuska
211*d9497217SMartin Matuska void *
dmu_buf_set_user(dmu_buf_t * db,dmu_buf_user_t * new_user)212*d9497217SMartin Matuska dmu_buf_set_user(dmu_buf_t *db, dmu_buf_user_t *new_user)
213*d9497217SMartin Matuska {
214*d9497217SMartin Matuska mock_dbuf_t *mdb = (mock_dbuf_t *)db;
215*d9497217SMartin Matuska if (mdb->mdb_user != NULL)
216*d9497217SMartin Matuska return (mdb->mdb_user); /* existing user wins */
217*d9497217SMartin Matuska mdb->mdb_user = new_user;
218*d9497217SMartin Matuska return (NULL); /* new_user wins */
219*d9497217SMartin Matuska }
220*d9497217SMartin Matuska
221*d9497217SMartin Matuska void
dmu_buf_will_dirty(dmu_buf_t * db,dmu_tx_t * tx)222*d9497217SMartin Matuska dmu_buf_will_dirty(dmu_buf_t *db, dmu_tx_t *tx)
223*d9497217SMartin Matuska {
224*d9497217SMartin Matuska (void) db; (void) tx;
225*d9497217SMartin Matuska }
226*d9497217SMartin Matuska
227*d9497217SMartin Matuska objset_t *
dmu_buf_get_objset(dmu_buf_t * db)228*d9497217SMartin Matuska dmu_buf_get_objset(dmu_buf_t *db)
229*d9497217SMartin Matuska {
230*d9497217SMartin Matuska mock_dbuf_t *mdb = (mock_dbuf_t *)db;
231*d9497217SMartin Matuska
232*d9497217SMartin Matuska /*
233*d9497217SMartin Matuska * We return the mock_dnode_t pointer cast to objset_t so that
234*d9497217SMartin Matuska * dmu_object_set_blocksize() below can recover the dnode without
235*d9497217SMartin Matuska * needing a separate objset structure.
236*d9497217SMartin Matuska */
237*d9497217SMartin Matuska return ((objset_t *)mdb->mdb_owner);
238*d9497217SMartin Matuska }
239*d9497217SMartin Matuska
240*d9497217SMartin Matuska int
dmu_object_set_blocksize(objset_t * os,uint64_t object,uint64_t size,int ibs,dmu_tx_t * tx)241*d9497217SMartin Matuska dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size,
242*d9497217SMartin Matuska int ibs, dmu_tx_t *tx)
243*d9497217SMartin Matuska {
244*d9497217SMartin Matuska (void) object; (void) ibs; (void) tx;
245*d9497217SMartin Matuska
246*d9497217SMartin Matuska /* os is a mock_dnode_t (see dmu_buf_get_objset() above). */
247*d9497217SMartin Matuska mock_dnode_t *mdn = (mock_dnode_t *)os;
248*d9497217SMartin Matuska
249*d9497217SMartin Matuska /*
250*d9497217SMartin Matuska * Resize block 0's data buffer in place so the struct address stays
251*d9497217SMartin Matuska * stable.
252*d9497217SMartin Matuska */
253*d9497217SMartin Matuska mock_dbuf_t *mdb = mdn->mdn_blocks[0];
254*d9497217SMartin Matuska void *new_data = kmem_zalloc(size, KM_SLEEP);
255*d9497217SMartin Matuska memcpy(new_data, mdb->mdb_data,
256*d9497217SMartin Matuska MIN(size, (size_t)mdb->mdb_db.db_size));
257*d9497217SMartin Matuska kmem_free(mdb->mdb_data, mdb->mdb_db.db_size);
258*d9497217SMartin Matuska
259*d9497217SMartin Matuska mdb->mdb_data = new_data;
260*d9497217SMartin Matuska mdb->mdb_db.db_size = size;
261*d9497217SMartin Matuska mdb->mdb_db.db_data = new_data;
262*d9497217SMartin Matuska mdn->mdn_blksize = size;
263*d9497217SMartin Matuska
264*d9497217SMartin Matuska return (0);
265*d9497217SMartin Matuska }
266*d9497217SMartin Matuska
267*d9497217SMartin Matuska boolean_t
dnode_add_ref(dnode_t * dn,const void * tag)268*d9497217SMartin Matuska dnode_add_ref(dnode_t *dn, const void *tag)
269*d9497217SMartin Matuska {
270*d9497217SMartin Matuska (void) tag;
271*d9497217SMartin Matuska mock_dnode_t *mdn = (mock_dnode_t *)dn;
272*d9497217SMartin Matuska if (mdn->mdn_refcount == 0)
273*d9497217SMartin Matuska return (B_FALSE);
274*d9497217SMartin Matuska mdn->mdn_refcount++;
275*d9497217SMartin Matuska return (B_TRUE);
276*d9497217SMartin Matuska }
277*d9497217SMartin Matuska
278*d9497217SMartin Matuska void
dnode_rele(dnode_t * dn,const void * tag)279*d9497217SMartin Matuska dnode_rele(dnode_t *dn, const void *tag)
280*d9497217SMartin Matuska {
281*d9497217SMartin Matuska (void) tag;
282*d9497217SMartin Matuska mock_dnode_t *mdn = (mock_dnode_t *)dn;
283*d9497217SMartin Matuska unit_gt(mdn->mdn_refcount, 0);
284*d9497217SMartin Matuska mdn->mdn_refcount--;
285*d9497217SMartin Matuska }
286*d9497217SMartin Matuska
287*d9497217SMartin Matuska /*
288*d9497217SMartin Matuska * Misc other stubs. Not strictly DMU mocks, and might move elsewhere later,
289*d9497217SMartin Matuska * but for now this is all we need for our limited test set.
290*d9497217SMartin Matuska */
291*d9497217SMartin Matuska
292*d9497217SMartin Matuska spa_t *
dmu_objset_spa(objset_t * os)293*d9497217SMartin Matuska dmu_objset_spa(objset_t *os)
294*d9497217SMartin Matuska {
295*d9497217SMartin Matuska (void) os;
296*d9497217SMartin Matuska return (NULL);
297*d9497217SMartin Matuska }
298*d9497217SMartin Matuska
299*d9497217SMartin Matuska int
dmu_free_range(objset_t * os,uint64_t object,uint64_t offset,uint64_t size,dmu_tx_t * tx)300*d9497217SMartin Matuska dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
301*d9497217SMartin Matuska uint64_t size, dmu_tx_t *tx)
302*d9497217SMartin Matuska {
303*d9497217SMartin Matuska (void) os; (void) object; (void) offset; (void) size; (void) tx;
304*d9497217SMartin Matuska return (0);
305*d9497217SMartin Matuska }
306*d9497217SMartin Matuska
307*d9497217SMartin Matuska void
dmu_prefetch_by_dnode(dnode_t * dn,int64_t level,uint64_t offset,uint64_t len,zio_priority_t pri)308*d9497217SMartin Matuska dmu_prefetch_by_dnode(dnode_t *dn, int64_t level, uint64_t offset,
309*d9497217SMartin Matuska uint64_t len, zio_priority_t pri)
310*d9497217SMartin Matuska {
311*d9497217SMartin Matuska (void) dn; (void) level; (void) offset; (void) len; (void) pri;
312*d9497217SMartin Matuska }
313*d9497217SMartin Matuska
314*d9497217SMartin Matuska dsl_dataset_t *
dmu_objset_ds(objset_t * os)315*d9497217SMartin Matuska dmu_objset_ds(objset_t *os)
316*d9497217SMartin Matuska {
317*d9497217SMartin Matuska (void) os;
318*d9497217SMartin Matuska return (NULL);
319*d9497217SMartin Matuska }
320*d9497217SMartin Matuska
321*d9497217SMartin Matuska boolean_t
dsl_dataset_feature_is_active(dsl_dataset_t * ds,spa_feature_t f)322*d9497217SMartin Matuska dsl_dataset_feature_is_active(dsl_dataset_t *ds, spa_feature_t f)
323*d9497217SMartin Matuska {
324*d9497217SMartin Matuska (void) ds; (void) f;
325*d9497217SMartin Matuska return (B_FALSE);
326*d9497217SMartin Matuska }
327*d9497217SMartin Matuska
328*d9497217SMartin Matuska void
dsl_dataset_dirty(dsl_dataset_t * ds,dmu_tx_t * tx)329*d9497217SMartin Matuska dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx)
330*d9497217SMartin Matuska {
331*d9497217SMartin Matuska (void) ds; (void) tx;
332*d9497217SMartin Matuska }
333*d9497217SMartin Matuska
334*d9497217SMartin Matuska boolean_t
spa_feature_is_enabled(spa_t * spa,spa_feature_t f)335*d9497217SMartin Matuska spa_feature_is_enabled(spa_t *spa, spa_feature_t f)
336*d9497217SMartin Matuska {
337*d9497217SMartin Matuska (void) spa; (void) f;
338*d9497217SMartin Matuska return (B_FALSE);
339*d9497217SMartin Matuska }
340*d9497217SMartin Matuska
341*d9497217SMartin Matuska int
spa_maxblocksize(spa_t * spa)342*d9497217SMartin Matuska spa_maxblocksize(spa_t *spa)
343*d9497217SMartin Matuska {
344*d9497217SMartin Matuska (void) spa;
345*d9497217SMartin Matuska return (SPA_OLD_MAXBLOCKSIZE);
346*d9497217SMartin Matuska }
347*d9497217SMartin Matuska
348*d9497217SMartin Matuska const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES];
349*d9497217SMartin Matuska
350*d9497217SMartin Matuska void
byteswap_uint64_array(void * buf,size_t size)351*d9497217SMartin Matuska byteswap_uint64_array(void *buf, size_t size)
352*d9497217SMartin Matuska {
353*d9497217SMartin Matuska (void) buf; (void) size;
354*d9497217SMartin Matuska }
355*d9497217SMartin Matuska
356*d9497217SMartin Matuska /*
357*d9497217SMartin Matuska * Various objset+object calls; returning error, as they need to use
358*d9497217SMartin Matuska * _by_dnode() variants to get the mock.
359*d9497217SMartin Matuska */
360*d9497217SMartin Matuska int
dnode_hold(objset_t * os,uint64_t object,const void * tag,dnode_t ** dnp)361*d9497217SMartin Matuska dnode_hold(objset_t *os, uint64_t object, const void *tag, dnode_t **dnp)
362*d9497217SMartin Matuska {
363*d9497217SMartin Matuska (void) os; (void) object; (void) tag; (void) dnp;
364*d9497217SMartin Matuska return (EIO);
365*d9497217SMartin Matuska }
366*d9497217SMartin Matuska
367*d9497217SMartin Matuska int
dmu_object_free(objset_t * os,uint64_t object,dmu_tx_t * tx)368*d9497217SMartin Matuska dmu_object_free(objset_t *os, uint64_t object, dmu_tx_t *tx)
369*d9497217SMartin Matuska {
370*d9497217SMartin Matuska (void) os; (void) object; (void) tx;
371*d9497217SMartin Matuska return (EIO);
372*d9497217SMartin Matuska }
373*d9497217SMartin Matuska
374*d9497217SMartin Matuska uint64_t
dmu_object_alloc_hold(objset_t * os,dmu_object_type_t ot,int blocksize,int indirect_blockshift,dmu_object_type_t bonustype,int bonuslen,int dnodesize,dnode_t ** allocated_dnode,const void * tag,dmu_tx_t * tx)375*d9497217SMartin Matuska dmu_object_alloc_hold(objset_t *os, dmu_object_type_t ot,
376*d9497217SMartin Matuska int blocksize, int indirect_blockshift, dmu_object_type_t bonustype,
377*d9497217SMartin Matuska int bonuslen, int dnodesize, dnode_t **allocated_dnode,
378*d9497217SMartin Matuska const void *tag, dmu_tx_t *tx)
379*d9497217SMartin Matuska {
380*d9497217SMartin Matuska (void) os; (void) ot; (void) blocksize; (void) indirect_blockshift;
381*d9497217SMartin Matuska (void) bonustype; (void) bonuslen; (void) dnodesize;
382*d9497217SMartin Matuska (void) allocated_dnode; (void) tag; (void) tx;
383*d9497217SMartin Matuska return (EIO);
384*d9497217SMartin Matuska }
385*d9497217SMartin Matuska
386*d9497217SMartin Matuska int
dmu_object_claim_dnsize(objset_t * os,uint64_t object,dmu_object_type_t ot,int blocksize,dmu_object_type_t bonus_type,int bonus_len,int dnodesize,dmu_tx_t * tx)387*d9497217SMartin Matuska dmu_object_claim_dnsize(objset_t *os, uint64_t object, dmu_object_type_t ot,
388*d9497217SMartin Matuska int blocksize, dmu_object_type_t bonus_type, int bonus_len,
389*d9497217SMartin Matuska int dnodesize, dmu_tx_t *tx)
390*d9497217SMartin Matuska {
391*d9497217SMartin Matuska (void) os; (void) object; (void) ot; (void) blocksize;
392*d9497217SMartin Matuska (void) bonus_type; (void) bonus_len; (void) dnodesize; (void) tx;
393*d9497217SMartin Matuska return (EIO);
394*d9497217SMartin Matuska }
395*d9497217SMartin Matuska
396*d9497217SMartin Matuska int
dmu_object_info(objset_t * os,uint64_t object,dmu_object_info_t * doi)397*d9497217SMartin Matuska dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
398*d9497217SMartin Matuska {
399*d9497217SMartin Matuska (void) os; (void) object; (void) doi;
400*d9497217SMartin Matuska return (EIO);
401*d9497217SMartin Matuska }
402*d9497217SMartin Matuska
403*d9497217SMartin Matuska int
dmu_prefetch_wait(objset_t * os,uint64_t object,uint64_t offset,uint64_t len)404*d9497217SMartin Matuska dmu_prefetch_wait(objset_t *os, uint64_t object, uint64_t offset,
405*d9497217SMartin Matuska uint64_t len)
406*d9497217SMartin Matuska {
407*d9497217SMartin Matuska (void) os; (void) object; (void) offset; (void) len;
408*d9497217SMartin Matuska return (EIO);
409*d9497217SMartin Matuska }
410