xref: /rk3399_rockchip-uboot/include/zfs/dnode.h (revision 4d3c95f5ea7c737a21cd6b9c59435ee693b3f127)
1*4d3c95f5SJorgen Lundman /*
2*4d3c95f5SJorgen Lundman  *  GRUB  --  GRand Unified Bootloader
3*4d3c95f5SJorgen Lundman  *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
4*4d3c95f5SJorgen Lundman  *
5*4d3c95f5SJorgen Lundman  *  This program is free software; you can redistribute it and/or modify
6*4d3c95f5SJorgen Lundman  *  it under the terms of the GNU General Public License as published by
7*4d3c95f5SJorgen Lundman  *  the Free Software Foundation; either version 2 of the License, or
8*4d3c95f5SJorgen Lundman  *  (at your option) any later version.
9*4d3c95f5SJorgen Lundman  *
10*4d3c95f5SJorgen Lundman  *  This program is distributed in the hope that it will be useful,
11*4d3c95f5SJorgen Lundman  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12*4d3c95f5SJorgen Lundman  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*4d3c95f5SJorgen Lundman  *  GNU General Public License for more details.
14*4d3c95f5SJorgen Lundman  *
15*4d3c95f5SJorgen Lundman  *  You should have received a copy of the GNU General Public License
16*4d3c95f5SJorgen Lundman  *  along with this program; if not, write to the Free Software
17*4d3c95f5SJorgen Lundman  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18*4d3c95f5SJorgen Lundman  */
19*4d3c95f5SJorgen Lundman /*
20*4d3c95f5SJorgen Lundman  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
21*4d3c95f5SJorgen Lundman  * Use is subject to license terms.
22*4d3c95f5SJorgen Lundman  */
23*4d3c95f5SJorgen Lundman 
24*4d3c95f5SJorgen Lundman #ifndef	_SYS_DNODE_H
25*4d3c95f5SJorgen Lundman #define	_SYS_DNODE_H
26*4d3c95f5SJorgen Lundman 
27*4d3c95f5SJorgen Lundman #include <zfs/spa.h>
28*4d3c95f5SJorgen Lundman 
29*4d3c95f5SJorgen Lundman /*
30*4d3c95f5SJorgen Lundman  * Fixed constants.
31*4d3c95f5SJorgen Lundman  */
32*4d3c95f5SJorgen Lundman #define	DNODE_SHIFT		9	/* 512 bytes */
33*4d3c95f5SJorgen Lundman #define	DN_MIN_INDBLKSHIFT	10	/* 1k */
34*4d3c95f5SJorgen Lundman #define	DN_MAX_INDBLKSHIFT	14	/* 16k */
35*4d3c95f5SJorgen Lundman #define	DNODE_BLOCK_SHIFT	14	/* 16k */
36*4d3c95f5SJorgen Lundman #define	DNODE_CORE_SIZE		64	/* 64 bytes for dnode sans blkptrs */
37*4d3c95f5SJorgen Lundman #define	DN_MAX_OBJECT_SHIFT	48	/* 256 trillion (zfs_fid_t limit) */
38*4d3c95f5SJorgen Lundman #define	DN_MAX_OFFSET_SHIFT	64	/* 2^64 bytes in a dnode */
39*4d3c95f5SJorgen Lundman 
40*4d3c95f5SJorgen Lundman /*
41*4d3c95f5SJorgen Lundman  * Derived constants.
42*4d3c95f5SJorgen Lundman  */
43*4d3c95f5SJorgen Lundman #define	DNODE_SIZE	(1 << DNODE_SHIFT)
44*4d3c95f5SJorgen Lundman #define	DN_MAX_NBLKPTR	((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT)
45*4d3c95f5SJorgen Lundman #define	DN_MAX_BONUSLEN	(DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT))
46*4d3c95f5SJorgen Lundman #define	DN_MAX_OBJECT	(1ULL << DN_MAX_OBJECT_SHIFT)
47*4d3c95f5SJorgen Lundman 
48*4d3c95f5SJorgen Lundman #define	DNODES_PER_BLOCK_SHIFT	(DNODE_BLOCK_SHIFT - DNODE_SHIFT)
49*4d3c95f5SJorgen Lundman #define	DNODES_PER_BLOCK	(1ULL << DNODES_PER_BLOCK_SHIFT)
50*4d3c95f5SJorgen Lundman #define	DNODES_PER_LEVEL_SHIFT	(DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT)
51*4d3c95f5SJorgen Lundman 
52*4d3c95f5SJorgen Lundman #define	DNODE_FLAG_SPILL_BLKPTR (1<<2)
53*4d3c95f5SJorgen Lundman 
54*4d3c95f5SJorgen Lundman #define	DN_BONUS(dnp)	((void *)((dnp)->dn_bonus + \
55*4d3c95f5SJorgen Lundman 	(((dnp)->dn_nblkptr - 1) * sizeof(blkptr_t))))
56*4d3c95f5SJorgen Lundman 
57*4d3c95f5SJorgen Lundman typedef struct dnode_phys {
58*4d3c95f5SJorgen Lundman 	uint8_t dn_type;		/* dmu_object_type_t */
59*4d3c95f5SJorgen Lundman 	uint8_t dn_indblkshift;		/* ln2(indirect block size) */
60*4d3c95f5SJorgen Lundman 	uint8_t dn_nlevels;		/* 1=dn_blkptr->data blocks */
61*4d3c95f5SJorgen Lundman 	uint8_t dn_nblkptr;		/* length of dn_blkptr */
62*4d3c95f5SJorgen Lundman 	uint8_t dn_bonustype;		/* type of data in bonus buffer */
63*4d3c95f5SJorgen Lundman 	uint8_t	dn_checksum;		/* ZIO_CHECKSUM type */
64*4d3c95f5SJorgen Lundman 	uint8_t	dn_compress;		/* ZIO_COMPRESS type */
65*4d3c95f5SJorgen Lundman 	uint8_t dn_flags;		/* DNODE_FLAG_* */
66*4d3c95f5SJorgen Lundman 	uint16_t dn_datablkszsec;	/* data block size in 512b sectors */
67*4d3c95f5SJorgen Lundman 	uint16_t dn_bonuslen;		/* length of dn_bonus */
68*4d3c95f5SJorgen Lundman 	uint8_t dn_pad2[4];
69*4d3c95f5SJorgen Lundman 
70*4d3c95f5SJorgen Lundman 	/* accounting is protected by dn_dirty_mtx */
71*4d3c95f5SJorgen Lundman 	uint64_t dn_maxblkid;		/* largest allocated block ID */
72*4d3c95f5SJorgen Lundman 	uint64_t dn_used;		/* bytes (or sectors) of disk space */
73*4d3c95f5SJorgen Lundman 
74*4d3c95f5SJorgen Lundman 	uint64_t dn_pad3[4];
75*4d3c95f5SJorgen Lundman 
76*4d3c95f5SJorgen Lundman 	blkptr_t dn_blkptr[1];
77*4d3c95f5SJorgen Lundman 	uint8_t dn_bonus[DN_MAX_BONUSLEN - sizeof(blkptr_t)];
78*4d3c95f5SJorgen Lundman 	blkptr_t dn_spill;
79*4d3c95f5SJorgen Lundman } dnode_phys_t;
80*4d3c95f5SJorgen Lundman 
81*4d3c95f5SJorgen Lundman #endif	/* _SYS_DNODE_H */
82