62 */ |
62 */ |
63 #define DNODE_SIZE (1 << DNODE_SHIFT) |
63 #define DNODE_SIZE (1 << DNODE_SHIFT) |
64 #define DN_MAX_NBLKPTR ((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT) |
64 #define DN_MAX_NBLKPTR ((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT) |
65 #define DN_MAX_BONUSLEN (DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT)) |
65 #define DN_MAX_BONUSLEN (DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT)) |
66 #define DN_MAX_OBJECT (1ULL << DN_MAX_OBJECT_SHIFT) |
66 #define DN_MAX_OBJECT (1ULL << DN_MAX_OBJECT_SHIFT) |
|
67 #define DN_ZERO_BONUSLEN (DN_MAX_BONUSLEN + 1) |
67 |
68 |
68 #define DNODES_PER_BLOCK_SHIFT (DNODE_BLOCK_SHIFT - DNODE_SHIFT) |
69 #define DNODES_PER_BLOCK_SHIFT (DNODE_BLOCK_SHIFT - DNODE_SHIFT) |
69 #define DNODES_PER_BLOCK (1ULL << DNODES_PER_BLOCK_SHIFT) |
70 #define DNODES_PER_BLOCK (1ULL << DNODES_PER_BLOCK_SHIFT) |
70 #define DNODES_PER_LEVEL_SHIFT (DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT) |
71 #define DNODES_PER_LEVEL_SHIFT (DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT) |
71 |
72 |
154 uint16_t dn_datablkszsec; /* in 512b sectors */ |
155 uint16_t dn_datablkszsec; /* in 512b sectors */ |
155 uint32_t dn_datablksz; /* in bytes */ |
156 uint32_t dn_datablksz; /* in bytes */ |
156 uint64_t dn_maxblkid; |
157 uint64_t dn_maxblkid; |
157 uint8_t dn_next_nlevels[TXG_SIZE]; |
158 uint8_t dn_next_nlevels[TXG_SIZE]; |
158 uint8_t dn_next_indblkshift[TXG_SIZE]; |
159 uint8_t dn_next_indblkshift[TXG_SIZE]; |
|
160 uint16_t dn_next_bonuslen[TXG_SIZE]; |
159 uint32_t dn_next_blksz[TXG_SIZE]; /* next block size in bytes */ |
161 uint32_t dn_next_blksz[TXG_SIZE]; /* next block size in bytes */ |
160 |
162 |
161 /* protected by os_lock: */ |
163 /* protected by os_lock: */ |
162 list_node_t dn_dirty_link[TXG_SIZE]; /* next on dataset's dirty */ |
164 list_node_t dn_dirty_link[TXG_SIZE]; /* next on dataset's dirty */ |
163 |
165 |
195 |
197 |
196 dnode_t *dnode_special_open(struct objset_impl *dd, dnode_phys_t *dnp, |
198 dnode_t *dnode_special_open(struct objset_impl *dd, dnode_phys_t *dnp, |
197 uint64_t object); |
199 uint64_t object); |
198 void dnode_special_close(dnode_t *dn); |
200 void dnode_special_close(dnode_t *dn); |
199 |
201 |
|
202 void dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx); |
200 int dnode_hold(struct objset_impl *dd, uint64_t object, |
203 int dnode_hold(struct objset_impl *dd, uint64_t object, |
201 void *ref, dnode_t **dnp); |
204 void *ref, dnode_t **dnp); |
202 int dnode_hold_impl(struct objset_impl *dd, uint64_t object, int flag, |
205 int dnode_hold_impl(struct objset_impl *dd, uint64_t object, int flag, |
203 void *ref, dnode_t **dnp); |
206 void *ref, dnode_t **dnp); |
204 void dnode_add_ref(dnode_t *dn, void *ref); |
207 boolean_t dnode_add_ref(dnode_t *dn, void *ref); |
205 void dnode_rele(dnode_t *dn, void *ref); |
208 void dnode_rele(dnode_t *dn, void *ref); |
206 void dnode_setdirty(dnode_t *dn, dmu_tx_t *tx); |
209 void dnode_setdirty(dnode_t *dn, dmu_tx_t *tx); |
207 void dnode_sync(dnode_t *dn, dmu_tx_t *tx); |
210 void dnode_sync(dnode_t *dn, dmu_tx_t *tx); |
208 void dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs, |
211 void dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs, |
209 dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx); |
212 dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx); |
224 uint64_t dnode_block_freed(dnode_t *dn, uint64_t blkid); |
227 uint64_t dnode_block_freed(dnode_t *dn, uint64_t blkid); |
225 void dnode_init(void); |
228 void dnode_init(void); |
226 void dnode_fini(void); |
229 void dnode_fini(void); |
227 int dnode_next_offset(dnode_t *dn, boolean_t hole, uint64_t *off, int minlvl, |
230 int dnode_next_offset(dnode_t *dn, boolean_t hole, uint64_t *off, int minlvl, |
228 uint64_t blkfill, uint64_t txg); |
231 uint64_t blkfill, uint64_t txg); |
229 int dnode_evict_dbufs(dnode_t *dn, boolean_t try); |
232 void dnode_evict_dbufs(dnode_t *dn); |
230 |
233 |
231 #ifdef ZFS_DEBUG |
234 #ifdef ZFS_DEBUG |
232 |
235 |
233 /* |
236 /* |
234 * There should be a ## between the string literal and fmt, to make it |
237 * There should be a ## between the string literal and fmt, to make it |