usr/src/grub/grub-0.97/stage2/zfs-include/zap_impl.h
author Jeff Bonwick <Jeff.Bonwick@Sun.COM>
Sun, 01 Nov 2009 14:14:46 -0800
changeset 10922 e2081f502306
parent 8044 b3af80bbf173
permissions -rw-r--r--
PSARC 2009/571 ZFS Deduplication Properties 6677093 zfs should have dedup capability
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     1
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     2
 *  GRUB  --  GRand Unified Bootloader
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     3
 *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     4
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     5
 *  This program is free software; you can redistribute it and/or modify
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     6
 *  it under the terms of the GNU General Public License as published by
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     7
 *  the Free Software Foundation; either version 2 of the License, or
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     8
 *  (at your option) any later version.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
     9
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    10
 *  This program is distributed in the hope that it will be useful,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    13
 *  GNU General Public License for more details.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    14
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    15
 *  You should have received a copy of the GNU General Public License
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    16
 *  along with this program; if not, write to the Free Software
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    17
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    18
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    19
/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8044
diff changeset
    20
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    21
 * Use is subject to license terms.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    22
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    23
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    24
#ifndef	_SYS_ZAP_IMPL_H
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    25
#define	_SYS_ZAP_IMPL_H
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    26
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    27
#define	ZAP_MAGIC 0x2F52AB2ABULL
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    28
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    29
#define	MZAP_ENT_LEN		64
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    30
#define	MZAP_NAME_LEN		(MZAP_ENT_LEN - 8 - 4 - 2)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    31
#define	MZAP_MAX_BLKSHIFT	SPA_MAXBLOCKSHIFT
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    32
#define	MZAP_MAX_BLKSZ		(1 << MZAP_MAX_BLKSHIFT)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    33
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    34
typedef struct mzap_ent_phys {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    35
	uint64_t mze_value;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    36
	uint32_t mze_cd;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    37
	uint16_t mze_pad;	/* in case we want to chain them someday */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    38
	char mze_name[MZAP_NAME_LEN];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    39
} mzap_ent_phys_t;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    40
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    41
typedef struct mzap_phys {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    42
	uint64_t mz_block_type;	/* ZBT_MICRO */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    43
	uint64_t mz_salt;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    44
	uint64_t mz_pad[6];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    45
	mzap_ent_phys_t mz_chunk[1];
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    46
	/* actually variable size depending on block size */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    47
} mzap_phys_t;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    48
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    49
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    50
 * The (fat) zap is stored in one object. It is an array of
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    51
 * 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    52
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    53
 * ptrtbl fits in first block:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    54
 * 	[zap_phys_t zap_ptrtbl_shift < 6] [zap_leaf_t] ...
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    55
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    56
 * ptrtbl too big for first block:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    57
 * 	[zap_phys_t zap_ptrtbl_shift >= 6] [zap_leaf_t] [ptrtbl] ...
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    58
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    59
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    60
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    61
#define	ZBT_LEAF		((1ULL << 63) + 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    62
#define	ZBT_HEADER		((1ULL << 63) + 1)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    63
#define	ZBT_MICRO		((1ULL << 63) + 3)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    64
/* any other values are ptrtbl blocks */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    65
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    66
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    67
 * the embedded pointer table takes up half a block:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    68
 * block size / entry size (2^3) / 2
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    69
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    70
#define	ZAP_EMBEDDED_PTRTBL_SHIFT(zap) (FZAP_BLOCK_SHIFT(zap) - 3 - 1)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    71
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    72
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    73
 * The embedded pointer table starts half-way through the block.  Since
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    74
 * the pointer table itself is half the block, it starts at (64-bit)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    75
 * word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    76
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    77
#define	ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    78
	((uint64_t *)(zap)->zap_f.zap_phys) \
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    79
	[(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    80
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    81
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    82
 * TAKE NOTE:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    83
 * If zap_phys_t is modified, zap_byteswap() must be modified.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    84
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    85
typedef struct zap_phys {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    86
	uint64_t zap_block_type;	/* ZBT_HEADER */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    87
	uint64_t zap_magic;		/* ZAP_MAGIC */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    88
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    89
	struct zap_table_phys {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    90
		uint64_t zt_blk;	/* starting block number */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    91
		uint64_t zt_numblks;	/* number of blocks */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    92
		uint64_t zt_shift;	/* bits to index it */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    93
		uint64_t zt_nextblk;	/* next (larger) copy start block */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    94
		uint64_t zt_blks_copied; /* number source blocks copied */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    95
	} zap_ptrtbl;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    96
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    97
	uint64_t zap_freeblk;		/* the next free block */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    98
	uint64_t zap_num_leafs;		/* number of leafs */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
    99
	uint64_t zap_num_entries;	/* number of entries */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   100
	uint64_t zap_salt;		/* salt to stir into hash function */
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8044
diff changeset
   101
	uint64_t zap_normflags;		/* flags for u8_textprep_str() */
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8044
diff changeset
   102
	uint64_t zap_flags;		/* zap_flag_t */
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   103
	/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   104
	 * This structure is followed by padding, and then the embedded
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   105
	 * pointer table.  The embedded pointer table takes up second
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   106
	 * half of the block.  It is accessed using the
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   107
	 * ZAP_EMBEDDED_PTRTBL_ENT() macro.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   108
	 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   109
} zap_phys_t;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   110
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents:
diff changeset
   111
#endif /* _SYS_ZAP_IMPL_H */