diff options
| author | Jorgen Lundman <lundman@lundman.net> | 2012-07-19 20:48:25 +0000 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2012-08-09 23:42:20 +0200 | 
| commit | 4d3c95f5ea7c737a21cd6b9c59435ee693b3f127 (patch) | |
| tree | d11c09245a46d3b0a55c0937874fb2debcb96490 /include/zfs/zap_leaf.h | |
| parent | 753ac610880e6e563d0384bb114f8b41df89e520 (diff) | |
| download | olio-uboot-2014.01-4d3c95f5ea7c737a21cd6b9c59435ee693b3f127.tar.xz olio-uboot-2014.01-4d3c95f5ea7c737a21cd6b9c59435ee693b3f127.zip | |
zfs: Add ZFS filesystem support
U-Boot port is based on sources forked from GRUB-0.97 by Sun in 2004,
which can be found here:
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/grub/grub-0.97/stage2/zfs-include/zfs.h
Released by Sun for GRUB under the license:
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
GRUB official releases include ZFS in version:
ftp://alpha.gnu.org/gnu/grub/grub-1.99~rc1.tar.gz
And patched against GRUB Bazaar repository for ashift fixes (4KB HDDs)
more conveniently found at github:
https://github.com/pendor/grub-zfs/commit/e7b6ef3ac3b9685ac4c394c897b1d4221b7381f1
Signed-off-by: Jorgen Lundman <lundman@lundman.net>
Diffstat (limited to 'include/zfs/zap_leaf.h')
| -rw-r--r-- | include/zfs/zap_leaf.h | 103 | 
1 files changed, 103 insertions, 0 deletions
| diff --git a/include/zfs/zap_leaf.h b/include/zfs/zap_leaf.h new file mode 100644 index 000000000..ed7ff62d3 --- /dev/null +++ b/include/zfs/zap_leaf.h @@ -0,0 +1,103 @@ +/* + *  GRUB  --  GRand Unified Bootloader + *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc. + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * Copyright 2007 Sun Microsystems, Inc.  All rights reserved. + * Use is subject to license terms. + */ + +#ifndef	_SYS_ZAP_LEAF_H +#define	_SYS_ZAP_LEAF_H + +#define	ZAP_LEAF_MAGIC 0x2AB1EAF + +/* chunk size = 24 bytes */ +#define	ZAP_LEAF_CHUNKSIZE 24 + +/* + * The amount of space within the chunk available for the array is: + * chunk size - space for type (1) - space for next pointer (2) + */ +#define	ZAP_LEAF_ARRAY_BYTES (ZAP_LEAF_CHUNKSIZE - 3) + +typedef enum zap_chunk_type { +	ZAP_CHUNK_FREE = 253, +	ZAP_CHUNK_ENTRY = 252, +	ZAP_CHUNK_ARRAY = 251, +	ZAP_CHUNK_TYPE_MAX = 250 +} zap_chunk_type_t; + +/* + * TAKE NOTE: + * If zap_leaf_phys_t is modified, zap_leaf_byteswap() must be modified. + */ +typedef struct zap_leaf_phys { +	struct zap_leaf_header { +		uint64_t lh_block_type;		/* ZBT_LEAF */ +		uint64_t lh_pad1; +		uint64_t lh_prefix;		/* hash prefix of this leaf */ +		uint32_t lh_magic;		/* ZAP_LEAF_MAGIC */ +		uint16_t lh_nfree;		/* number free chunks */ +		uint16_t lh_nentries;		/* number of entries */ +		uint16_t lh_prefix_len;		/* num bits used to id this */ + +		/* above is accessable to zap, below is zap_leaf private */ + +		uint16_t lh_freelist;		/* chunk head of free list */ +		uint8_t lh_pad2[12]; +	} l_hdr; /* 2 24-byte chunks */ + +	/* +	 * The header is followed by a hash table with +	 * ZAP_LEAF_HASH_NUMENTRIES(zap) entries.  The hash table is +	 * followed by an array of ZAP_LEAF_NUMCHUNKS(zap) +	 * zap_leaf_chunk structures.  These structures are accessed +	 * with the ZAP_LEAF_CHUNK() macro. +	 */ + +	uint16_t l_hash[1]; +} zap_leaf_phys_t; + +typedef union zap_leaf_chunk { +	struct zap_leaf_entry { +		uint8_t le_type;		/* always ZAP_CHUNK_ENTRY */ +		uint8_t le_int_size;		/* size of ints */ +		uint16_t le_next;		/* next entry in hash chain */ +		uint16_t le_name_chunk;		/* first chunk of the name */ +		uint16_t le_name_length;	/* bytes in name, incl null */ +		uint16_t le_value_chunk;	/* first chunk of the value */ +		uint16_t le_value_length;	/* value length in ints */ +		uint32_t le_cd;		/* collision differentiator */ +		uint64_t le_hash;		/* hash value of the name */ +	} l_entry; +	struct zap_leaf_array { +		uint8_t la_type;		/* always ZAP_CHUNK_ARRAY */ +		union { +			uint8_t la_array[ZAP_LEAF_ARRAY_BYTES]; +			uint64_t la_array64; +		} __attribute__ ((packed)); +		uint16_t la_next;		/* next blk or CHAIN_END */ +	} l_array; +	struct zap_leaf_free { +		uint8_t lf_type;		/* always ZAP_CHUNK_FREE */ +		uint8_t lf_pad[ZAP_LEAF_ARRAY_BYTES]; +		uint16_t lf_next;	/* next in free list, or CHAIN_END */ +	} l_free; +} zap_leaf_chunk_t; + +#endif /* _SYS_ZAP_LEAF_H */ |