Commit b46aa3f9 authored by Keir Fraser's avatar Keir Fraser

Add ZFS libfsimage support patch

Add support to pygrub and libfsimage to boot ZFS root filesystems.
Boot argument of zfs-bootfs is set to describe ZFS root pool and
boot filesystem object number.  Boot argument bootpath is set to
describe the virtual device root mirror components.
Signed-off-by: default avatarSusan Kamm-Worrell <susan.kamm-worrell@sun.com>
parent cc15f33d
XEN_ROOT = ../..
include $(XEN_ROOT)/tools/Rules.mk
SUBDIRS-y = common ufs reiserfs iso9660 fat
SUBDIRS-y = common ufs reiserfs iso9660 fat zfs
SUBDIRS-y += $(shell env CC="$(CC)" ./check-libext2fs)
.PHONY: all clean install
......
......@@ -17,7 +17,7 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
......@@ -51,6 +51,7 @@ fsi_t *fsi_open_fsimage(const char *path, uint64_t off, const char *options)
fsi->f_fd = fd;
fsi->f_off = off;
fsi->f_data = NULL;
fsi->f_bootstring = NULL;
pthread_mutex_lock(&fsi_lock);
err = find_plugin(fsi, path, options);
......@@ -140,3 +141,29 @@ ssize_t fsi_pread_file(fsi_file_t *ffi, void *buf, size_t nbytes, uint64_t off)
return (ret);
}
char *
fsi_bootstring_alloc(fsi_t *fsi, size_t len)
{
fsi->f_bootstring = malloc(len);
if (fsi->f_bootstring == NULL)
return (NULL);
bzero(fsi->f_bootstring, len);
return (fsi->f_bootstring);
}
void
fsi_bootstring_free(fsi_t *fsi)
{
if (fsi->f_bootstring != NULL) {
free(fsi->f_bootstring);
fsi->f_bootstring = NULL;
}
}
char *
fsi_fs_bootstring(fsi_t *fsi)
{
return (fsi->f_bootstring);
}
......@@ -17,7 +17,7 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
......@@ -45,6 +45,10 @@ int fsi_close_file(fsi_file_t *);
ssize_t fsi_read_file(fsi_file_t *, void *, size_t);
ssize_t fsi_pread_file(fsi_file_t *, void *, size_t, uint64_t);
char *fsi_bootstring_alloc(fsi_t *, size_t);
void fsi_bootstring_free(fsi_t *);
char *fsi_fs_bootstring(fsi_t *);
#ifdef __cplusplus
};
#endif
......
......@@ -17,7 +17,7 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
......@@ -286,6 +286,7 @@ fsig_mount(fsi_t *fsi, const char *path, const char *options)
if (!ops->fpo_mount(ffi, options)) {
fsip_file_free(ffi);
fsi_bootstring_free(fsi);
free(fsi->f_data);
fsi->f_data = NULL;
return (-1);
......@@ -299,6 +300,7 @@ fsig_mount(fsi_t *fsi, const char *path, const char *options)
static int
fsig_umount(fsi_t *fsi)
{
fsi_bootstring_free(fsi);
free(fsi->f_data);
return (0);
}
......
......@@ -17,7 +17,7 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
......@@ -72,6 +72,12 @@ unsigned long fsig_log2(unsigned long);
#define ERR_FILELENGTH 1
#define ERR_BAD_FILETYPE 1
#define ERR_FILE_NOT_FOUND 1
#define ERR_BAD_ARGUMENT 1
#define ERR_FILESYSTEM_NOT_FOUND 1
#define ERR_NO_BOOTPATH 1
#define ERR_DEV_VALUES 1
#define ERR_WONT_FIT 1
#define ERR_READ 1
fsi_plugin_ops_t *fsig_init(fsi_plugin_t *, fsig_plugin_ops_t *);
......
......@@ -17,7 +17,7 @@
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
......@@ -46,6 +46,7 @@ struct fsi {
uint64_t f_off;
void *f_data;
fsi_plugin_t *f_plugin;
char *f_bootstring;
};
struct fsi_file {
......
......@@ -8,6 +8,9 @@ VERSION {
fsi_close_file;
fsi_read_file;
fsi_pread_file;
fsi_bootstring_alloc;
fsi_bootstring_free;
fsi_fs_bootstring;
fsip_fs_set_data;
fsip_file_alloc;
......
......@@ -7,6 +7,9 @@ libfsimage.so.1.0 {
fsi_close_file;
fsi_read_file;
fsi_pread_file;
fsi_bootstring_alloc;
fsi_bootstring_free;
fsi_fs_bootstring;
fsip_fs_set_data;
fsip_file_alloc;
......
#
# 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 2008 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
XEN_ROOT = ../../..
LIB_SRCS-y = fsys_zfs.c zfs_lzjb.c zfs_sha256.c zfs_fletcher.c
FS = zfs
.PHONY: all
all: fs-all
.PHONY: install
install: fs-install
include $(XEN_ROOT)/tools/libfsimage/Rules.mk
This diff is collapsed.
/*
* 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 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _FSYS_ZFS_H
#define _FSYS_ZFS_H
#include <fsimage_grub.h>
#include <fsimage_priv.h>
#include "zfs-include/zfs.h"
#include "zfs-include/dmu.h"
#include "zfs-include/spa.h"
#include "zfs-include/zio.h"
#include "zfs-include/zio_checksum.h"
#include "zfs-include/vdev_impl.h"
#include "zfs-include/zap_impl.h"
#include "zfs-include/zap_leaf.h"
#include "zfs-include/uberblock_impl.h"
#include "zfs-include/dnode.h"
#include "zfs-include/dsl_dir.h"
#include "zfs-include/zfs_acl.h"
#include "zfs-include/zfs_znode.h"
#include "zfs-include/dsl_dataset.h"
#include "zfs-include/zil.h"
#include "zfs-include/dmu_objset.h"
/*
* Global Memory addresses to store MOS and DNODE data
*/
#define MOS ((dnode_phys_t *)(((zfs_bootarea_t *) \
(ffi->ff_fsi->f_data))->zfs_data))
#define DNODE (MOS+1) /* move sizeof(dnode_phys_t) bytes */
#define ZFS_SCRATCH ((char *)(DNODE+1))
#define MAXNAMELEN 256
typedef struct zfs_bootarea {
char zfs_current_bootpath[MAXNAMELEN];
char zfs_current_rootpool[MAXNAMELEN];
char zfs_current_bootfs[MAXNAMELEN];
uint64_t zfs_current_bootfs_obj;
int zfs_open;
/* cache for a file block of the currently zfs_open()-ed file */
void *zfs_file_buf;
uint64_t zfs_file_start;
uint64_t zfs_file_end;
/* cache for a dnode block */
dnode_phys_t *zfs_dnode_buf;
dnode_phys_t *zfs_dnode_mdn;
uint64_t zfs_dnode_start;
uint64_t zfs_dnode_end;
char *zfs_stackbase;
char zfs_data[0x400000];
} zfs_bootarea_t;
/*
* Verify dnode type.
* Can only be used in functions returning non-0 for failure.
*/
#define VERIFY_DN_TYPE(dnp, type) \
if (type && (dnp)->dn_type != type) { \
return (ERR_FSYS_CORRUPT); \
}
/*
* Verify object set type.
* Can only be used in functions returning 0 for failure.
*/
#define VERIFY_OS_TYPE(osp, type) \
if (type && (osp)->os_type != type) { \
errnum = ERR_FSYS_CORRUPT; \
return (0); \
}
#define ZPOOL_PROP_BOOTFS "bootfs"
/* General macros */
#define BSWAP_8(x) ((x) & 0xff)
#define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8))
#define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16))
#define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32))
#define P2ROUNDUP(x, align) (-(-(x) & -(align)))
/*
* XXX Match these macro up with real zfs once we have nvlist support so that we
* can support large sector disks.
*/
#define UBERBLOCK_SIZE (1ULL << UBERBLOCK_SHIFT)
#undef offsetof
#define offsetof(t, m) (size_t)(&(((t *)0)->m))
#define VDEV_UBERBLOCK_SHIFT UBERBLOCK_SHIFT
#define VDEV_UBERBLOCK_OFFSET(n) \
offsetof(vdev_label_t, vl_uberblock[(n) << VDEV_UBERBLOCK_SHIFT])
typedef struct uberblock uberblock_t;
/* XXX Uberblock_phys_t is no longer in the kernel zfs */
typedef struct uberblock_phys {
uberblock_t ubp_uberblock;
char ubp_pad[UBERBLOCK_SIZE - sizeof (uberblock_t) -
sizeof (zio_block_tail_t)];
zio_block_tail_t ubp_zbt;
} uberblock_phys_t;
/*
* Macros to get fields in a bp or DVA.
*/
#define P2PHASE(x, align) ((x) & ((align) - 1))
#define DVA_OFFSET_TO_PHYS_SECTOR(offset) \
((offset + VDEV_LABEL_START_SIZE) >> SPA_MINBLOCKSHIFT)
/*
* For nvlist manipulation. (from nvpair.h)
*/
#define NV_ENCODE_NATIVE 0
#define NV_ENCODE_XDR 1
#define HOST_ENDIAN 1 /* for x86 machine */
#define DATA_TYPE_UINT64 8
#define DATA_TYPE_STRING 9
#define DATA_TYPE_NVLIST 19
#define DATA_TYPE_NVLIST_ARRAY 20
/*
* Decompression Entry - lzjb
*/
#ifndef NBBY
#define NBBY 8
#endif
typedef int zfs_decomp_func_t(void *s_start, void *d_start, size_t s_len,
size_t d_len);
typedef struct decomp_entry {
char *name;
zfs_decomp_func_t *decomp_func;
} decomp_entry_t;
/*
* FAT ZAP data structures
*/
#define ZFS_CRC64_POLY 0xC96C5795D7870F42ULL /* ECMA-182, reflected form */
#define ZAP_HASH_IDX(hash, n) (((n) == 0) ? 0 : ((hash) >> (64 - (n))))
#define CHAIN_END 0xffff /* end of the chunk chain */
/*
* 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)
#define ZAP_LEAF_HASH_SHIFT(bs) (bs - 5)
#define ZAP_LEAF_HASH_NUMENTRIES(bs) (1 << ZAP_LEAF_HASH_SHIFT(bs))
#define LEAF_HASH(bs, h) \
((ZAP_LEAF_HASH_NUMENTRIES(bs)-1) & \
((h) >> (64 - ZAP_LEAF_HASH_SHIFT(bs)-l->l_hdr.lh_prefix_len)))
/*
* The amount of space available for chunks is:
* block size shift - hash entry size (2) * number of hash
* entries - header space (2*chunksize)
*/
#define ZAP_LEAF_NUMCHUNKS(bs) \
(((1<<bs) - 2*ZAP_LEAF_HASH_NUMENTRIES(bs)) / \
ZAP_LEAF_CHUNKSIZE - 2)
/*
* The chunks start immediately after the hash table. The end of the
* hash table is at l_hash + HASH_NUMENTRIES, which we simply cast to a
* chunk_t.
*/
#define ZAP_LEAF_CHUNK(l, bs, idx) \
((zap_leaf_chunk_t *)(l->l_hash + ZAP_LEAF_HASH_NUMENTRIES(bs)))[idx]
#define ZAP_LEAF_ENTRY(l, bs, idx) (&ZAP_LEAF_CHUNK(l, bs, idx).l_entry)
extern void fletcher_2_native(const void *, uint64_t, zio_cksum_t *);
extern void fletcher_2_byteswap(const void *, uint64_t, zio_cksum_t *);
extern void fletcher_4_native(const void *, uint64_t, zio_cksum_t *);
extern void fletcher_4_byteswap(const void *, uint64_t, zio_cksum_t *);
extern void zio_checksum_SHA256(const void *, uint64_t, zio_cksum_t *);
extern int lzjb_decompress(void *, void *, size_t, size_t);
#endif /* !_FSYS_ZFS_H */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2000,2003 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.
*/
/*
* The structure type "mod_list" is used by the "multiboot_info" structure.
*/
struct mod_list
{
/* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */
unsigned long mod_start;
unsigned long mod_end;
/* Module command line */
unsigned long cmdline;
/* padding to take it to 16 bytes (must be zero) */
unsigned long pad;
};
/*
* INT-15, AX=E820 style "AddressRangeDescriptor"
* ...with a "size" parameter on the front which is the structure size - 4,
* pointing to the next one, up until the full buffer length of the memory
* map has been reached.
*/
struct AddrRangeDesc
{
unsigned long size;
unsigned long long BaseAddr;
unsigned long long Length;
unsigned long Type;
/* unspecified optional padding... */
} __attribute__ ((packed));
/* usable memory "Type", all others are reserved. */
#define MB_ARD_MEMORY 1
/* Drive Info structure. */
struct drive_info
{
/* The size of this structure. */
unsigned long size;
/* The BIOS drive number. */
unsigned char drive_number;
/* The access mode (see below). */
unsigned char drive_mode;
/* The BIOS geometry. */
unsigned short drive_cylinders;
unsigned char drive_heads;
unsigned char drive_sectors;
/* The array of I/O ports used for the drive. */
unsigned short drive_ports[0];
};
/* Drive Mode. */
#define MB_DI_CHS_MODE 0
#define MB_DI_LBA_MODE 1
/* APM BIOS info. */
struct apm_info
{
unsigned short version;
unsigned short cseg;
unsigned long offset;
unsigned short cseg_16;
unsigned short dseg_16;
unsigned short cseg_len;
unsigned short cseg_16_len;
unsigned short dseg_16_len;
};
/*
* MultiBoot Info description
*
* This is the struct passed to the boot image. This is done by placing
* its address in the EAX register.
*/
struct multiboot_info
{
/* MultiBoot info version number */
unsigned long flags;
/* Available memory from BIOS */
unsigned long mem_lower;
unsigned long mem_upper;
/* "root" partition */
unsigned long boot_device;
/* Kernel command line */
unsigned long cmdline;
/* Boot-Module list */
unsigned long mods_count;
unsigned long mods_addr;
union
{
struct
{
/* (a.out) Kernel symbol table info */
unsigned long tabsize;
unsigned long strsize;
unsigned long addr;
unsigned long pad;
}
a;
struct
{
/* (ELF) Kernel section header table */
unsigned long num;
unsigned long size;
unsigned long addr;
unsigned long shndx;
}
e;
}
syms;
/* Memory Mapping buffer */
unsigned long mmap_length;
unsigned long mmap_addr;
/* Drive Info buffer */
unsigned long drives_length;
unsigned long drives_addr;
/* ROM configuration table */
unsigned long config_table;
/* Boot Loader Name */
unsigned long boot_loader_name;
/* APM table */
unsigned long apm_table;
/* Video */
unsigned long vbe_control_info;
unsigned long vbe_mode_info;
unsigned short vbe_mode;
unsigned short vbe_interface_seg;
unsigned short vbe_interface_off;
unsigned short vbe_interface_len;
};
/*
* Flags to be set in the 'flags' parameter above
*/
/* is there basic lower/upper memory information? */
#define MB_INFO_MEMORY 0x00000001
/* is there a boot device set? */
#define MB_INFO_BOOTDEV 0x00000002
/* is the command-line defined? */
#define MB_INFO_CMDLINE 0x00000004
/* are there modules to do something with? */
#define MB_INFO_MODS 0x00000008
/* These next two are mutually exclusive */
/* is there a symbol table loaded? */
#define MB_INFO_AOUT_SYMS 0x00000010
/* is there an ELF section header table? */
#define MB_INFO_ELF_SHDR 0x00000020
/* is there a full memory map? */
#define MB_INFO_MEM_MAP 0x00000040
/* Is there drive info? */
#define MB_INFO_DRIVE_INFO 0x00000080
/* Is there a config table? */
#define MB_INFO_CONFIG_TABLE 0x00000100
/* Is there a boot loader name? */
#define MB_INFO_BOOT_LOADER_NAME 0x00000200
/* Is there a APM table? */
#define MB_INFO_APM_TABLE 0x00000400
/* Is there video information? */
#define MB_INFO_VIDEO_INFO 0x00000800
/*
* The following value must be present in the EAX register.
*/
#define MULTIBOOT_VALID 0x2BADB002
/*
* 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_DMU_H
#define _SYS_DMU_H
/*
* This file describes the interface that the DMU provides for its
* consumers.
*
* The DMU also interacts with the SPA. That interface is described in
* dmu_spa.h.
*/
typedef enum dmu_object_type {
DMU_OT_NONE,
/* general: */
DMU_OT_OBJECT_DIRECTORY, /* ZAP */
DMU_OT_OBJECT_ARRAY, /* UINT64 */
DMU_OT_PACKED_NVLIST, /* UINT8 (XDR by nvlist_pack/unpack) */
DMU_OT_PACKED_NVLIST_SIZE, /* UINT64 */
DMU_OT_BPLIST, /* UINT64 */
DMU_OT_BPLIST_HDR, /* UINT64 */
/* spa: */
DMU_OT_SPACE_MAP_HEADER, /* UINT64 */
DMU_OT_SPACE_MAP, /* UINT64 */
/* zil: */
DMU_OT_INTENT_LOG, /* UINT64 */
/* dmu: */
DMU_OT_DNODE, /* DNODE */
DMU_OT_OBJSET, /* OBJSET */
/* dsl: */
DMU_OT_DSL_DIR, /* UINT64 */
DMU_OT_DSL_DIR_CHILD_MAP, /* ZAP */
DMU_OT_DSL_DS_SNAP_MAP, /* ZAP */
DMU_OT_DSL_PROPS, /* ZAP */
DMU_OT_DSL_DATASET, /* UINT64 */
/* zpl: */
DMU_OT_ZNODE, /* ZNODE */
DMU_OT_ACL, /* ACL */
DMU_OT_PLAIN_FILE_CONTENTS, /* UINT8 */
DMU_OT_DIRECTORY_CONTENTS, /* ZAP */
DMU_OT_MASTER_NODE, /* ZAP */
DMU_OT_UNLINKED_SET, /* ZAP */
/* zvol: */
DMU_OT_ZVOL, /* UINT8 */
DMU_OT_ZVOL_PROP, /* ZAP */
/* other; for testing only! */
DMU_OT_PLAIN_OTHER, /* UINT8 */
DMU_OT_UINT64_OTHER, /* UINT64 */
DMU_OT_ZAP_OTHER, /* ZAP */
/* new object types: */
DMU_OT_ERROR_LOG, /* ZAP */
DMU_OT_SPA_HISTORY, /* UINT8 */
DMU_OT_SPA_HISTORY_OFFSETS, /* spa_his_phys_t */
DMU_OT_POOL_PROPS, /* ZAP */
DMU_OT_NUMTYPES
} dmu_object_type_t;
typedef enum dmu_objset_type {
DMU_OST_NONE,
DMU_OST_META,
DMU_OST_ZFS,
DMU_OST_ZVOL,
DMU_OST_OTHER, /* For testing only! */
DMU_OST_ANY, /* Be careful! */
DMU_OST_NUMTYPES
} dmu_objset_type_t;
/*
* The names of zap entries in the DIRECTORY_OBJECT of the MOS.
*/
#define DMU_POOL_DIRECTORY_OBJECT 1
#define DMU_POOL_CONFIG "config"
#define DMU_POOL_ROOT_DATASET "root_dataset"
#define DMU_POOL_SYNC_BPLIST "sync_bplist"
#define DMU_POOL_ERRLOG_SCRUB "errlog_scrub"
#define DMU_POOL_ERRLOG_LAST "errlog_last"
#define DMU_POOL_SPARES "spares"
#define DMU_POOL_DEFLATE "deflate"
#define DMU_POOL_HISTORY "history"
#define DMU_POOL_PROPS "pool_props"
#define DMU_POOL_L2CACHE "l2cache"
#endif /* _SYS_DMU_H */
/*
* 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.