summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorlling <none@none>2007-03-28 12:48:13 -0700
committerlling <none@none>2007-03-28 12:48:13 -0700
commitb1b8ab34de515a5e83206da22c3d7e563241b021 (patch)
tree8c9f7da67a4d8d2a81bba396bad5bba941116e7d /usr/src
parentc400425dc1f88bd15e7c4ac7c89631eaf9e35535 (diff)
downloadillumos-joyent-b1b8ab34de515a5e83206da22c3d7e563241b021.tar.gz
PSARC 2007/083 ZFS bootable datasets
4929890 ZFS Boot support for the x86 platform 6479807 pools need properties 6531774 reserve bits in directory entry for file type
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/truss/codes.c6
-rw-r--r--usr/src/cmd/zdb/zdb.c7
-rw-r--r--usr/src/cmd/zfs/zfs_main.c220
-rw-r--r--usr/src/cmd/zpool/zpool_iter.c20
-rw-r--r--usr/src/cmd/zpool/zpool_main.c240
-rw-r--r--usr/src/cmd/zpool/zpool_util.h7
-rw-r--r--usr/src/common/zfs/zfs_prop.c146
-rw-r--r--usr/src/grub/grub-0.95/AUTHORS5
-rwxr-xr-xusr/src/grub/grub-0.95/configure11
-rw-r--r--usr/src/grub/grub-0.95/configure.ac7
-rw-r--r--usr/src/grub/grub-0.95/grub/Makefile.am2
-rw-r--r--usr/src/grub/grub-0.95/grub/Makefile.in2
-rw-r--r--usr/src/grub/grub-0.95/grub/Makefile.solaris2
-rw-r--r--usr/src/grub/grub-0.95/grub/asmstub.c2
-rw-r--r--usr/src/grub/grub-0.95/stage2/Makefile.am23
-rw-r--r--usr/src/grub/grub-0.95/stage2/Makefile.in444
-rw-r--r--usr/src/grub/grub-0.95/stage2/Makefile.solaris97
-rw-r--r--usr/src/grub/grub-0.95/stage2/boot.c14
-rw-r--r--usr/src/grub/grub-0.95/stage2/builtins.c161
-rw-r--r--usr/src/grub/grub-0.95/stage2/char_io.c52
-rw-r--r--usr/src/grub/grub-0.95/stage2/common.c4
-rw-r--r--usr/src/grub/grub-0.95/stage2/disk_io.c16
-rw-r--r--usr/src/grub/grub-0.95/stage2/filesys.h13
-rw-r--r--usr/src/grub/grub-0.95/stage2/fsys_zfs.c1197
-rw-r--r--usr/src/grub/grub-0.95/stage2/fsys_zfs.h191
-rw-r--r--usr/src/grub/grub-0.95/stage2/shared.h11
-rw-r--r--usr/src/grub/grub-0.95/stage2/ufs.h3
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/dmu.h106
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/dmu_objset.h37
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/dnode.h78
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dataset.h55
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dir.h50
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/spa.h285
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/uberblock_impl.h51
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/vdev_impl.h72
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zap_impl.h112
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zap_leaf.h102
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zfs.h96
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zfs_acl.h52
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zfs_znode.h65
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zil.h53
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zio.h83
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs-include/zio_checksum.h44
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs_fletcher.c95
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs_lzjb.c61
-rw-r--r--usr/src/grub/grub-0.95/stage2/zfs_sha256.c126
-rw-r--r--usr/src/lib/libzfs/common/libzfs.h52
-rw-r--r--usr/src/lib/libzfs/common/libzfs_dataset.c161
-rw-r--r--usr/src/lib/libzfs/common/libzfs_impl.h11
-rw-r--r--usr/src/lib/libzfs/common/libzfs_pool.c193
-rw-r--r--usr/src/lib/libzfs/common/libzfs_util.c199
-rw-r--r--usr/src/lib/libzfs/common/mapfile-vers8
-rw-r--r--usr/src/lib/libzpool/common/kernel.c9
-rw-r--r--usr/src/lib/libzpool/common/sys/zfs_context.h3
-rw-r--r--usr/src/pkgdefs/SUNWgrub/prototype_i3868
-rw-r--r--usr/src/pkgdefs/SUNWgrubS/prototype_i38630
-rw-r--r--usr/src/uts/common/fs/vfs.c30
-rw-r--r--usr/src/uts/common/fs/zfs/dmu.c5
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_dataset.c32
-rw-r--r--usr/src/uts/common/fs/zfs/spa.c161
-rw-r--r--usr/src/uts/common/fs/zfs/spa_config.c14
-rw-r--r--usr/src/uts/common/fs/zfs/spa_misc.c1
-rw-r--r--usr/src/uts/common/fs/zfs/sys/dmu.h2
-rw-r--r--usr/src/uts/common/fs/zfs/sys/dsl_dataset.h2
-rw-r--r--usr/src/uts/common/fs/zfs/sys/spa.h6
-rw-r--r--usr/src/uts/common/fs/zfs/sys/spa_impl.h8
-rw-r--r--usr/src/uts/common/fs/zfs/sys/zfs_znode.h10
-rw-r--r--usr/src/uts/common/fs/zfs/zfs_dir.c11
-rw-r--r--usr/src/uts/common/fs/zfs/zfs_ioctl.c152
-rw-r--r--usr/src/uts/common/fs/zfs/zfs_vfsops.c89
-rw-r--r--usr/src/uts/common/fs/zfs/zfs_vnops.c38
-rw-r--r--usr/src/uts/common/krtld/kobj.c79
-rw-r--r--usr/src/uts/common/krtld/kobj_stubs.c9
-rw-r--r--usr/src/uts/common/krtld/mapfile3
-rw-r--r--usr/src/uts/common/os/modsysfile.c46
-rw-r--r--usr/src/uts/common/sys/fs/zfs.h37
-rw-r--r--usr/src/uts/common/sys/kobj.h3
-rw-r--r--usr/src/uts/common/sys/sysconf.h3
-rw-r--r--usr/src/uts/intel/sys/bootconf.h1
-rw-r--r--usr/src/uts/sparc/krtld/mapfile1
-rw-r--r--usr/src/uts/sun/sys/bootconf.h1
81 files changed, 5398 insertions, 546 deletions
diff --git a/usr/src/cmd/truss/codes.c b/usr/src/cmd/truss/codes.c
index 1e734fd926..c1c632a854 100644
--- a/usr/src/cmd/truss/codes.c
+++ b/usr/src/cmd/truss/codes.c
@@ -918,6 +918,10 @@ const struct ioc {
"zfs_cmd_t" },
{ (uint_t)ZFS_IOC_OBJ_TO_PATH, "ZFS_IOC_OBJ_TO_PATH",
"zfs_cmd_t" },
+ { (uint_t)ZFS_IOC_POOL_SET_PROPS, "ZFS_IOC_POOL_SET_PROPS",
+ "zfs_cmd_t" },
+ { (uint_t)ZFS_IOC_POOL_GET_PROPS, "ZFS_IOC_POOL_GET_PROPS",
+ "zfs_cmd_t" },
/* kssl ioctls */
{ (uint_t)KSSL_ADD_ENTRY, "KSSL_ADD_ENTRY",
@@ -988,7 +992,7 @@ ioctlname(private_t *pri, uint_t code)
code & 0xff);
else if (isascii(c_lo_nm) && isprint(c_lo_nm))
(void) sprintf(pri->code_buf, "(('%c'<<8)|%d)",
- c_lo_nm, code & 0xff);
+ c_lo_nm, code & 0xff);
else if (code & (IOC_VOID|IOC_INOUT))
ioctl_ioccom(pri->code_buf, sizeof (pri->code_buf),
code, c_mid, c_lo, code & 0xff);
diff --git a/usr/src/cmd/zdb/zdb.c b/usr/src/cmd/zdb/zdb.c
index 617af4f679..bb7a52e779 100644
--- a/usr/src/cmd/zdb/zdb.c
+++ b/usr/src/cmd/zdb/zdb.c
@@ -887,6 +887,7 @@ static object_viewer_t *object_viewer[DMU_OT_NUMTYPES] = {
dump_zap, /* persistent error log */
dump_uint8, /* SPA history */
dump_uint64, /* SPA history offsets */
+ dump_zap, /* Pool properties */
};
static void
@@ -931,11 +932,11 @@ dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
if (doi.doi_checksum != ZIO_CHECKSUM_INHERIT || verbosity >= 6)
(void) snprintf(aux + strlen(aux), sizeof (aux), " (K=%s)",
- zio_checksum_table[doi.doi_checksum].ci_name);
+ zio_checksum_table[doi.doi_checksum].ci_name);
if (doi.doi_compress != ZIO_COMPRESS_INHERIT || verbosity >= 6)
(void) snprintf(aux + strlen(aux), sizeof (aux), " (Z=%s)",
- zio_compress_table[doi.doi_compress].ci_name);
+ zio_compress_table[doi.doi_compress].ci_name);
(void) printf("%10lld %3u %5s %5s %5s %5s %s%s\n",
(u_longlong_t)object, doi.doi_indirection, iblk, dblk, lsize,
@@ -1440,7 +1441,7 @@ zdb_blkptr_cb(traverse_blk_cache_t *bc, spa_t *spa, void *arg)
(u_longlong_t)zb->zb_objset,
(u_longlong_t)zb->zb_object,
(u_longlong_t)blkid2offset(bc->bc_dnode,
- zb->zb_level, zb->zb_blkid),
+ zb->zb_level, zb->zb_blkid),
blkbuf);
}
diff --git a/usr/src/cmd/zfs/zfs_main.c b/usr/src/cmd/zfs/zfs_main.c
index e8d26ceffb..815b72ea75 100644
--- a/usr/src/cmd/zfs/zfs_main.c
+++ b/usr/src/cmd/zfs/zfs_main.c
@@ -875,195 +875,6 @@ zfs_do_destroy(int argc, char **argv)
* Prints properties for the given datasets. The user can control which
* columns to display as well as which property types to allow.
*/
-typedef struct get_cbdata {
- int cb_sources;
- int cb_columns[4];
- int cb_colwidths[5];
- boolean_t cb_scripted;
- boolean_t cb_literal;
- boolean_t cb_first;
- zfs_proplist_t *cb_proplist;
-} get_cbdata_t;
-
-#define GET_COL_NAME 1
-#define GET_COL_PROPERTY 2
-#define GET_COL_VALUE 3
-#define GET_COL_SOURCE 4
-
-/*
- * Print the column headers for 'zfs get'.
- */
-static void
-print_get_headers(get_cbdata_t *cbp)
-{
- zfs_proplist_t *pl = cbp->cb_proplist;
- int i;
- char *title;
- size_t len;
-
- cbp->cb_first = B_FALSE;
- if (cbp->cb_scripted)
- return;
-
- /*
- * Start with the length of the column headers.
- */
- cbp->cb_colwidths[GET_COL_NAME] = strlen(gettext("NAME"));
- cbp->cb_colwidths[GET_COL_PROPERTY] = strlen(gettext("PROPERTY"));
- cbp->cb_colwidths[GET_COL_VALUE] = strlen(gettext("VALUE"));
- cbp->cb_colwidths[GET_COL_SOURCE] = strlen(gettext("SOURCE"));
-
- /*
- * Go through and calculate the widths for each column. For the
- * 'source' column, we kludge it up by taking the worst-case scenario of
- * inheriting from the longest name. This is acceptable because in the
- * majority of cases 'SOURCE' is the last column displayed, and we don't
- * use the width anyway. Note that the 'VALUE' column can be oversized,
- * if the name of the property is much longer the any values we find.
- */
- for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
- /*
- * 'PROPERTY' column
- */
- if (pl->pl_prop != ZFS_PROP_INVAL) {
- len = strlen(zfs_prop_to_name(pl->pl_prop));
- if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
- cbp->cb_colwidths[GET_COL_PROPERTY] = len;
- } else {
- len = strlen(pl->pl_user_prop);
- if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
- cbp->cb_colwidths[GET_COL_PROPERTY] = len;
- }
-
- /*
- * 'VALUE' column
- */
- if ((pl->pl_prop != ZFS_PROP_NAME || !pl->pl_all) &&
- pl->pl_width > cbp->cb_colwidths[GET_COL_VALUE])
- cbp->cb_colwidths[GET_COL_VALUE] = pl->pl_width;
-
- /*
- * 'NAME' and 'SOURCE' columns
- */
- if (pl->pl_prop == ZFS_PROP_NAME &&
- pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) {
- cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
- cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
- strlen(gettext("inherited from"));
- }
- }
-
- /*
- * Now go through and print the headers.
- */
- for (i = 0; i < 4; i++) {
- switch (cbp->cb_columns[i]) {
- case GET_COL_NAME:
- title = gettext("NAME");
- break;
- case GET_COL_PROPERTY:
- title = gettext("PROPERTY");
- break;
- case GET_COL_VALUE:
- title = gettext("VALUE");
- break;
- case GET_COL_SOURCE:
- title = gettext("SOURCE");
- break;
- default:
- title = NULL;
- }
-
- if (title != NULL) {
- if (i == 3 || cbp->cb_columns[i + 1] == 0)
- (void) printf("%s", title);
- else
- (void) printf("%-*s ",
- cbp->cb_colwidths[cbp->cb_columns[i]],
- title);
- }
- }
- (void) printf("\n");
-}
-
-/*
- * Display a single line of output, according to the settings in the callback
- * structure.
- */
-static void
-print_one_property(zfs_handle_t *zhp, get_cbdata_t *cbp, const char *propname,
- const char *value, zfs_source_t sourcetype, const char *source)
-{
- int i;
- const char *str;
- char buf[128];
-
- /*
- * Ignore those source types that the user has chosen to ignore.
- */
- if ((sourcetype & cbp->cb_sources) == 0)
- return;
-
- if (cbp->cb_first)
- print_get_headers(cbp);
-
- for (i = 0; i < 4; i++) {
- switch (cbp->cb_columns[i]) {
- case GET_COL_NAME:
- str = zfs_get_name(zhp);
- break;
-
- case GET_COL_PROPERTY:
- str = propname;
- break;
-
- case GET_COL_VALUE:
- str = value;
- break;
-
- case GET_COL_SOURCE:
- switch (sourcetype) {
- case ZFS_SRC_NONE:
- str = "-";
- break;
-
- case ZFS_SRC_DEFAULT:
- str = "default";
- break;
-
- case ZFS_SRC_LOCAL:
- str = "local";
- break;
-
- case ZFS_SRC_TEMPORARY:
- str = "temporary";
- break;
-
- case ZFS_SRC_INHERITED:
- (void) snprintf(buf, sizeof (buf),
- "inherited from %s", source);
- str = buf;
- break;
- }
- break;
-
- default:
- continue;
- }
-
- if (cbp->cb_columns[i + 1] == 0)
- (void) printf("%s", str);
- else if (cbp->cb_scripted)
- (void) printf("%s\t", str);
- else
- (void) printf("%-*s ",
- cbp->cb_colwidths[cbp->cb_columns[i]],
- str);
-
- }
-
- (void) printf("\n");
-}
/*
* Invoked to display the properties for a single dataset.
@@ -1074,7 +885,7 @@ get_callback(zfs_handle_t *zhp, void *data)
char buf[ZFS_MAXPROPLEN];
zfs_source_t sourcetype;
char source[ZFS_MAXNAMELEN];
- get_cbdata_t *cbp = data;
+ libzfs_get_cbdata_t *cbp = data;
nvlist_t *userprop = zfs_get_user_props(zhp);
zfs_proplist_t *pl = cbp->cb_proplist;
nvlist_t *propval;
@@ -1097,11 +908,18 @@ get_callback(zfs_handle_t *zhp, void *data)
cbp->cb_literal) != 0) {
if (pl->pl_all)
continue;
+ if (!zfs_prop_valid_for_type(pl->pl_prop,
+ ZFS_TYPE_ANY)) {
+ (void) fprintf(stderr,
+ gettext("No such property '%s'\n"),
+ zfs_prop_to_name(pl->pl_prop));
+ continue;
+ }
sourcetype = ZFS_SRC_NONE;
(void) strlcpy(buf, "-", sizeof (buf));
}
- print_one_property(zhp, cbp,
+ libzfs_print_one_property(zfs_get_name(zhp), cbp,
zfs_prop_to_name(pl->pl_prop),
buf, sourcetype, source);
} else {
@@ -1127,7 +945,7 @@ get_callback(zfs_handle_t *zhp, void *data)
}
}
- print_one_property(zhp, cbp,
+ libzfs_print_one_property(zfs_get_name(zhp), cbp,
pl->pl_user_prop, strval, sourcetype,
source);
}
@@ -1139,7 +957,7 @@ get_callback(zfs_handle_t *zhp, void *data)
static int
zfs_do_get(int argc, char **argv)
{
- get_cbdata_t cb = { 0 };
+ libzfs_get_cbdata_t cb = { 0 };
boolean_t recurse = B_FALSE;
int i, c;
char *value, *fields;
@@ -1209,7 +1027,7 @@ zfs_do_get(int argc, char **argv)
(void) fprintf(stderr,
gettext("invalid column name "
"'%s'\n"), value);
- usage(B_FALSE);
+ usage(B_FALSE);
}
}
break;
@@ -1242,7 +1060,7 @@ zfs_do_get(int argc, char **argv)
(void) fprintf(stderr,
gettext("invalid source "
"'%s'\n"), value);
- usage(B_FALSE);
+ usage(B_FALSE);
}
}
break;
@@ -2108,7 +1926,7 @@ zfs_do_send(int argc, char **argv)
if (isatty(STDOUT_FILENO)) {
(void) fprintf(stderr,
gettext("Error: Stream can not be written to a terminal.\n"
- "You must redirect standard output.\n"));
+ "You must redirect standard output.\n"));
return (1);
}
@@ -2198,8 +2016,8 @@ zfs_do_receive(int argc, char **argv)
if (isatty(STDIN_FILENO)) {
(void) fprintf(stderr,
gettext("Error: Backup stream can not be read "
- "from a terminal.\n"
- "You must redirect standard input.\n"));
+ "from a terminal.\n"
+ "You must redirect standard input.\n"));
return (1);
}
@@ -2726,8 +2544,8 @@ unshare_unmount_path(int op, char *path, int flags, boolean_t is_manual)
return (1);
verify(zfs_prop_get(zhp, op == OP_SHARE ?
- ZFS_PROP_SHARENFS : ZFS_PROP_MOUNTPOINT, property,
- sizeof (property), NULL, NULL, 0, B_FALSE) == 0);
+ ZFS_PROP_SHARENFS : ZFS_PROP_MOUNTPOINT, property,
+ sizeof (property), NULL, NULL, 0, B_FALSE) == 0);
if (op == OP_SHARE) {
if (strcmp(property, "off") == 0) {
@@ -2968,7 +2786,7 @@ unshare_unmount(int op, int argc, char **argv)
*/
if (argv[0][0] == '/')
return (unshare_unmount_path(op, argv[0],
- flags, B_FALSE));
+ flags, B_FALSE));
types = ZFS_TYPE_FILESYSTEM;
if (op == OP_SHARE)
diff --git a/usr/src/cmd/zpool/zpool_iter.c b/usr/src/cmd/zpool/zpool_iter.c
index 0dd25ff611..de25d85729 100644
--- a/usr/src/cmd/zpool/zpool_iter.c
+++ b/usr/src/cmd/zpool/zpool_iter.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -84,6 +84,7 @@ add_pool(zpool_handle_t *zhp, void *data)
} else {
zpool_close(zhp);
free(node);
+ return (-1);
}
return (0);
@@ -96,7 +97,7 @@ add_pool(zpool_handle_t *zhp, void *data)
* line.
*/
zpool_list_t *
-pool_list_get(int argc, char **argv, int *err)
+pool_list_get(int argc, char **argv, zpool_proplist_t **proplist, int *err)
{
zpool_list_t *zlp;
@@ -121,9 +122,12 @@ pool_list_get(int argc, char **argv, int *err)
for (i = 0; i < argc; i++) {
zpool_handle_t *zhp;
- if ((zhp = zpool_open_canfail(g_zfs, argv[i])) != NULL)
- (void) add_pool(zhp, zlp);
- else
+ if ((zhp = zpool_open_canfail(g_zfs,
+ argv[i])) != NULL && add_pool(zhp, zlp) == 0) {
+ if (proplist &&
+ zpool_expand_proplist(zhp, proplist) != 0)
+ *err = B_TRUE;
+ } else
*err = B_TRUE;
}
}
@@ -222,13 +226,13 @@ pool_list_count(zpool_list_t *zlp)
* using the pool_list_* interfaces.
*/
int
-for_each_pool(int argc, char **argv, boolean_t unavail, zpool_iter_f func,
- void *data)
+for_each_pool(int argc, char **argv, boolean_t unavail,
+ zpool_proplist_t **proplist, zpool_iter_f func, void *data)
{
zpool_list_t *list;
int ret = 0;
- if ((list = pool_list_get(argc, argv, &ret)) == NULL)
+ if ((list = pool_list_get(argc, argv, proplist, &ret)) == NULL)
return (1);
if (pool_list_iter(list, unavail, func, data) != 0)
diff --git a/usr/src/cmd/zpool/zpool_main.c b/usr/src/cmd/zpool/zpool_main.c
index c98d525506..fd513373fa 100644
--- a/usr/src/cmd/zpool/zpool_main.c
+++ b/usr/src/cmd/zpool/zpool_main.c
@@ -41,6 +41,7 @@
#include <strings.h>
#include <unistd.h>
#include <priv.h>
+#include <sys/fs/zfs.h>
#include <sys/stat.h>
@@ -75,6 +76,9 @@ static int zpool_do_upgrade(int, char **);
static int zpool_do_history(int, char **);
+static int zpool_do_get(int, char **);
+static int zpool_do_set(int, char **);
+
/*
* These libumem hooks provide a reasonable set of defaults for the allocator's
* debugging facilities.
@@ -109,7 +113,9 @@ typedef enum {
HELP_REMOVE,
HELP_SCRUB,
HELP_STATUS,
- HELP_UPGRADE
+ HELP_UPGRADE,
+ HELP_GET,
+ HELP_SET
} zpool_help_t;
@@ -153,7 +159,9 @@ static zpool_command_t command_table[] = {
{ "export", zpool_do_export, HELP_EXPORT },
{ "upgrade", zpool_do_upgrade, HELP_UPGRADE },
{ NULL },
- { "history", zpool_do_history, HELP_HISTORY }
+ { "history", zpool_do_history, HELP_HISTORY },
+ { "get", zpool_do_get, HELP_GET },
+ { "set", zpool_do_set, HELP_SET },
};
#define NCOMMAND (sizeof (command_table) / sizeof (command_table[0]))
@@ -209,6 +217,11 @@ get_usage(zpool_help_t idx) {
return (gettext("\tupgrade\n"
"\tupgrade -v\n"
"\tupgrade <-a | pool>\n"));
+ case HELP_GET:
+ return (gettext("\tget <all | property[,property]...> "
+ "<pool> ...\n"));
+ case HELP_SET:
+ return (gettext("\tset <property=value> <pool> \n"));
}
abort();
@@ -261,6 +274,24 @@ static char *column_subopts[] = {
};
/*
+ * Callback routine that will print out a pool property value.
+ */
+static zpool_prop_t
+print_prop_cb(zpool_prop_t prop, void *cb)
+{
+ FILE *fp = cb;
+
+ (void) fprintf(fp, "\t%-13s ", zpool_prop_to_name(prop));
+
+ if (zpool_prop_values(prop) == NULL)
+ (void) fprintf(fp, "-\n");
+ else
+ (void) fprintf(fp, "%s\n", zpool_prop_values(prop));
+
+ return (ZFS_PROP_CONT);
+}
+
+/*
* Display usage message. If we're inside a command, display only the usage for
* that command. Otherwise, iterate over the entire command table and display
* a complete usage message.
@@ -298,6 +329,20 @@ usage(boolean_t requested)
}
}
+ if (current_command != NULL &&
+ ((strcmp(current_command->name, "set") == 0) ||
+ (strcmp(current_command->name, "get") == 0))) {
+
+ (void) fprintf(fp,
+ gettext("\nthe following properties are supported:\n"));
+
+ (void) fprintf(fp, "\n\t%-13s %s\n\n",
+ "PROPERTY", "VALUES");
+
+ /* Iterate over all properties */
+ (void) zpool_prop_iter(print_prop_cb, fp, B_FALSE);
+ }
+
/*
* See comments at end of main().
*/
@@ -520,7 +565,7 @@ zpool_do_remove(int argc, char **argv)
* -m Set default mountpoint for the root dataset. By default it's
* '/<pool>'
*
- * Creates the the named pool according to the given vdev specification. The
+ * Creates the named pool according to the given vdev specification. The
* bulk of the vdev processing is done in get_vdev_spec() in zpool_vdev.c. Once
* we get the nvlist back from get_vdev_spec(), we either print out the contents
* (if '-n' was specified), or pass it to libzfs to do the creation.
@@ -787,7 +832,7 @@ zpool_do_destroy(int argc, char **argv)
*
* -f Forcefully unmount datasets
*
- * Export the the given pools. By default, the command will attempt to cleanly
+ * Export the given pools. By default, the command will attempt to cleanly
* unmount any active datasets within the pool. If the '-f' flag is specified,
* then the datasets will be forcefully unmounted.
*/
@@ -994,7 +1039,7 @@ show_import(nvlist_t *config)
(void) printf(gettext(" id: %llu\n"), (u_longlong_t)guid);
(void) printf(gettext(" state: %s"), health);
if (pool_state == POOL_STATE_DESTROYED)
- (void) printf(gettext(" (DESTROYED)"));
+ (void) printf(gettext(" (DESTROYED)"));
(void) printf("\n");
switch (reason) {
@@ -1705,7 +1750,7 @@ zpool_do_iostat(int argc, char **argv)
* Construct the list of all interesting pools.
*/
ret = 0;
- if ((list = pool_list_get(argc, argv, &ret)) == NULL)
+ if ((list = pool_list_get(argc, argv, NULL, &ret)) == NULL)
return (1);
if (pool_list_count(list) == 0 && argc != 0) {
@@ -2001,7 +2046,7 @@ zpool_do_list(int argc, char **argv)
cb.cb_first = B_TRUE;
- ret = for_each_pool(argc, argv, B_TRUE, list_callback, &cb);
+ ret = for_each_pool(argc, argv, B_TRUE, NULL, list_callback, &cb);
if (argc == 0 && cb.cb_first) {
(void) printf(gettext("no pools available\n"));
@@ -2456,7 +2501,7 @@ zpool_do_scrub(int argc, char **argv)
usage(B_FALSE);
}
- return (for_each_pool(argc, argv, B_TRUE, scrub_callback, &cb));
+ return (for_each_pool(argc, argv, B_TRUE, NULL, scrub_callback, &cb));
}
typedef struct status_cbdata {
@@ -2820,7 +2865,7 @@ status_callback(zpool_handle_t *zhp, void *data)
case ZPOOL_STATUS_CORRUPT_LABEL_NR:
(void) printf(gettext("status: One or more devices could not "
- "be used because the the label is missing \n\tor invalid. "
+ "be used because the label is missing \n\tor invalid. "
"There are insufficient replicas for the pool to "
"continue\n\tfunctioning.\n"));
(void) printf(gettext("action: Destroy and re-create the pool "
@@ -3006,7 +3051,7 @@ zpool_do_status(int argc, char **argv)
if (argc == 0)
cb.cb_allpools = B_TRUE;
- ret = for_each_pool(argc, argv, B_TRUE, status_callback, &cb);
+ ret = for_each_pool(argc, argv, B_TRUE, NULL, status_callback, &cb);
if (argc == 0 && cb.cb_count == 0)
(void) printf(gettext("no pools available\n"));
@@ -3183,6 +3228,7 @@ zpool_do_upgrade(int argc, char **argv)
(void) printf(gettext(" 4 zpool history\n"));
(void) printf(gettext(" 5 Compression using the gzip "
"algorithm\n"));
+ (void) printf(gettext(" 6 bootfs pool property "));
(void) printf(gettext("\nFor more information on a particular "
"version, including supported releases, see:\n\n"));
(void) printf("http://www.opensolaris.org/os/community/zfs/"
@@ -3216,7 +3262,8 @@ zpool_do_upgrade(int argc, char **argv)
"their associated\nfeatures.\n"));
}
} else {
- ret = for_each_pool(argc, argv, B_FALSE, upgrade_one, &cb);
+ ret = for_each_pool(argc, argv, B_FALSE, NULL,
+ upgrade_one, &cb);
}
return (ret);
@@ -3278,7 +3325,8 @@ zpool_do_history(int argc, char **argv)
argc -= optind;
argv += optind;
- ret = for_each_pool(argc, argv, B_FALSE, get_history_one, &first);
+ ret = for_each_pool(argc, argv, B_FALSE, NULL, get_history_one,
+ &first);
if (argc == 0 && first == B_TRUE) {
(void) printf(gettext("no pools available\n"));
@@ -3288,12 +3336,165 @@ zpool_do_history(int argc, char **argv)
return (ret);
}
+static int
+get_callback(zpool_handle_t *zhp, void *data)
+{
+ libzfs_get_cbdata_t *cbp = (libzfs_get_cbdata_t *)data;
+ char value[MAXNAMELEN];
+ zfs_source_t srctype;
+ zpool_proplist_t *pl;
+
+ for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
+
+ /*
+ * Skip the special fake placeholder.
+ */
+ if (pl->pl_prop == ZFS_PROP_NAME &&
+ pl == cbp->cb_proplist)
+ continue;
+
+ if (zpool_get_prop(zhp, pl->pl_prop,
+ value, sizeof (value), &srctype) != 0)
+ continue;
+
+ libzfs_print_one_property(zpool_get_name(zhp), cbp,
+ zpool_prop_to_name(pl->pl_prop), value, srctype, NULL);
+ }
+ return (0);
+}
+
+int
+zpool_do_get(int argc, char **argv)
+{
+ libzfs_get_cbdata_t cb = { 0 };
+ zpool_proplist_t fake_name = { 0 };
+ int ret;
+
+ if (argc < 3)
+ usage(B_FALSE);
+
+ cb.cb_first = B_TRUE;
+ cb.cb_sources = ZFS_SRC_ALL;
+ cb.cb_columns[0] = GET_COL_NAME;
+ cb.cb_columns[1] = GET_COL_PROPERTY;
+ cb.cb_columns[2] = GET_COL_VALUE;
+ cb.cb_columns[3] = GET_COL_SOURCE;
+
+ if (zpool_get_proplist(g_zfs, argv[1], &cb.cb_proplist) != 0)
+ usage(B_FALSE);
+
+ if (cb.cb_proplist != NULL) {
+ fake_name.pl_prop = ZFS_PROP_NAME;
+ fake_name.pl_width = strlen(gettext("NAME"));
+ fake_name.pl_next = cb.cb_proplist;
+ cb.cb_proplist = &fake_name;
+ }
+
+ ret = for_each_pool(argc - 2, argv + 2, B_TRUE, &cb.cb_proplist,
+ get_callback, &cb);
+
+ if (cb.cb_proplist == &fake_name)
+ zfs_free_proplist(fake_name.pl_next);
+ else
+ zfs_free_proplist(cb.cb_proplist);
+
+ return (ret);
+}
+
+typedef struct set_cbdata {
+ char *cb_propname;
+ char *cb_value;
+ boolean_t cb_any_successful;
+} set_cbdata_t;
+
+int
+set_callback(zpool_handle_t *zhp, void *data)
+{
+ int error;
+ set_cbdata_t *cb = (set_cbdata_t *)data;
+
+ error = zpool_set_prop(zhp, cb->cb_propname, cb->cb_value);
+
+ if (!error)
+ cb->cb_any_successful = B_TRUE;
+
+ return (error);
+}
+
+int
+zpool_do_set(int argc, char **argv)
+{
+ set_cbdata_t cb = { 0 };
+ int error;
+
+ if (argc > 1 && argv[1][0] == '-') {
+ (void) fprintf(stderr, gettext("invalid option '%c'\n"),
+ argv[1][1]);
+ usage(B_FALSE);
+ }
+
+ if (argc < 2) {
+ (void) fprintf(stderr, gettext("missing property=value "
+ "argument\n"));
+ usage(B_FALSE);
+ }
+
+ if (argc < 3) {
+ (void) fprintf(stderr, gettext("missing pool name\n"));
+ usage(B_FALSE);
+ }
+
+ if (argc > 3) {
+ (void) fprintf(stderr, gettext("too many pool names\n"));
+ usage(B_FALSE);
+ }
+
+ cb.cb_propname = argv[1];
+ cb.cb_value = strchr(cb.cb_propname, '=');
+ if (cb.cb_value == NULL) {
+ (void) fprintf(stderr, gettext("missing value in "
+ "property=value argument\n"));
+ usage(B_FALSE);
+ }
+
+ *(cb.cb_value) = '\0';
+ cb.cb_value++;
+
+ error = for_each_pool(argc - 2, argv + 2, B_TRUE, NULL,
+ set_callback, &cb);
+
+ if (cb.cb_any_successful) {
+ *(cb.cb_value - 1) = '=';
+ zpool_log_history(g_zfs, argc, argv, argv[2], B_FALSE, B_FALSE);
+ }
+
+ return (error);
+}
+
+static int
+find_command_idx(char *command, int *idx)
+{
+ int i;
+
+ for (i = 0; i < NCOMMAND; i++) {
+ if (command_table[i].name == NULL)
+ continue;
+
+ if (strcmp(command, command_table[i].name) == 0) {
+ *idx = i;
+ return (0);
+ }
+ }
+ return (1);
+}
+
int
main(int argc, char **argv)
{
int ret;
int i;
char *cmdname;
+ int found = 0;
(void) setlocale(LC_ALL, "");
(void) textdomain(TEXT_DOMAIN);
@@ -3327,15 +3528,10 @@ main(int argc, char **argv)
/*
* Run the appropriate command.
*/
- for (i = 0; i < NCOMMAND; i++) {
- if (command_table[i].name == NULL)
- continue;
-
- if (strcmp(cmdname, command_table[i].name) == 0) {
- current_command = &command_table[i];
- ret = command_table[i].func(argc - 1, argv + 1);
- break;
- }
+ if (find_command_idx(cmdname, &i) == 0) {
+ current_command = &command_table[i];
+ ret = command_table[i].func(argc - 1, argv + 1);
+ found++;
}
/*
@@ -3348,7 +3544,7 @@ main(int argc, char **argv)
return (!!ioctl(fd, ZFS_IOC_POOL_FREEZE, buf));
}
- if (i == NCOMMAND) {
+ if (!found) {
(void) fprintf(stderr, gettext("unrecognized "
"command '%s'\n"), cmdname);
usage(B_FALSE);
diff --git a/usr/src/cmd/zpool/zpool_util.h b/usr/src/cmd/zpool/zpool_util.h
index 4a10810bfb..cb05bda3e9 100644
--- a/usr/src/cmd/zpool/zpool_util.h
+++ b/usr/src/cmd/zpool/zpool_util.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -51,11 +51,12 @@ nvlist_t *make_root_vdev(nvlist_t *poolconfig, int force, int check_rep,
/*
* Pool list functions
*/
-int for_each_pool(int, char **, boolean_t unavail, zpool_iter_f, void *);
+int for_each_pool(int, char **, boolean_t unavail, zpool_proplist_t **,
+ zpool_iter_f, void *);
typedef struct zpool_list zpool_list_t;
-zpool_list_t *pool_list_get(int, char **, int *);
+zpool_list_t *pool_list_get(int, char **, zpool_proplist_t **, int *);
void pool_list_update(zpool_list_t *);
int pool_list_iter(zpool_list_t *, int unavail, zpool_iter_f, void *);
void pool_list_free(zpool_list_t *);
diff --git a/usr/src/common/zfs/zfs_prop.c b/usr/src/common/zfs/zfs_prop.c
index 229a9bc97b..d4029d15d4 100644
--- a/usr/src/common/zfs/zfs_prop.c
+++ b/usr/src/common/zfs/zfs_prop.c
@@ -179,10 +179,67 @@ static prop_desc_t zfs_prop_table[] = {
{ "copies", prop_type_index, 1, "1", prop_inherit,
ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
"1 | 2 | 3", "COPIES", B_TRUE, B_TRUE },
+ { "bootfs", prop_type_string, 0, NULL, prop_default,
+ ZFS_TYPE_POOL, "<filesystem>", "BOOTFS", B_FALSE, B_TRUE },
};
#define ZFS_PROP_COUNT ((sizeof (zfs_prop_table))/(sizeof (prop_desc_t)))
+/*
+ * Returns TRUE if the property applies to the given dataset types.
+ */
+int
+zfs_prop_valid_for_type(zfs_prop_t prop, int types)
+{
+ return ((zfs_prop_table[prop].pd_types & types) != 0);
+}
+
+/*
+ * Determine if the specified property is visible or not.
+ */
+boolean_t
+zfs_prop_is_visible(zfs_prop_t prop)
+{
+ if (prop < 0)
+ return (B_FALSE);
+
+ return (zfs_prop_table[prop].pd_visible);
+}
+
+/*
+ * Iterate over all properties, calling back into the specified function
+ * for each property. We will continue to iterate until we either
+ * reach the end or the callback function something other than
+ * ZFS_PROP_CONT.
+ */
+zfs_prop_t
+zfs_prop_iter_common(zfs_prop_f func, void *cb, zfs_type_t type,
+ boolean_t show_all)
+{
+ int i;
+
+ for (i = 0; i < ZFS_PROP_COUNT; i++) {
+ if (zfs_prop_valid_for_type(i, type) &&
+ (zfs_prop_is_visible(i) || show_all)) {
+ if (func(i, cb) != ZFS_PROP_CONT)
+ return (i);
+ }
+ }
+ return (ZFS_PROP_CONT);
+}
+
+zfs_prop_t
+zfs_prop_iter(zfs_prop_f func, void *cb, boolean_t show_all)
+{
+ return (zfs_prop_iter_common(func, cb, ZFS_TYPE_ANY, show_all));
+}
+
+zpool_prop_t
+zpool_prop_iter(zpool_prop_f func, void *cb, boolean_t show_all)
+{
+ return (zfs_prop_iter_common(func, cb, ZFS_TYPE_POOL, show_all));
+}
+
zfs_proptype_t
zfs_prop_get_type(zfs_prop_t prop)
{
@@ -233,18 +290,37 @@ zfs_name_to_prop_cb(zfs_prop_t prop, void *cb_data)
}
/*
- * Given a property name, returns the corresponding property ID.
+ * Given a property name and its type, returns the corresponding property ID.
*/
zfs_prop_t
-zfs_name_to_prop(const char *propname)
+zfs_name_to_prop_common(const char *propname, zfs_type_t type)
{
zfs_prop_t prop;
- prop = zfs_prop_iter(zfs_name_to_prop_cb, (void *)propname, B_TRUE);
+ prop = zfs_prop_iter_common(zfs_name_to_prop_cb, (void *)propname,
+ type, B_TRUE);
return (prop == ZFS_PROP_CONT ? ZFS_PROP_INVAL : prop);
}
/*
+ * Given a zfs dataset property name, returns the corresponding property ID.
+ */
+zfs_prop_t
+zfs_name_to_prop(const char *propname)
+{
+ return (zfs_name_to_prop_common(propname, ZFS_TYPE_ANY));
+}
+
+/*
+ * Given a pool property name, returns the corresponding property ID.
+ */
+zpool_prop_t
+zpool_name_to_prop(const char *propname)
+{
+ return (zfs_name_to_prop_common(propname, ZFS_TYPE_POOL));
+}
+
+/*
* For user property names, we allow all lowercase alphanumeric characters, plus
* a few useful punctuation characters.
*/
@@ -305,7 +381,8 @@ zfs_prop_readonly(zfs_prop_t prop)
}
/*
- * Given a property ID, returns the corresponding name.
+ * Given a dataset property ID, returns the corresponding name.
+ * Assuming the zfs dataset propety ID is valid.
*/
const char *
zfs_prop_to_name(zfs_prop_t prop)
@@ -314,6 +391,16 @@ zfs_prop_to_name(zfs_prop_t prop)
}
/*
+ * Given a pool property ID, returns the corresponding name.
+ * Assuming the pool propety ID is valid.
+ */
+const char *
+zpool_prop_to_name(zpool_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_name);
+}
+
+/*
* Returns TRUE if the property is inheritable.
*/
int
@@ -445,56 +532,31 @@ zfs_prop_index_to_string(zfs_prop_t prop, uint64_t index, const char **string)
return (-1);
}
-/*
- * Determine if the specified property is visible or not.
- */
-boolean_t
-zfs_prop_is_visible(zfs_prop_t prop)
-{
- if (prop < 0)
- return (B_FALSE);
-
- return (zfs_prop_table[prop].pd_visible);
-}
-
-/*
- * Iterate over all properties, calling back into the specified function
- * for each property. We will continue to iterate until we either
- * reach the end or the callback function something other than
- * ZFS_PROP_CONT.
- */
-zfs_prop_t
-zfs_prop_iter(zfs_prop_f func, void *cb, boolean_t show_all)
-{
- int i;
-
- for (i = 0; i < ZFS_PROP_COUNT; i++) {
- if (zfs_prop_is_visible(i) || show_all) {
- if (func(i, cb) != ZFS_PROP_CONT)
- return (i);
- }
- }
- return (ZFS_PROP_CONT);
-}
-
#ifndef _KERNEL
/*
- * Returns TRUE if the property applies to the given dataset types.
+ * Returns a string describing the set of acceptable values for the given
+ * zfs property, or NULL if it cannot be set.
*/
-int
-zfs_prop_valid_for_type(zfs_prop_t prop, int types)
+const char *
+zfs_prop_values(zfs_prop_t prop)
{
- return ((zfs_prop_table[prop].pd_types & types) != 0);
+ if (zfs_prop_table[prop].pd_types == ZFS_TYPE_POOL)
+ return (NULL);
+
+ return (zfs_prop_table[prop].pd_values);
}
/*
* Returns a string describing the set of acceptable values for the given
- * property, or NULL if it cannot be set.
+ * zpool property, or NULL if it cannot be set.
*/
const char *
-zfs_prop_values(zfs_prop_t prop)
+zpool_prop_values(zfs_prop_t prop)
{
+ if (zfs_prop_table[prop].pd_types != ZFS_TYPE_POOL)
+ return (NULL);
+
return (zfs_prop_table[prop].pd_values);
}
diff --git a/usr/src/grub/grub-0.95/AUTHORS b/usr/src/grub/grub-0.95/AUTHORS
index e605f03830..e319d15ef6 100644
--- a/usr/src/grub/grub-0.95/AUTHORS
+++ b/usr/src/grub/grub-0.95/AUTHORS
@@ -1,3 +1,8 @@
+
+ZFS support added by Sun Microsystems.
+Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+Use is subject to license terms.
+
VaX#n8 (real name unknown) wrote shared_src/fsys_ext2fs.c.
Heiko Schroeder rewrote shared_src/stage1.S to be more readable.
diff --git a/usr/src/grub/grub-0.95/configure b/usr/src/grub/grub-0.95/configure
index b2d999ce93..9aa2aa97ec 100755
--- a/usr/src/grub/grub-0.95/configure
+++ b/usr/src/grub/grub-0.95/configure
@@ -867,6 +867,7 @@ Optional Features:
--disable-vstafs disable VSTa FS support in Stage 2
--disable-jfs disable IBM JFS support in Stage 2
--disable-xfs disable SGI XFS support in Stage 2
+ --disable-zfs disable ZFS support in Stage 2
--disable-iso9660 disable ISO9660 support in Stage 2
--disable-gunzip disable decompression in Stage 2
--disable-md5-password disable MD5 password support in Stage 2
@@ -5495,6 +5496,16 @@ if test x"$enable_xfs" != xno; then
FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_XFS=1"
fi
+# Check whether --enable-zfs or --disable-zfs was given.
+if test "${enable_zfs+set}" = set; then
+ enableval="$enable_zfs"
+
+fi;
+
+if test x"$enable_zfs" != xno; then
+ FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_ZFS=1"
+fi
+
# Check whether --enable-iso9660 or --disable-iso9660 was given.
if test "${enable_iso9660+set}" = set; then
enableval="$enable_iso9660"
diff --git a/usr/src/grub/grub-0.95/configure.ac b/usr/src/grub/grub-0.95/configure.ac
index 78a312916f..2a5e69faa8 100644
--- a/usr/src/grub/grub-0.95/configure.ac
+++ b/usr/src/grub/grub-0.95/configure.ac
@@ -291,6 +291,13 @@ if test x"$enable_xfs" != xno; then
FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_XFS=1"
fi
+AC_ARG_ENABLE(zfs,
+ [ --disable-zfs disable ZFS support in Stage 2])
+
+if test x"$enable_zfs" != xno; then
+ FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_ZFS=1"
+fi
+
AC_ARG_ENABLE(iso9660,
[ --disable-iso9660 disable ISO9660 support in Stage 2])
diff --git a/usr/src/grub/grub-0.95/grub/Makefile.am b/usr/src/grub/grub-0.95/grub/Makefile.am
index 39a1048856..efd0746052 100644
--- a/usr/src/grub/grub-0.95/grub/Makefile.am
+++ b/usr/src/grub/grub-0.95/grub/Makefile.am
@@ -8,7 +8,7 @@ endif
AM_CPPFLAGS = -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
- -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
+ -DFSYS_ZFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
-DUSE_MD5_PASSWORDS=1 -DSUPPORT_HERCULES=1 \
$(SERIAL_FLAGS) -I$(top_srcdir)/stage2 \
-I$(top_srcdir)/stage1 -I$(top_srcdir)/lib
diff --git a/usr/src/grub/grub-0.95/grub/Makefile.in b/usr/src/grub/grub-0.95/grub/Makefile.in
index 86a1651f46..6e0f02362e 100644
--- a/usr/src/grub/grub-0.95/grub/Makefile.in
+++ b/usr/src/grub/grub-0.95/grub/Makefile.in
@@ -180,7 +180,7 @@ target_alias = @target_alias@
@SERIAL_SPEED_SIMULATION_TRUE@SERIAL_FLAGS = -DSUPPORT_SERIAL=1 -DSIMULATE_SLOWNESS_OF_SERIAL=1
AM_CPPFLAGS = -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
- -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
+ -DFSYS_ZFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
-DUSE_MD5_PASSWORDS=1 -DSUPPORT_HERCULES=1 \
$(SERIAL_FLAGS) -I$(top_srcdir)/stage2 \
-I$(top_srcdir)/stage1 -I$(top_srcdir)/lib
diff --git a/usr/src/grub/grub-0.95/grub/Makefile.solaris b/usr/src/grub/grub-0.95/grub/Makefile.solaris
index 6d8a0439e4..b81cf7b374 100644
--- a/usr/src/grub/grub-0.95/grub/Makefile.solaris
+++ b/usr/src/grub/grub-0.95/grub/Makefile.solaris
@@ -19,7 +19,7 @@ CFLAGS += -O2
LINKFLAGS += -O2
CPPFLAGS += -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 \
- -DFSYS_REISERFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 \
+ -DFSYS_REISERFS=1 -DFSYS_ZFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 \
-DFSYS_XFS=1 -DUSE_MD5_PASSWORDS=1 -DSUPPORT_HERCULES=1 \
-DSUPPORT_SERIAL=1
diff --git a/usr/src/grub/grub-0.95/grub/asmstub.c b/usr/src/grub/grub-0.95/grub/asmstub.c
index b7edddd52f..0fb8964bab 100644
--- a/usr/src/grub/grub-0.95/grub/asmstub.c
+++ b/usr/src/grub/grub-0.95/grub/asmstub.c
@@ -64,7 +64,7 @@ int grub_stage2 (void);
#include <term.h>
/* Simulated memory sizes. */
-#define EXTENDED_MEMSIZE (3 * 1024 * 1024) /* 3MB */
+#define EXTENDED_MEMSIZE (64 * 1024 * 1024) /* 64MB */
#define CONVENTIONAL_MEMSIZE (640 * 1024) /* 640kB */
unsigned long install_partition = 0x20000;
diff --git a/usr/src/grub/grub-0.95/stage2/Makefile.am b/usr/src/grub/grub-0.95/stage2/Makefile.am
index c351e7d906..457ab4e568 100644
--- a/usr/src/grub/grub-0.95/stage2/Makefile.am
+++ b/usr/src/grub/grub-0.95/stage2/Makefile.am
@@ -7,7 +7,8 @@ noinst_HEADERS = apic.h defs.h dir.h disk_inode.h disk_inode_ffs.h \
fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
- terminfo.h tparm.h nbi.h ufs.h ufs2.h vstafs.h xfs.h graphics.h
+ terminfo.h tparm.h nbi.h ufs.h ufs2.h vstafs.h xfs.h graphics.h \
+ fsys_zfs.h
EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
# For <stage1.h>.
@@ -18,12 +19,13 @@ noinst_LIBRARIES = libgrub.a
libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs.c fsys_ufs2.c \
+ fsys_zfs.c zfs_fletcher.c zfs_lzjb.c zfs_sha256.c \
fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
terminfo.c tparm.c graphics.c
libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
-DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
- -DFSYS_UFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
+ -DFSYS_UFS=1 -DFSYS_UFS2=1 -DFSYS_ZFS=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
-DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \
-fwritable-strings
@@ -35,26 +37,27 @@ EXTRA_PROGRAMS = nbloader.exec pxeloader.exec diskless.exec
if DISKLESS_SUPPORT
pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
- reiserfs_stage1_5 ufs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 \
+ reiserfs_stage1_5 ufs_stage1_5 ufs2_stage1_5 zfs_stage1_5 vstafs_stage1_5 \
xfs_stage1_5 nbgrub pxegrub
noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
reiserfs_stage1_5.exec ufs_stage1_5.exec ufs2_stage1_5.exec \
+ zfs_stage1_5.exec \
vstafs_stage1_5.exec xfs_stage1_5.exec \
nbloader.exec pxeloader.exec diskless.exec
else
pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
- reiserfs_stage1_5 ufs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 \
+ reiserfs_stage1_5 ufs_stage1_5 ufs2_stage1_5 zfs_stage1_5 vstafs_stage1_5 \
xfs_stage1_5
noinst_DATA = pre_stage2 start start_eltorito
noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
e2fs_stage1_5.exec fat_stage1_5.exec ffs_stage1_5.exec \
iso9660_stage1_5.exec jfs_stage1_5.exec minix_stage1_5.exec \
reiserfs_stage1_5.exec ufs_stage1_5.exec ufs2_stage1_5.exec \
- vstafs_stage1_5.exec xfs_stage1_5.exec
+ zfs_stage1_5.exec vstafs_stage1_5.exec xfs_stage1_5.exec
endif
MOSTLYCLEANFILES = $(noinst_PROGRAMS)
@@ -99,6 +102,7 @@ pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
fsys_reiserfs.c fsys_ufs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c \
+ fsys_zfs.c zfs_fletcher.c zfs_lzjb.c zfs_sha256.c \
gunzip.c hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c \
tparm.c graphics.c
pre_stage2_exec_CFLAGS = $(STAGE2_COMPILE) $(FSYS_CFLAGS)
@@ -191,6 +195,15 @@ ufs2_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_UFS2=1 \
-DNO_BLOCK_FILES=1
ufs2_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+# For zfs_stage1_5 target.
+zfs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
+ stage1_5.c fsys_zfs.c zfs_fletcher.c zfs_lzjb.c zfs_sha256.c bios.c
+zfs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ZFS=1 \
+ -DNO_BLOCK_FILES=1
+zfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ZFS=1 \
+ -DNO_BLOCK_FILES=1
+zfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+
# For minix_stage1_5 target.
minix_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
stage1_5.c fsys_minix.c bios.c
diff --git a/usr/src/grub/grub-0.95/stage2/Makefile.in b/usr/src/grub/grub-0.95/stage2/Makefile.in
index b3e94e39a4..ea5482675e 100644
--- a/usr/src/grub/grub-0.95/stage2/Makefile.in
+++ b/usr/src/grub/grub-0.95/stage2/Makefile.in
@@ -18,7 +18,7 @@
-SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) $(e2fs_stage1_5_exec_SOURCES) $(fat_stage1_5_exec_SOURCES) $(ffs_stage1_5_exec_SOURCES) $(iso9660_stage1_5_exec_SOURCES) $(jfs_stage1_5_exec_SOURCES) $(minix_stage1_5_exec_SOURCES) $(nbloader_exec_SOURCES) $(pre_stage2_exec_SOURCES) $(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) $(start_exec_SOURCES) $(start_eltorito_exec_SOURCES) $(ufs2_stage1_5_exec_SOURCES) $(ufs_stage1_5_exec_SOURCES) $(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
+SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) $(e2fs_stage1_5_exec_SOURCES) $(fat_stage1_5_exec_SOURCES) $(ffs_stage1_5_exec_SOURCES) $(iso9660_stage1_5_exec_SOURCES) $(jfs_stage1_5_exec_SOURCES) $(minix_stage1_5_exec_SOURCES) $(nbloader_exec_SOURCES) $(pre_stage2_exec_SOURCES) $(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) $(start_exec_SOURCES) $(start_eltorito_exec_SOURCES) $(ufs2_stage1_5_exec_SOURCES) $(zfs_stage1_5_exec_SOURCE) $(ufs_stage1_5_exec_SOURCES) $(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
@@ -54,6 +54,7 @@ EXTRA_PROGRAMS = nbloader.exec$(EXEEXT) pxeloader.exec$(EXEEXT) \
@DISKLESS_SUPPORT_FALSE@ reiserfs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_FALSE@ ufs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_FALSE@ ufs2_stage1_5.exec$(EXEEXT) \
+@DISKLESS_SUPPORT_FALSE@ zfs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_FALSE@ vstafs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_FALSE@ xfs_stage1_5.exec$(EXEEXT)
@DISKLESS_SUPPORT_TRUE@noinst_PROGRAMS = pre_stage2.exec$(EXEEXT) \
@@ -68,6 +69,7 @@ EXTRA_PROGRAMS = nbloader.exec$(EXEEXT) pxeloader.exec$(EXEEXT) \
@DISKLESS_SUPPORT_TRUE@ reiserfs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_TRUE@ ufs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_TRUE@ ufs2_stage1_5.exec$(EXEEXT) \
+@DISKLESS_SUPPORT_TRUE@ zfs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_TRUE@ vstafs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_TRUE@ xfs_stage1_5.exec$(EXEEXT) \
@DISKLESS_SUPPORT_TRUE@ nbloader.exec$(EXEEXT) \
@@ -97,6 +99,10 @@ am_libgrub_a_OBJECTS = libgrub_a-boot.$(OBJEXT) \
libgrub_a-fsys_iso9660.$(OBJEXT) libgrub_a-fsys_jfs.$(OBJEXT) \
libgrub_a-fsys_minix.$(OBJEXT) \
libgrub_a-fsys_reiserfs.$(OBJEXT) libgrub_a-fsys_ufs.$(OBJEXT) \
+ libgrub_a-zfs_sha256.$(OBJEXT) \
+ libgrub_a-zfs_lzjb.$(OBJEXT) \
+ libgrub_a-zfs_fletcher.$(OBJEXT) \
+ libgrub_a-fsys_zfs.$(OBJEXT) \
libgrub_a-fsys_ufs2.$(OBJEXT) libgrub_a-fsys_vstafs.$(OBJEXT) \
libgrub_a-fsys_xfs.$(OBJEXT) libgrub_a-gunzip.$(OBJEXT) \
libgrub_a-md5.$(OBJEXT) libgrub_a-serial.$(OBJEXT) \
@@ -118,6 +124,10 @@ am__objects_1 = diskless_exec-asm.$(OBJEXT) \
diskless_exec-fsys_jfs.$(OBJEXT) \
diskless_exec-fsys_minix.$(OBJEXT) \
diskless_exec-fsys_reiserfs.$(OBJEXT) \
+ diskless_exec-zfs_sha256.$(OBJEXT) \
+ diskless_exec-zfs_lzjb.$(OBJEXT) \
+ diskless_exec-zfs_fletcher.$(OBJEXT) \
+ diskless_exec-fsys_zfs.$(OBJEXT) \
diskless_exec-fsys_ufs.$(OBJEXT) \
diskless_exec-fsys_ufs2.$(OBJEXT) \
diskless_exec-fsys_vstafs.$(OBJEXT) \
@@ -211,6 +221,10 @@ am_pre_stage2_exec_OBJECTS = pre_stage2_exec-asm.$(OBJEXT) \
pre_stage2_exec-fsys_jfs.$(OBJEXT) \
pre_stage2_exec-fsys_minix.$(OBJEXT) \
pre_stage2_exec-fsys_reiserfs.$(OBJEXT) \
+ pre_stage2_exec-zfs_sha256.$(OBJEXT) \
+ pre_stage2_exec-zfs_lzjb.$(OBJEXT) \
+ pre_stage2_exec-zfs_fletcher.$(OBJEXT) \
+ pre_stage2_exec-fsys_zfs.$(OBJEXT) \
pre_stage2_exec-fsys_ufs.$(OBJEXT) \
pre_stage2_exec-fsys_ufs2.$(OBJEXT) \
pre_stage2_exec-fsys_vstafs.$(OBJEXT) \
@@ -267,6 +281,19 @@ am_ufs_stage1_5_exec_OBJECTS = ufs_stage1_5_exec-start.$(OBJEXT) \
ufs_stage1_5_exec-bios.$(OBJEXT)
ufs_stage1_5_exec_OBJECTS = $(am_ufs_stage1_5_exec_OBJECTS)
ufs_stage1_5_exec_LDADD = $(LDADD)
+am_zfs_stage1_5_exec_OBJECTS = zfs_stage1_5_exec-start.$(OBJEXT) \
+ zfs_stage1_5_exec-asm.$(OBJEXT) \
+ zfs_stage1_5_exec-common.$(OBJEXT) \
+ zfs_stage1_5_exec-char_io.$(OBJEXT) \
+ zfs_stage1_5_exec-disk_io.$(OBJEXT) \
+ zfs_stage1_5_exec-stage1_5.$(OBJEXT) \
+ zfs_stage1_5_exec-zfs_sha256.$(OBJEXT) \
+ zfs_stage1_5_exec-zfs_lzjb.$(OBJEXT) \
+ zfs_stage1_5_exec-zfs_fletcher.$(OBJEXT) \
+ zfs_stage1_5_exec-fsys_zfs.$(OBJEXT) \
+ zfs_stage1_5_exec-bios.$(OBJEXT)
+zfs_stage1_5_exec_OBJECTS = $(am_zfs_stage1_5_exec_OBJECTS)
+zfs_stage1_5_exec_LDADD = $(LDADD)
am_vstafs_stage1_5_exec_OBJECTS = \
vstafs_stage1_5_exec-start.$(OBJEXT) \
vstafs_stage1_5_exec-asm.$(OBJEXT) \
@@ -307,6 +334,10 @@ am__depfiles_maybe = depfiles
@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_jfs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_minix.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_reiserfs.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-zfs_sha256.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-zfs_lzjb.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-zfs_fletcher.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_zfs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_ufs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_ufs2.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/diskless_exec-fsys_vstafs.Po \
@@ -363,6 +394,10 @@ am__depfiles_maybe = depfiles
@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_jfs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_minix.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_reiserfs.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-zfs_sha256.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-zfs_lzjb.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-zfs_fletcher.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_zfs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_ufs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_ufs2.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/libgrub_a-fsys_vstafs.Po \
@@ -395,6 +430,10 @@ am__depfiles_maybe = depfiles
@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_jfs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_minix.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_reiserfs.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-zfs_sha256.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_zfs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_ufs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_ufs2.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/pre_stage2_exec-fsys_vstafs.Po \
@@ -426,6 +465,15 @@ am__depfiles_maybe = depfiles
@AMDEP_TRUE@ ./$(DEPDIR)/ufs_stage1_5_exec-disk_io.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/ufs_stage1_5_exec-fsys_ufs.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/ufs_stage1_5_exec-stage1_5.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-bios.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-char_io.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-common.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-disk_io.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/vstafs_stage1_5_exec-bios.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/vstafs_stage1_5_exec-char_io.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/vstafs_stage1_5_exec-common.Po \
@@ -451,6 +499,7 @@ SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) \
$(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) \
$(start_exec_SOURCES) $(start_eltorito_exec_SOURCES) \
$(ufs2_stage1_5_exec_SOURCES) $(ufs_stage1_5_exec_SOURCES) \
+ $(zfs_stage1_5_exec_SOURCES) \
$(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
DIST_SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) \
$(e2fs_stage1_5_exec_SOURCES) $(fat_stage1_5_exec_SOURCES) \
@@ -460,6 +509,7 @@ DIST_SOURCES = $(libgrub_a_SOURCES) $(diskless_exec_SOURCES) \
$(pxeloader_exec_SOURCES) $(reiserfs_stage1_5_exec_SOURCES) \
$(start_exec_SOURCES) $(start_eltorito_exec_SOURCES) \
$(ufs2_stage1_5_exec_SOURCES) $(ufs_stage1_5_exec_SOURCES) \
+ $(zfs_stage1_5_exec_SOURCES) \
$(vstafs_stage1_5_exec_SOURCES) $(xfs_stage1_5_exec_SOURCES)
am__installdirs = "$(DESTDIR)$(pkglibdir)"
pkglibDATA_INSTALL = $(INSTALL_DATA)
@@ -590,7 +640,7 @@ noinst_HEADERS = apic.h defs.h dir.h disk_inode.h disk_inode_ffs.h \
fat.h filesys.h freebsd.h fs.h hercules.h i386-elf.h \
imgact_aout.h iso9660.h jfs.h mb_header.h mb_info.h md5.h \
nbi.h pc_slice.h serial.h shared.h smp-imps.h term.h \
- terminfo.h tparm.h nbi.h ufs.h ufs2.h vstafs.h xfs.h graphics.h
+ terminfo.h tparm.h nbi.h fsys_zfs.h ufs.h ufs2.h vstafs.h xfs.h graphics.h
EXTRA_DIST = setjmp.S apm.S $(noinst_SCRIPTS)
@@ -602,23 +652,26 @@ noinst_LIBRARIES = libgrub.a
libgrub_a_SOURCES = boot.c builtins.c char_io.c cmdline.c common.c \
disk_io.c fsys_ext2fs.c fsys_fat.c fsys_ffs.c fsys_iso9660.c \
fsys_jfs.c fsys_minix.c fsys_reiserfs.c fsys_ufs.c fsys_ufs2.c \
+ zfs_sha256.c zfs_lzjb.c zfs_fletcher.c fsys_zfs.c \
fsys_vstafs.c fsys_xfs.c gunzip.c md5.c serial.c stage2.c \
terminfo.c tparm.c graphics.c
libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
-DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \
-DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \
- -DFSYS_UFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
+ -DFSYS_ZFS=1 -DFSYS_UFS=1 -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \
-DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \
-fwritable-strings
@DISKLESS_SUPPORT_FALSE@pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
@DISKLESS_SUPPORT_FALSE@ ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+@DISKLESS_SUPPORT_FALSE@ zfs_stage1_5 \
@DISKLESS_SUPPORT_FALSE@ reiserfs_stage1_5 ufs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 \
@DISKLESS_SUPPORT_FALSE@ xfs_stage1_5
@DISKLESS_SUPPORT_TRUE@pkglib_DATA = stage2 stage2_eltorito e2fs_stage1_5 fat_stage1_5 \
@DISKLESS_SUPPORT_TRUE@ ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 \
+@DISKLESS_SUPPORT_TRUE@ zfs_stage1_5 \
@DISKLESS_SUPPORT_TRUE@ reiserfs_stage1_5 ufs_stage1_5 ufs2_stage1_5 vstafs_stage1_5 \
@DISKLESS_SUPPORT_TRUE@ xfs_stage1_5 nbgrub pxegrub
@@ -648,6 +701,7 @@ STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
pre_stage2_exec_SOURCES = asm.S bios.c boot.c builtins.c char_io.c \
cmdline.c common.c console.c disk_io.c fsys_ext2fs.c \
fsys_fat.c fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
+ fsys_zfs.c zfs_fletcher.c zfs_lzjb.c zfs_sha256.c \
fsys_reiserfs.c fsys_ufs.c fsys_ufs2.c fsys_vstafs.c fsys_xfs.c \
gunzip.c hercules.c md5.c serial.c smp-imps.c stage2.c terminfo.c \
tparm.c graphics.c
@@ -702,6 +756,18 @@ ffs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_FFS=1 \
ffs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+# For zfs_stage1_5 target.
+zfs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
+ stage1_5.c fsys_zfs.c zfs_fletcher.c zfs_lzjb.c zfs_sha256.c bios.c
+
+zfs_stage1_5_exec_CFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ZFS=1 \
+ -DNO_BLOCK_FILES=1
+
+zfs_stage1_5_exec_CCASFLAGS = $(STAGE1_5_COMPILE) -DFSYS_ZFS=1 \
+ -DNO_BLOCK_FILES=1
+
+zfs_stage1_5_exec_LDFLAGS = $(STAGE1_5_LINK)
+
# For ufs_stage1_5 target.
ufs_stage1_5_exec_SOURCES = start.S asm.S common.c char_io.c disk_io.c \
stage1_5.c fsys_ufs.c bios.c
@@ -904,6 +970,9 @@ start.exec$(EXEEXT): $(start_exec_OBJECTS) $(start_exec_DEPENDENCIES)
start_eltorito.exec$(EXEEXT): $(start_eltorito_exec_OBJECTS) $(start_eltorito_exec_DEPENDENCIES)
@rm -f start_eltorito.exec$(EXEEXT)
$(LINK) $(start_eltorito_exec_LDFLAGS) $(start_eltorito_exec_OBJECTS) $(start_eltorito_exec_LDADD) $(LIBS)
+zfs_stage1_5.exec$(EXEEXT): $(zfs_stage1_5_exec_OBJECTS) $(zfs_stage1_5_exec_DEPENDENCIES)
+ @rm -f zfs_stage1_5.exec$(EXEEXT)
+ $(LINK) $(zfs_stage1_5_exec_LDFLAGS) $(zfs_stage1_5_exec_OBJECTS) $(zfs_stage1_5_exec_LDADD) $(LIBS)
ufs2_stage1_5.exec$(EXEEXT): $(ufs2_stage1_5_exec_OBJECTS) $(ufs2_stage1_5_exec_DEPENDENCIES)
@rm -f ufs2_stage1_5.exec$(EXEEXT)
$(LINK) $(ufs2_stage1_5_exec_LDFLAGS) $(ufs2_stage1_5_exec_OBJECTS) $(ufs2_stage1_5_exec_LDADD) $(LIBS)
@@ -938,6 +1007,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_jfs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_minix.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_reiserfs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-zfs_sha256.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-zfs_lzjb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-zfs_fletcher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_zfs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_ufs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_ufs2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diskless_exec-fsys_vstafs.Po@am__quote@
@@ -994,6 +1067,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_jfs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_minix.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_reiserfs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-zfs_sha256.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-zfs_lzjb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-zfs_fletcher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_zfs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_ufs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_ufs2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgrub_a-fsys_vstafs.Po@am__quote@
@@ -1026,6 +1103,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_jfs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_minix.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_reiserfs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-zfs_sha256.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_zfs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_ufs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_ufs2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pre_stage2_exec-fsys_vstafs.Po@am__quote@
@@ -1057,6 +1138,15 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ufs_stage1_5_exec-disk_io.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ufs_stage1_5_exec-fsys_ufs.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ufs_stage1_5_exec-stage1_5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-bios.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-char_io.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-disk_io.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vstafs_stage1_5_exec-bios.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vstafs_stage1_5_exec-char_io.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vstafs_stage1_5_exec-common.Po@am__quote@
@@ -1220,6 +1310,18 @@ ufs_stage1_5_exec-asm.o: asm.S
ufs_stage1_5_exec-asm.obj: asm.S
$(CCAS) $(ufs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o ufs_stage1_5_exec-asm.obj `if test -f 'asm.S'; then $(CYGPATH_W) 'asm.S'; else $(CYGPATH_W) '$(srcdir)/asm.S'; fi`
+zfs_stage1_5_exec-start.o: start.S
+ $(CCAS) $(zfs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o zfs_stage1_5_exec-start.o `test -f 'start.S' || echo '$(srcdir)/'`start.S
+
+zfs_stage1_5_exec-start.obj: start.S
+ $(CCAS) $(zfs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o zfs_stage1_5_exec-start.obj `if test -f 'start.S'; then $(CYGPATH_W) 'start.S'; else $(CYGPATH_W) '$(srcdir)/start.S'; fi`
+
+zfs_stage1_5_exec-asm.o: asm.S
+ $(CCAS) $(zfs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o zfs_stage1_5_exec-asm.o `test -f 'asm.S' || echo '$(srcdir)/'`asm.S
+
+zfs_stage1_5_exec-asm.obj: asm.S
+ $(CCAS) $(zfs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o zfs_stage1_5_exec-asm.obj `if test -f 'asm.S'; then $(CYGPATH_W) 'asm.S'; else $(CYGPATH_W) '$(srcdir)/asm.S'; fi`
+
vstafs_stage1_5_exec-start.o: start.S
$(CCAS) $(vstafs_stage1_5_exec_CCASFLAGS) $(CCASFLAGS) -c -o vstafs_stage1_5_exec-start.o `test -f 'start.S' || echo '$(srcdir)/'`start.S
@@ -1468,6 +1570,70 @@ libgrub_a-fsys_reiserfs.obj: fsys_reiserfs.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-fsys_reiserfs.obj `if test -f 'fsys_reiserfs.c'; then $(CYGPATH_W) 'fsys_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_reiserfs.c'; fi`
+libgrub_a-zfs_sha256.o: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-zfs_sha256.o -MD -MP -MF "$(DEPDIR)/libgrub_a-zfs_sha256.Tpo" -c -o libgrub_a-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-zfs_sha256.Tpo" "$(DEPDIR)/libgrub_a-zfs_sha256.Po"; else rm -f "$(DEPDIR)/libgrub_a-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='libgrub_a-zfs_sha256.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/libgrub_a-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c
+
+libgrub_a-zfs_sha256.obj: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-zfs_sha256.obj -MD -MP -MF "$(DEPDIR)/libgrub_a-zfs_sha256.Tpo" -c -o libgrub_a-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-zfs_sha256.Tpo" "$(DEPDIR)/libgrub_a-zfs_sha256.Po"; else rm -f "$(DEPDIR)/libgrub_a-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='libgrub_a-zfs_sha256.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/libgrub_a-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`
+
+libgrub_a-zfs_lzjb.o: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-zfs_lzjb.o -MD -MP -MF "$(DEPDIR)/libgrub_a-zfs_lzjb.Tpo" -c -o libgrub_a-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-zfs_lzjb.Tpo" "$(DEPDIR)/libgrub_a-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/libgrub_a-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='libgrub_a-zfs_lzjb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/libgrub_a-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c
+
+libgrub_a-zfs_lzjb.obj: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-zfs_lzjb.obj -MD -MP -MF "$(DEPDIR)/libgrub_a-zfs_lzjb.Tpo" -c -o libgrub_a-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-zfs_lzjb.Tpo" "$(DEPDIR)/libgrub_a-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/libgrub_a-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='libgrub_a-zfs_lzjb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/libgrub_a-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`
+
+libgrub_a-zfs_fletcher.o: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-zfs_fletcher.o -MD -MP -MF "$(DEPDIR)/libgrub_a-zfs_fletcher.Tpo" -c -o libgrub_a-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-zfs_fletcher.Tpo" "$(DEPDIR)/libgrub_a-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/libgrub_a-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='libgrub_a-zfs_fletcher.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/libgrub_a-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c
+
+libgrub_a-zfs_fletcher.obj: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-zfs_fletcher.obj -MD -MP -MF "$(DEPDIR)/libgrub_a-zfs_fletcher.Tpo" -c -o libgrub_a-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-zfs_fletcher.Tpo" "$(DEPDIR)/libgrub_a-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/libgrub_a-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='libgrub_a-zfs_fletcher.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/libgrub_a-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`
+
+libgrub_a-fsys_zfs.o: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-fsys_zfs.o -MD -MP -MF "$(DEPDIR)/libgrub_a-fsys_zfs.Tpo" -c -o libgrub_a-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-fsys_zfs.Tpo" "$(DEPDIR)/libgrub_a-fsys_zfs.Po"; else rm -f "$(DEPDIR)/libgrub_a-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='libgrub_a-fsys_zfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/libgrub_a-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c
+
+libgrub_a-fsys_zfs.obj: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-fsys_zfs.obj -MD -MP -MF "$(DEPDIR)/libgrub_a-fsys_zfs.Tpo" -c -o libgrub_a-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-fsys_zfs.Tpo" "$(DEPDIR)/libgrub_a-fsys_zfs.Po"; else rm -f "$(DEPDIR)/libgrub_a-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='libgrub_a-fsys_zfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/libgrub_a-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/libgrub_a-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -c -o libgrub_a-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`
+
libgrub_a-fsys_ufs.o: fsys_ufs.c
@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgrub_a_CFLAGS) $(CFLAGS) -MT libgrub_a-fsys_ufs.o -MD -MP -MF "$(DEPDIR)/libgrub_a-fsys_ufs.Tpo" -c -o libgrub_a-fsys_ufs.o `test -f 'fsys_ufs.c' || echo '$(srcdir)/'`fsys_ufs.c; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libgrub_a-fsys_ufs.Tpo" "$(DEPDIR)/libgrub_a-fsys_ufs.Po"; else rm -f "$(DEPDIR)/libgrub_a-fsys_ufs.Tpo"; exit 1; fi
@@ -1884,6 +2050,70 @@ diskless_exec-fsys_reiserfs.obj: fsys_reiserfs.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-fsys_reiserfs.obj `if test -f 'fsys_reiserfs.c'; then $(CYGPATH_W) 'fsys_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_reiserfs.c'; fi`
+diskless_exec-zfs_sha256.o: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-zfs_sha256.o -MD -MP -MF "$(DEPDIR)/diskless_exec-zfs_sha256.Tpo" -c -o diskless_exec-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-zfs_sha256.Tpo" "$(DEPDIR)/diskless_exec-zfs_sha256.Po"; else rm -f "$(DEPDIR)/diskless_exec-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='diskless_exec-zfs_sha256.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/diskless_exec-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c
+
+diskless_exec-zfs_sha256.obj: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-zfs_sha256.obj -MD -MP -MF "$(DEPDIR)/diskless_exec-zfs_sha256.Tpo" -c -o diskless_exec-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-zfs_sha256.Tpo" "$(DEPDIR)/diskless_exec-zfs_sha256.Po"; else rm -f "$(DEPDIR)/diskless_exec-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='diskless_exec-zfs_sha256.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/diskless_exec-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`
+
+diskless_exec-zfs_lzjb.o: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-zfs_lzjb.o -MD -MP -MF "$(DEPDIR)/diskless_exec-zfs_lzjb.Tpo" -c -o diskless_exec-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-zfs_lzjb.Tpo" "$(DEPDIR)/diskless_exec-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/diskless_exec-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='diskless_exec-zfs_lzjb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/diskless_exec-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c
+
+diskless_exec-zfs_lzjb.obj: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-zfs_lzjb.obj -MD -MP -MF "$(DEPDIR)/diskless_exec-zfs_lzjb.Tpo" -c -o diskless_exec-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-zfs_lzjb.Tpo" "$(DEPDIR)/diskless_exec-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/diskless_exec-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='diskless_exec-zfs_lzjb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/diskless_exec-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`
+
+diskless_exec-zfs_fletcher.o: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-zfs_fletcher.o -MD -MP -MF "$(DEPDIR)/diskless_exec-zfs_fletcher.Tpo" -c -o diskless_exec-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-zfs_fletcher.Tpo" "$(DEPDIR)/diskless_exec-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/diskless_exec-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='diskless_exec-zfs_fletcher.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/diskless_exec-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c
+
+diskless_exec-zfs_fletcher.obj: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-zfs_fletcher.obj -MD -MP -MF "$(DEPDIR)/diskless_exec-zfs_fletcher.Tpo" -c -o diskless_exec-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-zfs_fletcher.Tpo" "$(DEPDIR)/diskless_exec-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/diskless_exec-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='diskless_exec-zfs_fletcher.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/diskless_exec-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`
+
+diskless_exec-fsys_zfs.o: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-fsys_zfs.o -MD -MP -MF "$(DEPDIR)/diskless_exec-fsys_zfs.Tpo" -c -o diskless_exec-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-fsys_zfs.Tpo" "$(DEPDIR)/diskless_exec-fsys_zfs.Po"; else rm -f "$(DEPDIR)/diskless_exec-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='diskless_exec-fsys_zfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/diskless_exec-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c
+
+diskless_exec-fsys_zfs.obj: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-fsys_zfs.obj -MD -MP -MF "$(DEPDIR)/diskless_exec-fsys_zfs.Tpo" -c -o diskless_exec-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-fsys_zfs.Tpo" "$(DEPDIR)/diskless_exec-fsys_zfs.Po"; else rm -f "$(DEPDIR)/diskless_exec-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='diskless_exec-fsys_zfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/diskless_exec-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/diskless_exec-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -c -o diskless_exec-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`
+
diskless_exec-fsys_ufs.o: fsys_ufs.c
@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(diskless_exec_CFLAGS) $(CFLAGS) -MT diskless_exec-fsys_ufs.o -MD -MP -MF "$(DEPDIR)/diskless_exec-fsys_ufs.Tpo" -c -o diskless_exec-fsys_ufs.o `test -f 'fsys_ufs.c' || echo '$(srcdir)/'`fsys_ufs.c; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/diskless_exec-fsys_ufs.Tpo" "$(DEPDIR)/diskless_exec-fsys_ufs.Po"; else rm -f "$(DEPDIR)/diskless_exec-fsys_ufs.Tpo"; exit 1; fi
@@ -2908,6 +3138,70 @@ pre_stage2_exec-fsys_reiserfs.obj: fsys_reiserfs.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-fsys_reiserfs.obj `if test -f 'fsys_reiserfs.c'; then $(CYGPATH_W) 'fsys_reiserfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_reiserfs.c'; fi`
+pre_stage2_exec-zfs_sha256.o: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-zfs_sha256.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Tpo" -c -o pre_stage2_exec-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Tpo" "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='pre_stage2_exec-zfs_sha256.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c
+
+pre_stage2_exec-zfs_sha256.obj: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-zfs_sha256.obj -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Tpo" -c -o pre_stage2_exec-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Tpo" "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='pre_stage2_exec-zfs_sha256.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`
+
+pre_stage2_exec-zfs_lzjb.o: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-zfs_lzjb.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Tpo" -c -o pre_stage2_exec-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Tpo" "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='pre_stage2_exec-zfs_lzjb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c
+
+pre_stage2_exec-zfs_lzjb.obj: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-zfs_lzjb.obj -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Tpo" -c -o pre_stage2_exec-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Tpo" "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='pre_stage2_exec-zfs_lzjb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`
+
+pre_stage2_exec-zfs_fletcher.o: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-zfs_fletcher.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Tpo" -c -o pre_stage2_exec-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Tpo" "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='pre_stage2_exec-zfs_fletcher.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c
+
+pre_stage2_exec-zfs_fletcher.obj: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-zfs_fletcher.obj -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Tpo" -c -o pre_stage2_exec-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Tpo" "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='pre_stage2_exec-zfs_fletcher.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`
+
+pre_stage2_exec-fsys_zfs.o: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-fsys_zfs.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Tpo" -c -o pre_stage2_exec-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Tpo" "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='pre_stage2_exec-fsys_zfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c
+
+pre_stage2_exec-fsys_zfs.obj: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-fsys_zfs.obj -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Tpo" -c -o pre_stage2_exec-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Tpo" "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='pre_stage2_exec-fsys_zfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/pre_stage2_exec-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/pre_stage2_exec-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -c -o pre_stage2_exec-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`
+
pre_stage2_exec-fsys_ufs.o: fsys_ufs.c
@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pre_stage2_exec_CFLAGS) $(CFLAGS) -MT pre_stage2_exec-fsys_ufs.o -MD -MP -MF "$(DEPDIR)/pre_stage2_exec-fsys_ufs.Tpo" -c -o pre_stage2_exec-fsys_ufs.o `test -f 'fsys_ufs.c' || echo '$(srcdir)/'`fsys_ufs.c; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/pre_stage2_exec-fsys_ufs.Tpo" "$(DEPDIR)/pre_stage2_exec-fsys_ufs.Po"; else rm -f "$(DEPDIR)/pre_stage2_exec-fsys_ufs.Tpo"; exit 1; fi
@@ -3404,6 +3698,150 @@ ufs_stage1_5_exec-bios.obj: bios.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ufs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o ufs_stage1_5_exec-bios.obj `if test -f 'bios.c'; then $(CYGPATH_W) 'bios.c'; else $(CYGPATH_W) '$(srcdir)/bios.c'; fi`
+zfs_stage1_5_exec-common.o: common.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-common.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-common.Tpo" -c -o zfs_stage1_5_exec-common.o `test -f 'common.c' || echo '$(srcdir)/'`common.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-common.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-common.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-common.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common.c' object='zfs_stage1_5_exec-common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-common.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-common.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-common.o `test -f 'common.c' || echo '$(srcdir)/'`common.c
+
+zfs_stage1_5_exec-common.obj: common.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-common.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-common.Tpo" -c -o zfs_stage1_5_exec-common.obj `if test -f 'common.c'; then $(CYGPATH_W) 'common.c'; else $(CYGPATH_W) '$(srcdir)/common.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-common.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-common.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-common.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common.c' object='zfs_stage1_5_exec-common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-common.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-common.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-common.obj `if test -f 'common.c'; then $(CYGPATH_W) 'common.c'; else $(CYGPATH_W) '$(srcdir)/common.c'; fi`
+
+zfs_stage1_5_exec-char_io.o: char_io.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-char_io.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-char_io.Tpo" -c -o zfs_stage1_5_exec-char_io.o `test -f 'char_io.c' || echo '$(srcdir)/'`char_io.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-char_io.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-char_io.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-char_io.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='char_io.c' object='zfs_stage1_5_exec-char_io.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-char_io.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-char_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-char_io.o `test -f 'char_io.c' || echo '$(srcdir)/'`char_io.c
+
+zfs_stage1_5_exec-char_io.obj: char_io.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-char_io.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-char_io.Tpo" -c -o zfs_stage1_5_exec-char_io.obj `if test -f 'char_io.c'; then $(CYGPATH_W) 'char_io.c'; else $(CYGPATH_W) '$(srcdir)/char_io.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-char_io.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-char_io.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-char_io.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='char_io.c' object='zfs_stage1_5_exec-char_io.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-char_io.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-char_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-char_io.obj `if test -f 'char_io.c'; then $(CYGPATH_W) 'char_io.c'; else $(CYGPATH_W) '$(srcdir)/char_io.c'; fi`
+
+zfs_stage1_5_exec-disk_io.o: disk_io.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-disk_io.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Tpo" -c -o zfs_stage1_5_exec-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disk_io.c' object='zfs_stage1_5_exec-disk_io.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-disk_io.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-disk_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-disk_io.o `test -f 'disk_io.c' || echo '$(srcdir)/'`disk_io.c
+
+zfs_stage1_5_exec-disk_io.obj: disk_io.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-disk_io.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Tpo" -c -o zfs_stage1_5_exec-disk_io.obj `if test -f 'disk_io.c'; then $(CYGPATH_W) 'disk_io.c'; else $(CYGPATH_W) '$(srcdir)/disk_io.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-disk_io.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disk_io.c' object='zfs_stage1_5_exec-disk_io.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-disk_io.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-disk_io.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-disk_io.obj `if test -f 'disk_io.c'; then $(CYGPATH_W) 'disk_io.c'; else $(CYGPATH_W) '$(srcdir)/disk_io.c'; fi`
+
+zfs_stage1_5_exec-stage1_5.o: stage1_5.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-stage1_5.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Tpo" -c -o zfs_stage1_5_exec-stage1_5.o `test -f 'stage1_5.c' || echo '$(srcdir)/'`stage1_5.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stage1_5.c' object='zfs_stage1_5_exec-stage1_5.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-stage1_5.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-stage1_5.o `test -f 'stage1_5.c' || echo '$(srcdir)/'`stage1_5.c
+
+zfs_stage1_5_exec-stage1_5.obj: stage1_5.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-stage1_5.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Tpo" -c -o zfs_stage1_5_exec-stage1_5.obj `if test -f 'stage1_5.c'; then $(CYGPATH_W) 'stage1_5.c'; else $(CYGPATH_W) '$(srcdir)/stage1_5.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stage1_5.c' object='zfs_stage1_5_exec-stage1_5.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-stage1_5.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-stage1_5.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-stage1_5.obj `if test -f 'stage1_5.c'; then $(CYGPATH_W) 'stage1_5.c'; else $(CYGPATH_W) '$(srcdir)/stage1_5.c'; fi`
+
+zfs_stage1_5_exec-zfs_sha256.o: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-zfs_sha256.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Tpo" -c -o zfs_stage1_5_exec-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='zfs_stage1_5_exec-zfs_sha256.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-zfs_sha256.o `test -f 'zfs_sha256.c' || echo '$(srcdir)/'`zfs_sha256.c
+
+zfs_stage1_5_exec-zfs_sha256.obj: zfs_sha256.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ufs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-zfs_sha256.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Tpo" -c -o zfs_stage1_5_exec-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_sha256.c' object='zfs_stage1_5_exec-zfs_sha256.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_sha256.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-zfs_sha256.obj `if test -f 'zfs_sha256.c'; then $(CYGPATH_W) 'zfs_sha256.c'; else $(CYGPATH_W) '$(srcdir)/zfs_sha256.c'; fi`
+
+zfs_stage1_5_exec-zfs_lzjb.o: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-zfs_lzjb.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Tpo" -c -o zfs_stage1_5_exec-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='zfs_stage1_5_exec-zfs_lzjb.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-zfs_lzjb.o `test -f 'zfs_lzjb.c' || echo '$(srcdir)/'`zfs_lzjb.c
+
+zfs_stage1_5_exec-zfs_lzjb.obj: zfs_lzjb.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ufs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-zfs_lzjb.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Tpo" -c -o zfs_stage1_5_exec-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_lzjb.c' object='zfs_stage1_5_exec-zfs_lzjb.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_lzjb.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-zfs_lzjb.obj `if test -f 'zfs_lzjb.c'; then $(CYGPATH_W) 'zfs_lzjb.c'; else $(CYGPATH_W) '$(srcdir)/zfs_lzjb.c'; fi`
+
+zfs_stage1_5_exec-zfs_fletcher.o: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-zfs_fletcher.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Tpo" -c -o zfs_stage1_5_exec-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='zfs_stage1_5_exec-zfs_fletcher.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-zfs_fletcher.o `test -f 'zfs_fletcher.c' || echo '$(srcdir)/'`zfs_fletcher.c
+
+zfs_stage1_5_exec-zfs_fletcher.obj: zfs_fletcher.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ufs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-zfs_fletcher.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Tpo" -c -o zfs_stage1_5_exec-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zfs_fletcher.c' object='zfs_stage1_5_exec-zfs_fletcher.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-zfs_fletcher.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-zfs_fletcher.obj `if test -f 'zfs_fletcher.c'; then $(CYGPATH_W) 'zfs_fletcher.c'; else $(CYGPATH_W) '$(srcdir)/zfs_fletcher.c'; fi`
+
+zfs_stage1_5_exec-fsys_zfs.o: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-fsys_zfs.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Tpo" -c -o zfs_stage1_5_exec-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='zfs_stage1_5_exec-fsys_zfs.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-fsys_zfs.o `test -f 'fsys_zfs.c' || echo '$(srcdir)/'`fsys_zfs.c
+
+zfs_stage1_5_exec-fsys_zfs.obj: fsys_zfs.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ufs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-fsys_zfs.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Tpo" -c -o zfs_stage1_5_exec-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fsys_zfs.c' object='zfs_stage1_5_exec-fsys_zfs.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-fsys_zfs.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-fsys_zfs.obj `if test -f 'fsys_zfs.c'; then $(CYGPATH_W) 'fsys_zfs.c'; else $(CYGPATH_W) '$(srcdir)/fsys_zfs.c'; fi`
+
+zfs_stage1_5_exec-bios.o: bios.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-bios.o -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-bios.Tpo" -c -o zfs_stage1_5_exec-bios.o `test -f 'bios.c' || echo '$(srcdir)/'`bios.c; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-bios.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-bios.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-bios.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bios.c' object='zfs_stage1_5_exec-bios.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-bios.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-bios.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-bios.o `test -f 'bios.c' || echo '$(srcdir)/'`bios.c
+
+zfs_stage1_5_exec-bios.obj: bios.c
+@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT zfs_stage1_5_exec-bios.obj -MD -MP -MF "$(DEPDIR)/zfs_stage1_5_exec-bios.Tpo" -c -o zfs_stage1_5_exec-bios.obj `if test -f 'bios.c'; then $(CYGPATH_W) 'bios.c'; else $(CYGPATH_W) '$(srcdir)/bios.c'; fi`; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/zfs_stage1_5_exec-bios.Tpo" "$(DEPDIR)/zfs_stage1_5_exec-bios.Po"; else rm -f "$(DEPDIR)/zfs_stage1_5_exec-bios.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bios.c' object='zfs_stage1_5_exec-bios.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/zfs_stage1_5_exec-bios.Po' tmpdepfile='$(DEPDIR)/zfs_stage1_5_exec-bios.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(zfs_stage1_5_exec_CFLAGS) $(CFLAGS) -c -o zfs_stage1_5_exec-bios.obj `if test -f 'bios.c'; then $(CYGPATH_W) 'bios.c'; else $(CYGPATH_W) '$(srcdir)/bios.c'; fi`
+
vstafs_stage1_5_exec-common.o: common.c
@am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vstafs_stage1_5_exec_CFLAGS) $(CFLAGS) -MT vstafs_stage1_5_exec-common.o -MD -MP -MF "$(DEPDIR)/vstafs_stage1_5_exec-common.Tpo" -c -o vstafs_stage1_5_exec-common.o `test -f 'common.c' || echo '$(srcdir)/'`common.c; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/vstafs_stage1_5_exec-common.Tpo" "$(DEPDIR)/vstafs_stage1_5_exec-common.Po"; else rm -f "$(DEPDIR)/vstafs_stage1_5_exec-common.Tpo"; exit 1; fi
diff --git a/usr/src/grub/grub-0.95/stage2/Makefile.solaris b/usr/src/grub/grub-0.95/stage2/Makefile.solaris
index d5ea111154..e0c125a5c7 100644
--- a/usr/src/grub/grub-0.95/stage2/Makefile.solaris
+++ b/usr/src/grub/grub-0.95/stage2/Makefile.solaris
@@ -18,6 +18,7 @@ INCLUDES = -I. -I.. -I../stage1 -I../netboot
LIBS =
FSYS_CFLAGS = -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 -DFSYS_UFS=1 \
+ -DFSYS_ZFS=1 \
-DFSYS_UFS2=1 -DFSYS_REISERFS=1 -DFSYS_ISO9660=1 \
-DUSE_MD5_PASSWORDS=1
$(STAGE2_NETBOOT)TFTP_CFLAGS = -DFSYS_TFTP=1
@@ -30,6 +31,7 @@ NETBOOT_CFLAGS = -DSUPPORT_NETBOOT=1
SERIAL_CFLAGS = -DSUPPORT_SERIAL=1
GRUB_CFLAGS = -O2 -I../lib -DGRUB_UTIL=1 \
-DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 -DFSYS_ISO9660=1 \
+ -DFSYS_ZFS=1 \
-DFSYS_REISERFS=1 -DFSYS_UFS=1 -DFSYS_UFS2=1 \
-DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1
$(OPTION_FS)GRUB_CFLAGS += -DFSYS_MINIX=1 -DFSYS_JFS=1 -DFSYS_XFS=1 \
@@ -71,6 +73,10 @@ LIBGRUB_OBJS = libgrub_a-boot.o \
libgrub_a-fsys_jfs.o \
libgrub_a-fsys_minix.o \
libgrub_a-fsys_reiserfs.o \
+ libgrub_a-zfs_sha256.o \
+ libgrub_a-zfs_lzjb.o \
+ libgrub_a-zfs_fletcher.o \
+ libgrub_a-fsys_zfs.o \
libgrub_a-fsys_ufs.o \
libgrub_a-fsys_ufs2.o \
libgrub_a-fsys_vstafs.o \
@@ -99,6 +105,7 @@ INSTALL_DATA = $(E2FS_STAGE1_5_DATA) \
$(STAGE2_ELTORITO_DATA) \
$(UFS2_STAGE1_5_DATA) \
$(UFS_STAGE1_5_DATA) \
+ $(ZFS_STAGE1_5_DATA) \
$(VSTAFS_STAGE1_5_DATA) \
$(XFS_STAGE1_5_DATA)
@@ -123,11 +130,12 @@ PROGRAMS = $(DISKLESS_EXEC) \
$(NBLOADER_EXEC) \
$(PRE_STAGE2_EXEC) \
$(PXELOADER_EXEC) \
- $(REISERFS_STAGE1_5_EXEC) \
+ $(REISERFS_STAGE1_5_EXEC) \
$(START_EXEC) \
$(START_ELTORITO_EXEC) \
$(UFS2_STAGE1_5_EXEC) \
$(UFS_STAGE1_5_EXEC) \
+ $(ZFS_STAGE1_5_EXEC) \
$(VSTAFS_STAGE1_5_EXEC) \
$(XFS_STAGE1_5_EXEC)
@@ -154,6 +162,10 @@ DISKLESS_OBJS = diskless_exec-bios.o \
diskless_exec-fsys_jfs.o \
diskless_exec-fsys_minix.o \
diskless_exec-fsys_reiserfs.o \
+ diskless_exec-zfs_sha256.o \
+ diskless_exec-zfs_lzjb.o \
+ diskless_exec-zfs_fletcher.o \
+ diskless_exec-fsys_zfs.o \
diskless_exec-fsys_ufs.o \
diskless_exec-fsys_ufs2.o \
diskless_exec-fsys_vstafs.o \
@@ -361,6 +373,10 @@ PRE_STAGE2_OBJS = pre_stage2_exec-bios.o \
pre_stage2_exec-fsys_jfs.o \
pre_stage2_exec-fsys_minix.o \
pre_stage2_exec-fsys_reiserfs.o \
+ pre_stage2_exec-zfs_sha256.o \
+ pre_stage2_exec-zfs_lzjb.o \
+ pre_stage2_exec-zfs_fletcher.o \
+ pre_stage2_exec-fsys_zfs.o \
pre_stage2_exec-fsys_ufs.o \
pre_stage2_exec-fsys_ufs2.o \
pre_stage2_exec-fsys_vstafs.o \
@@ -402,26 +418,26 @@ $(PXELOADER_ASMOBJS) := CCASFLAGS = $(BASE_CCASFLAGS) $(STAGE2_CFLAGS)
#
# ReiserFS stage 1.5
#
-REISERFS_STAGE1_5_DATA = reiserfs_stage1_5
-REISERFS_STAGE1_5_EXEC = reiserfs_stage1_5.exec
+REISERFS_STAGE1_5_DATA = reiserfs_stage1_5
+REISERFS_STAGE1_5_EXEC = reiserfs_stage1_5.exec
REISERFS_STAGE1_5_ASMOBJS = reiserfs_stage1_5_exec-asm.o \
reiserfs_stage1_5_exec-start.o
-REISERFS_STAGE1_5_OBJS = reiserfs_stage1_5_exec-bios.o \
+REISERFS_STAGE1_5_OBJS = reiserfs_stage1_5_exec-bios.o \
reiserfs_stage1_5_exec-char_io.o \
reiserfs_stage1_5_exec-common.o \
reiserfs_stage1_5_exec-disk_io.o \
reiserfs_stage1_5_exec-fsys_reiserfs.o \
reiserfs_stage1_5_exec-stage1_5.o
-
+
$(REISERFS_STAGE1_5_EXEC) := LDFLAGS = $(BASE_LDFLAGS) $(STAGE1_5_LINK)
-
+
$(REISERFS_STAGE1_5_ASMOBJS) := CCASFLAGS = $(BASE_CCASFLAGS) \
$(STAGE1_5_CFLAGS) \
-DFSYS_REISERFS=1 -DNO_BLOCK_FILES=1
-
-$(REISERFS_STAGE1_5_OBJS) := CFLAGS = $(BASE_CFLAGS) $(STAGE1_5_CFLAGS) \
+
+$(REISERFS_STAGE1_5_OBJS) := CFLAGS = $(BASE_CFLAGS) $(STAGE1_5_CFLAGS) \
-DFSYS_REISERFS=1 -DNO_BLOCK_FILES=1
#
@@ -503,6 +519,33 @@ $(UFS_STAGE1_5_OBJS) := CFLAGS = $(BASE_CFLAGS) $(STAGE1_5_CFLAGS) \
-DFSYS_UFS=1 -DNO_BLOCK_FILES=1
#
+# ZFS stage 1.5
+#
+ZFS_STAGE1_5_DATA = zfs_stage1_5
+ZFS_STAGE1_5_EXEC = zfs_stage1_5.exec
+
+ZFS_STAGE1_5_ASMOBJS = zfs_stage1_5_exec-asm.o \
+ zfs_stage1_5_exec-start.o
+
+ZFS_STAGE1_5_OBJS = zfs_stage1_5_exec-bios.o \
+ zfs_stage1_5_exec-char_io.o \
+ zfs_stage1_5_exec-common.o \
+ zfs_stage1_5_exec-disk_io.o \
+ zfs_stage1_5_exec-zfs_sha256.o \
+ zfs_stage1_5_exec-zfs_lzjb.o \
+ zfs_stage1_5_exec-zfs_fletcher.o \
+ zfs_stage1_5_exec-fsys_zfs.o \
+ zfs_stage1_5_exec-stage1_5.o
+
+$(ZFS_STAGE1_5_EXEC) := LDFLAGS = $(BASE_LDFLAGS) $(STAGE1_5_LINK)
+
+$(ZFS_STAGE1_5_ASMOBJS) := CCASFLAGS = $(BASE_CCASFLAGS) $(STAGE1_5_CFLAGS) \
+ -DFSYS_ZFS=1 -DNO_BLOCK_FILES=1
+
+$(ZFS_STAGE1_5_OBJS) := CFLAGS = $(BASE_CFLAGS) $(STAGE1_5_CFLAGS) \
+ -DFSYS_ZFS=1 -DNO_BLOCK_FILES=1
+
+#
# VSTa FS
#
VSTAFS_STAGE1_5_DATA = vstafs_stage1_5
@@ -551,17 +594,20 @@ $(XFS_STAGE1_5_OBJS) := CFLAGS = $(BASE_CFLAGS) $(STAGE1_5_CFLAGS) \
-DFSYS_XFS=1 -DNO_BLOCK_FILES=1
-INSTALL_TARGETS = $(INSTALL_DATA:%=$(ROOT_BOOT_GRUB)/%)
+INSTALL_TARGETS = $(INSTALL_DATA:%=$(ROOT_BOOT_GRUB)/%) \
+ $(SRC_ZFSINC_DIR)
#
-# Source files to be installed in $(SRC_DIR).
+# Source files to be installed in $(ROOT_SRC).
#
SRC_DIR = $(ROOT_SRC)/stage2
+SRC_ZFSINC_DIR = $(SRC_DIR)/zfs-include
SRC_FILES = Makefile.am Makefile.in apic.h apm.S asm.S bios.c boot.c \
builtins.c char_io.c cmdline.c common.c console.c defs.h \
dir.h disk_inode.h disk_inode_ffs.h disk_io.c fat.h \
filesys.h freebsd.h fs.h fsys_ext2fs.c fsys_fat.c \
fsys_ffs.c fsys_iso9660.c fsys_jfs.c fsys_minix.c \
+ zfs_sha256.c zfs_lzjb.c zfs_fletcher.c fsys_zfs.c \
fsys_reiserfs.c fsys_ufs.c fsys_ufs2.c fsys_vstafs.c \
fsys_xfs.c graphics.c graphics.h gunzip.c hercules.c \
hercules.h i386-elf.h imgact_aout.h iso9660.h jfs.h \
@@ -569,9 +615,13 @@ SRC_FILES = Makefile.am Makefile.in apic.h apm.S asm.S bios.c boot.c \
pc_slice.h pxeloader.S serial.c serial.h setjmp.S shared.h \
size_test smp-imps.c smp-imps.h stage1_5.c stage2.c \
start.S start_eltorito.S term.h terminfo.c terminfo.h \
- tparm.c tparm.h ufs.h ufs2.h vstafs.h xfs.h
+ tparm.c tparm.h fsys_zfs.h ufs.h ufs2.h vstafs.h xfs.h
+SRC_ZFSINC_FILES = dmu.h dmu_objset.h dnode.h dsl_dataset.h dsl_dir.h spa.h \
+ uberblock_impl.h vdev_impl.h zap_impl.h zap_leaf.h zfs.h \
+ zfs_acl.h zfs_znode.h zil.h zio.h zio_checksum.h
-INSTALL_TARGETS += $(SRC_FILES:%=$(SRC_DIR)/%)
+INSTALL_TARGETS += $(SRC_FILES:%=$(SRC_DIR)/%) \
+ $(SRC_ZFSINC_FILES:%=$(SRC_ZFSINC_DIR)/%)
###############################################################################
@@ -750,8 +800,8 @@ $(PXELOADER_OBJS): $$(@:pxeloader_exec-%.o=%.c)
#
# ReiserFS stage 1.5
#
-$(REISERFS_STAGE1_5_EXEC): $(REISERFS_STAGE1_5_ASMOBJS) \
- $(REISERFS_STAGE1_5_OBJS)
+$(REISERFS_STAGE1_5_EXEC): $(REISERFS_STAGE1_5_ASMOBJS) \
+ $(REISERFS_STAGE1_5_OBJS)
$(RM) $@
$(LINK) -o $@ $(REISERFS_STAGE1_5_ASMOBJS) $(REISERFS_STAGE1_5_OBJS) \
$(LIBS)
@@ -828,6 +878,19 @@ $(UFS_STAGE1_5_OBJS): $$(@:ufs_stage1_5_exec-%.o=%.c)
$(CC) $(CFLAGS) -c -o $@ $(@:ufs_stage1_5_exec-%.o=%.c)
#
+# ZFS stage 1.5
+#
+$(ZFS_STAGE1_5_EXEC): $(ZFS_STAGE1_5_ASMOBJS) $(ZFS_STAGE1_5_OBJS)
+ $(RM) $@
+ $(LINK) -o $@ $(ZFS_STAGE1_5_ASMOBJS) $(ZFS_STAGE1_5_OBJS) $(LIBS)
+
+$(ZFS_STAGE1_5_ASMOBJS): $$(@:zfs_stage1_5_exec-%.o=%.S)
+ $(CCAS) $(CCASFLAGS) -c -o $@ $(@:zfs_stage1_5_exec-%.o=%.S)
+
+$(ZFS_STAGE1_5_OBJS): $$(@:zfs_stage1_5_exec-%.o=%.c)
+ $(CC) $(CFLAGS) -c -o $@ $(@:zfs_stage1_5_exec-%.o=%.c)
+
+#
# VSTa stage 1.5
#
$(VSTAFS_STAGE1_5_EXEC): $(VSTAFS_STAGE1_5_ASMOBJS) $(VSTAFS_STAGE1_5_OBJS)
@@ -863,9 +926,11 @@ $(ROOT_BOOT_GRUB)/%: $(ROOT_BOOT_GRUB) %
$(SRC_DIR)/%: $(SRC_DIR) %
$(INS.file)
-$(ROOT_BOOT_GRUB) $(SRC_DIR):
- $(INS.dir)
+$(SRC_ZFSINC_DIR)/%: $(SRC_ZFSINC_DIR) %
+ $(INS.file)
+$(ROOT_BOOT_GRUB) $(SRC_DIR) $(SRC_ZFSINC_DIR):
+ $(INS.dir)
clean: _FORCE
$(RM) *.o $(BUILT_SOURCES) $(LIBRARIES) $(PROGRAMS) $(NOINSTALL_DATA)
diff --git a/usr/src/grub/grub-0.95/stage2/boot.c b/usr/src/grub/grub-0.95/stage2/boot.c
index 4185d23e3b..cfc2336a4c 100644
--- a/usr/src/grub/grub-0.95/stage2/boot.c
+++ b/usr/src/grub/grub-0.95/stage2/boot.c
@@ -669,7 +669,12 @@ load_image (char *kernel, char *arg, kernel_t suggested_type,
tab_size = pu.elf->e_shentsize * pu.elf->e_shnum;
grub_seek (pu.elf->e_shoff);
- if (grub_read ((char *) RAW_ADDR (cur_addr), tab_size)
+ /*
+ * Should not need to call RAW_ADDR; cur_addr is already
+ * adjusted to account for grub_scratch_mem.
+ * XXX Linux might calculate cur_addr differently.
+ */
+ if (grub_read ((char *) (cur_addr), tab_size)
== tab_size)
{
mbi.syms.e.addr = cur_addr;
@@ -697,8 +702,13 @@ load_image (char *kernel, char *arg, kernel_t suggested_type,
sec_size = shdr[i].sh_size;
+ /*
+ * Should not need to call RAW_ADDR; cur_addr is already
+ * adjusted to account for grub_scratch_mem.
+ * XXX Linux might calculate cur_addr differently.
+ */
if (! (memcheck (cur_addr, sec_size)
- && (grub_read ((char *) RAW_ADDR (cur_addr),
+ && (grub_read ((char *) (cur_addr),
sec_size)
== sec_size)))
{
diff --git a/usr/src/grub/grub-0.95/stage2/builtins.c b/usr/src/grub/grub-0.95/stage2/builtins.c
index b7d0aaa00a..1d12737dd1 100644
--- a/usr/src/grub/grub-0.95/stage2/builtins.c
+++ b/usr/src/grub/grub-0.95/stage2/builtins.c
@@ -113,6 +113,10 @@ init_config (void)
fallback_entryno = -1;
fallback_entries[0] = -1;
grub_timeout = -1;
+ current_rootpool[0] = '\0';
+ current_bootfs[0] = '\0';
+ current_bootfs_obj = 0;
+ is_zfs_mount = 0;
}
/* Check a password for correctness. Returns 0 if password was
@@ -2630,6 +2634,56 @@ static struct builtin builtin_ioprobe =
};
+/*
+ * To boot from a ZFS root filesystem, the kernel$ or module$ commands
+ * must include "-B $ZFS-BOOTFS" to pass to the kernel:
+ *
+ * e.g.
+ * kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=ttya
+ *
+ * The expand_dollar_bootfs routine expands $ZFS-BOOTFS to
+ * "pool-name/zfs-rootfilesystem-object-num", e.g. "rootpool/85"
+ * so that in the kernel zfs_mountroot would know which zfs root
+ * filesystem to be mounted.
+ */
+static int
+expand_dollar_bootfs(char *in, char *out)
+{
+ char *token, *tmpout = out;
+ int outlen, blen;
+
+ outlen = strlen(in);
+ blen = current_bootfs_obj == 0 ? strlen(current_rootpool) :
+ strlen(current_rootpool) + 11;
+
+ out[0] = '\0';
+ while (token = strstr(in, "$ZFS-BOOTFS")) {
+
+ if ((outlen += blen) > MAX_CMDLINE) {
+ errnum = ERR_WONT_FIT;
+ return (1);
+ }
+
+ token[0] = '\0';
+ grub_sprintf(tmpout, "%s", in);
+ token[0] = '$';
+ in = token + 11; /* move over $ZFS-BOOTFS */
+ tmpout = out + strlen(out);
+
+ /* Note: %u only fits 32 bit integer; */
+ if (current_bootfs_obj > 0)
+ grub_sprintf(tmpout, "zfs-bootfs=%s/%u",
+ current_rootpool, current_bootfs_obj);
+ else
+ grub_sprintf(tmpout, "zfs-bootfs=%s",
+ current_rootpool);
+ tmpout = out + strlen(out);
+ }
+
+ strncat(out, in, MAX_CMDLINE);
+ return (0);
+}
+
/* kernel */
static int
kernel_func (char *arg, int flags)
@@ -2699,7 +2753,7 @@ kernel_func (char *arg, int flags)
if (kernel_type == KERNEL_TYPE_NONE)
return 1;
- mb_cmdline += len + 1;
+ mb_cmdline += grub_strlen(mb_cmdline) + 1;
return 0;
}
@@ -2949,10 +3003,9 @@ isamd64()
return (ret);
}
-static int
-expand_arch (char *arg, int flags, int func())
+static void
+expand_arch (char *arg, char *newarg)
{
- char newarg[MAX_CMDLINE]; /* everything boils down to MAX_CMDLINE */
char *index;
newarg[0] = '\0';
@@ -2970,17 +3023,29 @@ expand_arch (char *arg, int flags, int func())
}
strncat(newarg, arg, MAX_CMDLINE);
-
- grub_printf("loading %s\n", newarg);
-
- return (func(newarg, flags));
+ return;
}
/* kernel$ */
static int
kernel_dollar_func (char *arg, int flags)
{
- return (expand_arch(arg, flags, (void *)&kernel_func));
+ char newarg[MAX_CMDLINE]; /* everything boils down to MAX_CMDLINE */
+
+ grub_printf("loading '%s' ...\n", arg);
+ expand_arch(arg, newarg);
+
+ if (kernel_func(newarg, flags))
+ return (1);
+
+ mb_cmdline = (char *)MB_CMDLINE_BUF;
+ if (expand_dollar_bootfs(newarg, mb_cmdline))
+ return (1);
+
+ grub_printf("'%s' is loaded\n", mb_cmdline);
+ mb_cmdline += grub_strlen(mb_cmdline) + 1;
+
+ return (0);
}
static struct builtin builtin_kernel_dollar =
@@ -3177,7 +3242,8 @@ module_func (char *arg, int flags)
grub_memmove (mb_cmdline, arg, len + 1);
if (! load_module (arg, mb_cmdline))
return 1;
- mb_cmdline += len + 1;
+
+ mb_cmdline += grub_strlen(mb_cmdline) + 1;
break;
case KERNEL_TYPE_LINUX:
@@ -3211,7 +3277,23 @@ static struct builtin builtin_module =
static int
module_dollar_func (char *arg, int flags)
{
- return (expand_arch(arg, flags, (void *)&module_func));
+ char newarg[MAX_CMDLINE]; /* everything boils down to MAX_CMDLINE */
+ char *cmdline_sav;
+
+ grub_printf("loading '%s' ...\n", arg);
+ expand_arch(arg, newarg);
+
+ cmdline_sav = (char *)mb_cmdline;
+ if (module_func(newarg, flags))
+ return (1);
+
+ if (expand_dollar_bootfs(newarg, cmdline_sav))
+ return (1);
+
+ grub_printf("'%s' is loaded\n", (char *)cmdline_sav);
+ mb_cmdline += grub_strlen(cmdline_sav) + 1;
+
+ return (0);
}
static struct builtin builtin_module_dollar =
@@ -3770,6 +3852,7 @@ real_root_func (char *arg, int attempt_mount)
static int
root_func (char *arg, int flags)
{
+ is_zfs_mount = 0;
return real_root_func (arg, 1);
}
@@ -3792,6 +3875,56 @@ static struct builtin builtin_root =
};
+/*
+ * COMMAND to override the default root filesystem for ZFS
+ * bootfs pool/fs
+ */
+static int
+bootfs_func (char *arg, int flags)
+{
+ int hdbias = 0;
+ char *biasptr;
+ char *next;
+
+ if (! *arg) {
+ if (current_bootfs[0] != '\0')
+ grub_printf ("The zfs boot filesystem is set to '%s'.\n",
+ current_bootfs);
+ else if (current_rootpool[0] != 0 && current_bootfs_obj != 0)
+ grub_printf("The zfs boot filesystem is <default: %s/%u>.",
+ current_rootpool, current_bootfs_obj);
+ else if (current_rootpool[0] != 0 && current_bootfs_obj == 0)
+ grub_printf("The zfs boot pool is '%s'.", current_rootpool);
+ else
+ grub_printf ("The zfs boot filesystem will be <default>.\n");
+
+ return (1);
+ }
+
+ /* Verify the zfs filesystem name */
+ if (arg[0] == '/' || arg[0] == '\0') {
+ errnum = ERR_BAD_ARGUMENT;
+ return 0;
+ }
+
+ if (set_bootfs(arg) == 0) {
+ errnum = ERR_BAD_ARGUMENT;
+ return 0;
+ }
+
+ return (1);
+}
+
+static struct builtin builtin_bootfs =
+{
+ "bootfs",
+ bootfs_func,
+ BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
+ "bootfs [ZFSBOOTFS]",
+ "Set the current zfs boot filesystem to ZFSBOOTFS (rootpool/rootfs)."
+};
+
+
/* rootnoverify */
static int
rootnoverify_func (char *arg, int flags)
@@ -3829,6 +3962,11 @@ savedefault_func (char *arg, int flags)
int saved_offsets[2];
int saved_lengths[2];
+ /* not supported for zfs root */
+ if (is_zfs_mount == 1) {
+ return (0); /* no-op */
+ }
+
/* Save sector information about at most two sectors. */
auto void disk_read_savesect_func (int sector, int offset, int length);
void disk_read_savesect_func (int sector, int offset, int length)
@@ -5398,6 +5536,7 @@ struct builtin *builtin_table[] =
#endif
&builtin_blocklist,
&builtin_boot,
+ &builtin_bootfs,
#ifdef SUPPORT_NETBOOT
&builtin_bootp,
#endif /* SUPPORT_NETBOOT */
diff --git a/usr/src/grub/grub-0.95/stage2/char_io.c b/usr/src/grub/grub-0.95/stage2/char_io.c
index a1027b95bb..f7952072aa 100644
--- a/usr/src/grub/grub-0.95/stage2/char_io.c
+++ b/usr/src/grub/grub-0.95/stage2/char_io.c
@@ -1056,7 +1056,10 @@ grub_strncat (char *s1, const char *s2, int n)
a static library supporting minimal standard C functions and link
each image with the library. Complicated things should be left to
computer, definitely. -okuji */
-#if !defined(STAGE1_5) || defined(FSYS_VSTAFS)
+
+/* Make some grub_str* routines available to ZFS plug-in as well */
+
+#if !defined(STAGE1_5) || defined(FSYS_VSTAFS) || defined(FSYS_ZFS)
int
grub_strcmp (const char *s1, const char *s2)
{
@@ -1072,7 +1075,20 @@ grub_strcmp (const char *s1, const char *s2)
return 0;
}
-#endif /* ! STAGE1_5 || FSYS_VSTAFS */
+
+int
+grub_strncmp(const char *s1, const char *s2, int n)
+{
+ if (s1 == s2)
+ return (0);
+ n++;
+ while (--n != 0 && *s1 == *s2++)
+ if (*s1++ == '\0')
+ return (0);
+ return ((n == 0) ? 0 : *(unsigned char *)s1 - *(unsigned char *)--s2);
+}
+
+#endif /* ! STAGE1_5 || FSYS_VSTAFS || defined(FSYS_ZFS) */
#ifndef STAGE1_5
/* Wait for a keypress and return its code. */
@@ -1210,21 +1226,7 @@ substring (const char *s1, const char *s2)
return 1;
}
-#ifndef STAGE1_5
-/* Terminate the string STR with NUL. */
-int
-nul_terminate (char *str)
-{
- int ch;
-
- while (*str && ! grub_isspace (*str))
- str++;
-
- ch = *str;
- *str = 0;
- return ch;
-}
-
+#if !defined(STAGE1_5) || defined(FSYS_ZFS)
char *
grub_strstr (const char *s1, const char *s2)
{
@@ -1246,6 +1248,22 @@ grub_strstr (const char *s1, const char *s2)
return 0;
}
+#endif /* !defined(STAGE1_5) || defined(FSYS_ZFS) */
+
+#ifndef STAGE1_5
+/* Terminate the string STR with NUL. */
+int
+nul_terminate (char *str)
+{
+ int ch;
+
+ while (*str && ! grub_isspace (*str))
+ str++;
+
+ ch = *str;
+ *str = 0;
+ return ch;
+}
int
grub_strlen (const char *str)
diff --git a/usr/src/grub/grub-0.95/stage2/common.c b/usr/src/grub/grub-0.95/stage2/common.c
index 4ec61a9593..ad24d73c54 100644
--- a/usr/src/grub/grub-0.95/stage2/common.c
+++ b/usr/src/grub/grub-0.95/stage2/common.c
@@ -92,7 +92,9 @@ char *err_list[] =
[ERR_UNRECOGNIZED] = "Unrecognized command",
[ERR_WONT_FIT] = "Selected item cannot fit into memory",
[ERR_WRITE] = "Disk write error",
- [ERR_BAD_GZIP_CRC] = "Incorrect gunzip CRC checksum"
+ [ERR_BAD_GZIP_CRC] = "Incorrect gunzip CRC checksum",
+ [ERR_FILESYSTEM_NOT_FOUND] = "File System not found"
+ /* this zfs file system is not found in the pool of the device */
};
diff --git a/usr/src/grub/grub-0.95/stage2/disk_io.c b/usr/src/grub/grub-0.95/stage2/disk_io.c
index eeb63a8a37..5c1df70a90 100644
--- a/usr/src/grub/grub-0.95/stage2/disk_io.c
+++ b/usr/src/grub/grub-0.95/stage2/disk_io.c
@@ -77,6 +77,9 @@ struct fsys_entry fsys_table[NUM_FSYS + 1] =
# ifdef FSYS_UFS2
{"ufs2", ufs2_mount, ufs2_read, ufs2_dir, 0, ufs2_embed},
# endif
+# ifdef FSYS_ZFS
+ {"zfs", zfs_mount, zfs_read, zfs_open, 0, zfs_embed},
+# endif
# ifdef FSYS_ISO9660
{"iso9660", iso9660_mount, iso9660_read, iso9660_dir, 0, 0},
# endif
@@ -120,6 +123,12 @@ unsigned long part_length;
int current_slice;
+/* ZFS root filesystem for booting */
+char current_rootpool[MAXNAMELEN];
+char current_bootfs[MAXNAMELEN];
+uint64_t current_bootfs_obj;
+int is_zfs_mount;
+
/* disk buffer parameters */
int buf_drive = -1;
int buf_track;
@@ -148,6 +157,7 @@ rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
if (byte_len <= 0)
return 1;
+ errnum = ERR_NONE;
while (byte_len > 0 && !errnum)
{
int soff, num_sect, track, size = byte_len;
@@ -1003,6 +1013,12 @@ static enum
part_choice;
#endif /* ! STAGE1_5 */
+int
+set_bootfs(char *fsname)
+{
+ grub_memmove(current_bootfs, fsname, MAXNAMELEN);
+}
+
char *
set_device (char *device)
{
diff --git a/usr/src/grub/grub-0.95/stage2/filesys.h b/usr/src/grub/grub-0.95/stage2/filesys.h
index 3af69ea676..94c23bf5de 100644
--- a/usr/src/grub/grub-0.95/stage2/filesys.h
+++ b/usr/src/grub/grub-0.95/stage2/filesys.h
@@ -50,6 +50,16 @@ int ufs2_embed (int *start_sector, int needed_sectors);
#define FSYS_UFS2_NUM 0
#endif
+#ifdef FSYS_ZFS
+#define FSYS_ZFS_NUM 1
+int zfs_mount (void);
+int zfs_read (char *buf, int len);
+int zfs_open (char *dirname);
+int zfs_embed (int *start_sector, int needed_sectors);
+#else
+#define FSYS_ZFS_NUM 0
+#endif
+
#ifdef FSYS_FAT
#define FSYS_FAT_NUM 1
int fat_mount (void);
@@ -138,7 +148,8 @@ int iso9660_dir (char *dirname);
#define NUM_FSYS \
(FSYS_FFS_NUM + FSYS_FAT_NUM + FSYS_EXT2FS_NUM + FSYS_MINIX_NUM \
+ FSYS_REISERFS_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM + FSYS_XFS_NUM \
- + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS_NUM + FSYS_UFS2_NUM)
+ + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS_NUM + FSYS_UFS2_NUM \
+ + FSYS_ZFS_NUM)
#endif
/* defines for the block filesystem info area */
diff --git a/usr/src/grub/grub-0.95/stage2/fsys_zfs.c b/usr/src/grub/grub-0.95/stage2/fsys_zfs.c
new file mode 100644
index 0000000000..1a7150dfc5
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/fsys_zfs.c
@@ -0,0 +1,1197 @@
+/*
+ * 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.
+ */
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * The zfs plug-in routines for GRUB are:
+ *
+ * zfs_mount() - locates a valid uberblock of the root pool and reads
+ * in its MOS at the memory address MOS.
+ *
+ * zfs_open() - locates a plain file object by following the MOS
+ * and places its dnode at the memory address DNODE.
+ *
+ * zfs_read() - read in the data blocks pointed by the DNODE.
+ *
+ * ZFS_SCRATCH is used as a working area.
+ *
+ * (memory addr) MOS DNODE ZFS_SCRATCH
+ * | | |
+ * +-------V---------V----------V---------------+
+ * memory | | dnode | dnode | scratch |
+ * | | 512B | 512B | area |
+ * +--------------------------------------------+
+ */
+
+#ifdef FSYS_ZFS
+
+#include "shared.h"
+#include "filesys.h"
+#include "fsys_zfs.h"
+
+/* cache for a file block of the currently zfs_open()-ed file */
+static void *file_buf = NULL;
+static uint64_t file_start = 0;
+static uint64_t file_end = 0;
+
+/* cache for a dnode block */
+static dnode_phys_t *dnode_buf = NULL;
+static dnode_phys_t *dnode_mdn = NULL;
+static uint64_t dnode_start = 0;
+static uint64_t dnode_end = 0;
+
+static char *stackbase;
+
+decomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] =
+{
+ {"noop", 0},
+ {"on", lzjb_decompress}, /* ZIO_COMPRESS_ON */
+ {"off", 0},
+ {"lzjb", lzjb_decompress} /* ZIO_COMPRESS_LZJB */
+};
+
+/*
+ * Our own version of bcmp().
+ */
+static int
+zfs_bcmp(const void *s1, const void *s2, size_t n)
+{
+ const uchar_t *ps1 = s1;
+ const uchar_t *ps2 = s2;
+
+ if (s1 != s2 && n != 0) {
+ do {
+ if (*ps1++ != *ps2++)
+ return (1);
+ } while (--n != 0);
+ }
+
+ return (0);
+}
+
+/*
+ * Our own version of log2(). Same thing as highbit()-1.
+ */
+static int
+zfs_log2(uint64_t num)
+{
+ int i = 0;
+
+ while (num > 1) {
+ i++;
+ num = num >> 1;
+ }
+
+ return (i);
+}
+
+/* Checksum Functions */
+static void
+zio_checksum_off(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ ZIO_SET_CHECKSUM(zcp, 0, 0, 0, 0);
+}
+
+/* Checksum Table and Values */
+zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = {
+ NULL, NULL, 0, 0, "inherit",
+ NULL, NULL, 0, 0, "on",
+ zio_checksum_off, zio_checksum_off, 0, 0, "off",
+ zio_checksum_SHA256, zio_checksum_SHA256, 1, 1, "label",
+ zio_checksum_SHA256, zio_checksum_SHA256, 1, 1, "gang_header",
+ fletcher_2_native, fletcher_2_byteswap, 0, 1, "zilog",
+ fletcher_2_native, fletcher_2_byteswap, 0, 0, "fletcher2",
+ fletcher_4_native, fletcher_4_byteswap, 1, 0, "fletcher4",
+ zio_checksum_SHA256, zio_checksum_SHA256, 1, 0, "SHA256",
+};
+
+/*
+ * zio_checksum_verify: Provides support for checksum verification.
+ *
+ * Fletcher2, Fletcher4, and SHA256 are supported.
+ *
+ * Return:
+ * -1 = Failure
+ * 0 = Success
+ */
+static int
+zio_checksum_verify(blkptr_t *bp, char *data, int size)
+{
+ zio_cksum_t zc = bp->blk_cksum;
+ uint32_t checksum = BP_IS_GANG(bp) ? ZIO_CHECKSUM_GANG_HEADER :
+ BP_GET_CHECKSUM(bp);
+ int byteswap = BP_SHOULD_BYTESWAP(bp);
+ zio_block_tail_t *zbt = (zio_block_tail_t *)(data + size) - 1;
+ zio_checksum_info_t *ci = &zio_checksum_table[checksum];
+ zio_cksum_t actual_cksum, expected_cksum;
+
+ /* byteswap is not supported */
+ if (byteswap)
+ return (-1);
+
+ if (checksum >= ZIO_CHECKSUM_FUNCTIONS || ci->ci_func[0] == NULL)
+ return (-1);
+
+ if (ci->ci_zbt) {
+ if (checksum == ZIO_CHECKSUM_GANG_HEADER) {
+ /*
+ * 'gang blocks' is not supported.
+ */
+ return (-1);
+ }
+
+ if (zbt->zbt_magic == BSWAP_64(ZBT_MAGIC)) {
+ /* byte swapping is not supported */
+ return (-1);
+ } else {
+ expected_cksum = zbt->zbt_cksum;
+ zbt->zbt_cksum = zc;
+ ci->ci_func[0](data, size, &actual_cksum);
+ zbt->zbt_cksum = expected_cksum;
+ }
+ zc = expected_cksum;
+
+ } else {
+ if (BP_IS_GANG(bp))
+ return (-1);
+ ci->ci_func[byteswap](data, size, &actual_cksum);
+ }
+
+ if ((actual_cksum.zc_word[0] - zc.zc_word[0]) |
+ (actual_cksum.zc_word[1] - zc.zc_word[1]) |
+ (actual_cksum.zc_word[2] - zc.zc_word[2]) |
+ (actual_cksum.zc_word[3] - zc.zc_word[3]))
+ return (-1);
+
+ return (0);
+}
+
+/*
+ * vdev_label_offset takes "offset" (the offset within a vdev_label) and
+ * returns its physical disk offset (starting from the beginning of the vdev).
+ *
+ * Input:
+ * psize : Physical size of this vdev
+ * l : Label Number (0-3)
+ * offset : The offset with a vdev_label in which we want the physical
+ * address
+ * Return:
+ * Success : physical disk offset
+ * Failure : errnum = ERR_BAD_ARGUMENT, return value is meaningless
+ */
+uint64_t
+vdev_label_offset(uint64_t psize, int l, uint64_t offset)
+{
+ /* XXX Need to add back label support! */
+ if (l >= VDEV_LABELS/2 || offset > sizeof (vdev_label_t)) {
+ errnum = ERR_BAD_ARGUMENT;
+ return (0);
+ }
+
+ return (offset + l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ?
+ 0 : psize - VDEV_LABELS * sizeof (vdev_label_t)));
+
+}
+
+/*
+ * vdev_uberblock_compare takes two uberblock structures and returns an integer
+ * indicating the more recent of the two.
+ * Return Value = 1 if ub2 is more recent
+ * Return Value = -1 if ub1 is more recent
+ * The most recent uberblock is determined using its transaction number and
+ * timestamp. The uberblock with the highest transaction number is
+ * considered "newer". If the transaction numbers of the two blocks match, the
+ * timestamps are compared to determine the "newer" of the two.
+ */
+static int
+vdev_uberblock_compare(uberblock_t *ub1, uberblock_t *ub2)
+{
+ if (ub1->ub_txg < ub2->ub_txg)
+ return (-1);
+ if (ub1->ub_txg > ub2->ub_txg)
+ return (1);
+
+ if (ub1->ub_timestamp < ub2->ub_timestamp)
+ return (-1);
+ if (ub1->ub_timestamp > ub2->ub_timestamp)
+ return (1);
+
+ return (0);
+}
+
+/*
+ * Three pieces of information are needed to verify an uberblock: the magic
+ * number, the version number, and the checksum.
+ *
+ * Currently Implemented: version number, magic number
+ * Need to Implement: checksum
+ *
+ * Return:
+ * 0 - Success
+ * -1 - Failure
+ */
+static int
+uberblock_verify(uberblock_phys_t *ub, int offset)
+{
+
+ uberblock_t *uber = &ub->ubp_uberblock;
+ blkptr_t bp;
+
+ BP_ZERO(&bp);
+ BP_SET_CHECKSUM(&bp, ZIO_CHECKSUM_LABEL);
+ BP_SET_BYTEORDER(&bp, ZFS_HOST_BYTEORDER);
+ ZIO_SET_CHECKSUM(&bp.blk_cksum, offset, 0, 0, 0);
+
+ if (zio_checksum_verify(&bp, (char *)ub, UBERBLOCK_SIZE) != 0)
+ return (-1);
+
+ if (uber->ub_magic == UBERBLOCK_MAGIC &&
+ uber->ub_version >= ZFS_VERSION_1 &&
+ uber->ub_version <= ZFS_VERSION)
+ return (0);
+
+ return (-1);
+}
+
+/*
+ * Find the best uberblock.
+ * Return:
+ * Success - Pointer to the best uberblock.
+ * Failure - NULL
+ */
+static uberblock_phys_t *
+find_bestub(uberblock_phys_t *ub_array, int label)
+{
+ uberblock_phys_t *ubbest = NULL;
+ int i, offset;
+
+ for (i = 0; i < (VDEV_UBERBLOCK_RING >> VDEV_UBERBLOCK_SHIFT); i++) {
+ offset = vdev_label_offset(0, label, VDEV_UBERBLOCK_OFFSET(i));
+ if (errnum == ERR_BAD_ARGUMENT)
+ return (NULL);
+ if (uberblock_verify(&ub_array[i], offset) == 0) {
+ if (ubbest == NULL) {
+ ubbest = &ub_array[i];
+ } else {
+ if (vdev_uberblock_compare(
+ &(ub_array[i].ubp_uberblock),
+ &(ubbest->ubp_uberblock)) > 0)
+ ubbest = &ub_array[i];
+ }
+ }
+ }
+
+ return (ubbest);
+}
+
+/*
+ * Read in a block and put its uncompressed data in buf.
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+zio_read(blkptr_t *bp, void *buf, char *stack)
+{
+ uint64_t offset, sector;
+ int psize, lsize;
+ int i, comp, cksum;
+
+ psize = BP_GET_PSIZE(bp);
+ lsize = BP_GET_LSIZE(bp);
+ comp = BP_GET_COMPRESS(bp);
+ cksum = BP_GET_CHECKSUM(bp);
+
+ /* pick a good dva from the block pointer */
+ for (i = 0; i < SPA_DVAS_PER_BP; i++) {
+
+ if (bp->blk_dva[i].dva_word[0] == 0 &&
+ bp->blk_dva[i].dva_word[1] == 0)
+ continue;
+
+ /* read in a block */
+ offset = DVA_GET_OFFSET(&bp->blk_dva[i]);
+ sector = DVA_OFFSET_TO_PHYS_SECTOR(offset);
+
+ if (comp != ZIO_COMPRESS_OFF) {
+
+ if (devread(sector, 0, psize, stack) == 0)
+ continue;
+ if (zio_checksum_verify(bp, stack, psize) != 0)
+ continue;
+ decomp_table[comp].decomp_func(stack, buf, psize,
+ lsize);
+ } else {
+ if (devread(sector, 0, psize, buf) == 0)
+ continue;
+ if (zio_checksum_verify(bp, buf, psize) != 0)
+ continue;
+ }
+ return (0);
+ }
+
+ return (ERR_FSYS_CORRUPT);
+}
+
+/*
+ * Get the block from a block id.
+ * push the block onto the stack.
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+dmu_read(dnode_phys_t *dn, uint64_t blkid, void *buf, char *stack)
+{
+ int idx, level;
+ blkptr_t *bp_array = dn->dn_blkptr;
+ int epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ blkptr_t *bp, *tmpbuf;
+
+ bp = (blkptr_t *)stack;
+ stack += sizeof (blkptr_t);
+
+ tmpbuf = (blkptr_t *)stack;
+ stack += 1<<dn->dn_indblkshift;
+
+ for (level = dn->dn_nlevels - 1; level >= 0; level--) {
+ idx = (blkid >> (epbs * level)) & ((1<<epbs)-1);
+ *bp = bp_array[idx];
+ if (level == 0)
+ tmpbuf = buf;
+ if (errnum = zio_read(bp, tmpbuf, stack))
+ return (errnum);
+
+ bp_array = tmpbuf;
+ }
+
+ return (0);
+}
+
+/*
+ * mzap_lookup: Looks up property described by "name" and returns the value
+ * in "value".
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+mzap_lookup(mzap_phys_t *zapobj, int objsize, char *name,
+ uint64_t *value)
+{
+ int i, chunks;
+ mzap_ent_phys_t *mzap_ent = zapobj->mz_chunk;
+
+ chunks = objsize/MZAP_ENT_LEN - 1;
+ for (i = 0; i < chunks; i++) {
+ if (grub_strcmp(mzap_ent[i].mze_name, name) == 0) {
+ *value = mzap_ent[i].mze_value;
+ return (0);
+ }
+ }
+
+ return (ERR_FSYS_CORRUPT);
+}
+
+static uint64_t
+zap_hash(uint64_t salt, const char *name)
+{
+ static uint64_t table[256];
+ const uint8_t *cp;
+ uint8_t c;
+ uint64_t crc = salt;
+
+ if (table[128] == 0) {
+ uint64_t *ct;
+ int i, j;
+ for (i = 0; i < 256; i++) {
+ for (ct = table + i, *ct = i, j = 8; j > 0; j--)
+ *ct = (*ct >> 1) ^ (-(*ct & 1) &
+ ZFS_CRC64_POLY);
+ }
+ }
+
+ if (crc == 0 || table[128] != ZFS_CRC64_POLY) {
+ errnum = ERR_FSYS_CORRUPT;
+ return (0);
+ }
+
+ for (cp = (const uint8_t *)name; (c = *cp) != '\0'; cp++)
+ crc = (crc >> 8) ^ table[(crc ^ c) & 0xFF];
+
+ /*
+ * Only use 28 bits, since we need 4 bits in the cookie for the
+ * collision differentiator. We MUST use the high bits, since
+ * those are the onces that we first pay attention to when
+ * chosing the bucket.
+ */
+ crc &= ~((1ULL << (64 - ZAP_HASHBITS)) - 1);
+
+ return (crc);
+}
+
+/*
+ * Only to be used on 8-bit arrays.
+ * array_len is actual len in bytes (not encoded le_value_length).
+ * buf is null-terminated.
+ */
+static int
+zap_leaf_array_equal(zap_leaf_phys_t *l, int blksft, int chunk,
+ int array_len, const char *buf)
+{
+ int bseen = 0;
+
+ while (bseen < array_len) {
+ struct zap_leaf_array *la =
+ &ZAP_LEAF_CHUNK(l, blksft, chunk).l_array;
+ int toread = MIN(array_len - bseen, ZAP_LEAF_ARRAY_BYTES);
+
+ if (chunk >= ZAP_LEAF_NUMCHUNKS(blksft))
+ return (0);
+
+ if (zfs_bcmp(la->la_array, buf + bseen, toread) != 0)
+ break;
+ chunk = la->la_next;
+ bseen += toread;
+ }
+ return (bseen == array_len);
+}
+
+/*
+ * Given a zap_leaf_phys_t, walk thru the zap leaf chunks to get the
+ * value for the property "name".
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+int
+zap_leaf_lookup(zap_leaf_phys_t *l, int blksft, uint64_t h,
+ const char *name, uint64_t *value)
+{
+ uint16_t chunk;
+ struct zap_leaf_entry *le;
+
+ /* Verify if this is a valid leaf block */
+ if (l->l_hdr.lh_block_type != ZBT_LEAF)
+ return (ERR_FSYS_CORRUPT);
+ if (l->l_hdr.lh_magic != ZAP_LEAF_MAGIC)
+ return (ERR_FSYS_CORRUPT);
+
+ for (chunk = l->l_hash[LEAF_HASH(blksft, h)];
+ chunk != CHAIN_END; chunk = le->le_next) {
+
+ if (chunk >= ZAP_LEAF_NUMCHUNKS(blksft))
+ return (ERR_FSYS_CORRUPT);
+
+ le = ZAP_LEAF_ENTRY(l, blksft, chunk);
+
+ /* Verify the chunk entry */
+ if (le->le_type != ZAP_CHUNK_ENTRY)
+ return (ERR_FSYS_CORRUPT);
+
+ if (le->le_hash != h)
+ continue;
+
+ if (zap_leaf_array_equal(l, blksft, le->le_name_chunk,
+ le->le_name_length, name)) {
+
+ struct zap_leaf_array *la;
+ uint8_t *ip;
+
+ if (le->le_int_size != 8 || le->le_value_length != 1)
+ return (ERR_FSYS_CORRUPT);
+
+ /* get the uint64_t property value */
+ la = &ZAP_LEAF_CHUNK(l, blksft,
+ le->le_value_chunk).l_array;
+ ip = la->la_array;
+
+ *value = (uint64_t)ip[0] << 56 | (uint64_t)ip[1] << 48 |
+ (uint64_t)ip[2] << 40 | (uint64_t)ip[3] << 32 |
+ (uint64_t)ip[4] << 24 | (uint64_t)ip[5] << 16 |
+ (uint64_t)ip[6] << 8 | (uint64_t)ip[7];
+
+ return (0);
+ }
+ }
+
+ return (ERR_FSYS_CORRUPT);
+}
+
+/*
+ * Fat ZAP lookup
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+int
+fzap_lookup(dnode_phys_t *zap_dnode, zap_phys_t *zap,
+ char *name, uint64_t *value, char *stack)
+{
+ zap_leaf_phys_t *l;
+ uint64_t hash, idx, blkid;
+ int blksft = zfs_log2(zap_dnode->dn_datablkszsec << DNODE_SHIFT);
+
+ /* Verify if this is a fat zap header block */
+ if (zap->zap_magic != (uint64_t)ZAP_MAGIC)
+ return (ERR_FSYS_CORRUPT);
+
+ hash = zap_hash(zap->zap_salt, name);
+ if (errnum)
+ return (errnum);
+
+ /* get block id from index */
+ if (zap->zap_ptrtbl.zt_numblks != 0) {
+ /* external pointer tables not supported */
+ return (ERR_FSYS_CORRUPT);
+ }
+ idx = ZAP_HASH_IDX(hash, zap->zap_ptrtbl.zt_shift);
+ blkid = ((uint64_t *)zap)[idx + (1<<(blksft-3-1))];
+
+ /* Get the leaf block */
+ l = (zap_leaf_phys_t *)stack;
+ stack += 1<<blksft;
+ if (errnum = dmu_read(zap_dnode, blkid, l, stack))
+ return (errnum);
+
+ return (zap_leaf_lookup(l, blksft, hash, name, value));
+}
+
+/*
+ * Read in the data of a zap object and find the value for a matching
+ * property name.
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+zap_lookup(dnode_phys_t *zap_dnode, char *name, uint64_t *val, char *stack)
+{
+ uint64_t block_type;
+ int size;
+ void *zapbuf;
+
+ /* Read in the first block of the zap object data. */
+ zapbuf = stack;
+ size = zap_dnode->dn_datablkszsec << SPA_MINBLOCKSHIFT;
+ stack += size;
+ if (errnum = dmu_read(zap_dnode, 0, zapbuf, stack))
+ return (errnum);
+
+ block_type = *((uint64_t *)zapbuf);
+
+ if (block_type == ZBT_MICRO) {
+ return (mzap_lookup(zapbuf, size, name, val));
+ } else if (block_type == ZBT_HEADER) {
+ /* this is a fat zap */
+ return (fzap_lookup(zap_dnode, zapbuf, name,
+ val, stack));
+ }
+
+ return (ERR_FSYS_CORRUPT);
+}
+
+/*
+ * Get the dnode of an object number from the metadnode of an object set.
+ *
+ * Input
+ * mdn - metadnode to get the object dnode
+ * objnum - object number for the object dnode
+ * buf - data buffer that holds the returning dnode
+ * stack - scratch area
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+dnode_get(dnode_phys_t *mdn, uint64_t objnum, uint8_t type, dnode_phys_t *buf,
+ char *stack)
+{
+ uint64_t blkid, blksz; /* the block id this object dnode is in */
+ int epbs; /* shift of number of dnodes in a block */
+ int idx; /* index within a block */
+ dnode_phys_t *dnbuf;
+
+ blksz = mdn->dn_datablkszsec << SPA_MINBLOCKSHIFT;
+ epbs = zfs_log2(blksz) - DNODE_SHIFT;
+ blkid = objnum >> epbs;
+ idx = objnum & ((1<<epbs)-1);
+
+ if (dnode_buf != NULL && dnode_mdn == mdn &&
+ objnum >= dnode_start && objnum < dnode_end) {
+ grub_memmove(buf, &dnode_buf[idx], DNODE_SIZE);
+ VERIFY_DN_TYPE(buf, type);
+ return (0);
+ }
+
+ if (dnode_buf && blksz == 1<<DNODE_BLOCK_SHIFT) {
+ dnbuf = dnode_buf;
+ dnode_mdn = mdn;
+ dnode_start = blkid << epbs;
+ dnode_end = (blkid + 1) << epbs;
+ } else {
+ dnbuf = (dnode_phys_t *)stack;
+ stack += blksz;
+ }
+
+ if (errnum = dmu_read(mdn, blkid, (char *)dnbuf, stack))
+ return (errnum);
+
+ grub_memmove(buf, &dnbuf[idx], DNODE_SIZE);
+ VERIFY_DN_TYPE(buf, type);
+
+ return (0);
+}
+
+/*
+ * Check if this is the "menu.lst" file.
+ * str starts with '/'.
+ */
+static int
+is_menu_lst(char *str)
+{
+ char *tptr;
+
+ if ((tptr = grub_strstr(str, "menu.lst")) &&
+ (tptr[8] == '\0' || tptr[8] == ' ') &&
+ *(tptr-1) == '/')
+ return (1);
+
+ return (0);
+}
+
+/*
+ * Get the file dnode for a given file name where mdn is the meta dnode
+ * for this ZFS object set. When found, place the file dnode in dn.
+ * The 'path' argument will be mangled.
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+dnode_get_path(dnode_phys_t *mdn, char *path, dnode_phys_t *dn,
+ char *stack)
+{
+ uint64_t objnum;
+ char *cname, ch;
+
+ if (errnum = dnode_get(mdn, MASTER_NODE_OBJ, DMU_OT_MASTER_NODE,
+ dn, stack))
+ return (errnum);
+
+ if (errnum = zap_lookup(dn, ZFS_ROOT_OBJ, &objnum, stack))
+ return (errnum);
+
+ if (errnum = dnode_get(mdn, objnum, DMU_OT_DIRECTORY_CONTENTS,
+ dn, stack))
+ return (errnum);
+
+ /* skip leading slashes */
+ while (*path == '/')
+ path++;
+
+ while (*path && !isspace(*path)) {
+
+ /* get the next component name */
+ cname = path;
+ while (*path && !isspace(*path) && *path != '/')
+ path++;
+ ch = *path;
+ *path = 0; /* ensure null termination */
+
+ if (errnum = zap_lookup(dn, cname, &objnum, stack))
+ return (errnum);
+
+ if (errnum = dnode_get(mdn, objnum, 0, dn, stack))
+ return (errnum);
+
+ *path = ch;
+ while (*path == '/')
+ path++;
+ }
+
+ /* We found the dnode for this file. Verify if it is a plain file. */
+ VERIFY_DN_TYPE(dn, DMU_OT_PLAIN_FILE_CONTENTS);
+
+ return (0);
+}
+
+/*
+ * Get the default 'bootfs' property value from the rootpool.
+ *
+ * Return:
+ * 0 - success
+ * errnum -failure
+ */
+static int
+get_default_bootfsobj(dnode_phys_t *mosmdn, uint64_t *obj, char *stack)
+{
+ uint64_t objnum = 0;
+ dnode_phys_t *dn = (dnode_phys_t *)stack;
+ stack += DNODE_SIZE;
+
+ if (dnode_get(mosmdn, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_OT_OBJECT_DIRECTORY, dn, stack))
+ return (ERR_FILESYSTEM_NOT_FOUND);
+
+ /*
+ * find the object number for 'pool_props', and get the dnode
+ * of the 'pool_props'.
+ */
+ if (zap_lookup(dn, DMU_POOL_PROPS, &objnum, stack))
+ return (ERR_FILESYSTEM_NOT_FOUND);
+
+ if (dnode_get(mosmdn, objnum, DMU_OT_POOL_PROPS, dn, stack))
+ return (ERR_FILESYSTEM_NOT_FOUND);
+
+ if (zap_lookup(dn, ZPOOL_PROP_BOOTFS, &objnum, stack))
+ return (ERR_FILESYSTEM_NOT_FOUND);
+
+ if (!objnum)
+ return (ERR_FILESYSTEM_NOT_FOUND);
+
+ *obj = objnum;
+ return (0);
+}
+
+/*
+ * Given a MOS metadnode, get the metadnode of a given filesystem name (fsname),
+ * e.g. pool/rootfs, or a given object number (obj), e.g. the object number
+ * of pool/rootfs.
+ *
+ * If no fsname and no obj are given, return the DSL_DIR metadnode.
+ * If fsname is given, return its metadnode and its matching object number.
+ * If only obj is given, return the metadnode for this object number.
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+static int
+get_objset_mdn(dnode_phys_t *mosmdn, char *fsname, uint64_t *obj,
+ dnode_phys_t *mdn, char *stack)
+{
+ uint64_t objnum, headobj;
+ char *cname, ch;
+ blkptr_t *bp;
+ objset_phys_t *osp;
+
+ if (fsname == NULL && obj) {
+ headobj = *obj;
+ goto skip;
+ }
+
+ if (errnum = dnode_get(mosmdn, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_OT_OBJECT_DIRECTORY, mdn, stack))
+ return (errnum);
+
+ if (errnum = zap_lookup(mdn, DMU_POOL_ROOT_DATASET, &objnum,
+ stack))
+ return (errnum);
+
+ if (errnum = dnode_get(mosmdn, objnum, DMU_OT_DSL_DIR, mdn, stack))
+ return (errnum);
+
+ if (fsname == NULL) {
+ headobj =
+ ((dsl_dir_phys_t *)DN_BONUS(mdn))->dd_head_dataset_obj;
+ goto skip;
+ }
+
+ /* take out the pool name */
+ while (*fsname && !isspace(*fsname) && *fsname != '/')
+ fsname++;
+
+ while (*fsname && !isspace(*fsname)) {
+ uint64_t childobj;
+
+ while (*fsname == '/')
+ fsname++;
+
+ cname = fsname;
+ while (*fsname && !isspace(*fsname) && *fsname != '/')
+ fsname++;
+ ch = *fsname;
+ *fsname = 0;
+
+ childobj =
+ ((dsl_dir_phys_t *)DN_BONUS(mdn))->dd_child_dir_zapobj;
+ if (errnum = dnode_get(mosmdn, childobj,
+ DMU_OT_DSL_DIR_CHILD_MAP, mdn, stack))
+ return (errnum);
+
+ if (errnum = zap_lookup(mdn, cname, &objnum, stack))
+ return (errnum);
+
+ if (errnum = dnode_get(mosmdn, objnum, DMU_OT_DSL_DIR,
+ mdn, stack))
+ return (errnum);
+
+ *fsname = ch;
+ }
+ headobj = ((dsl_dir_phys_t *)DN_BONUS(mdn))->dd_head_dataset_obj;
+ if (obj)
+ *obj = headobj;
+
+skip:
+ if (errnum = dnode_get(mosmdn, headobj, DMU_OT_DSL_DATASET, mdn, stack))
+ return (errnum);
+
+ /* TODO: Add snapshot support here - for fsname=snapshot-name */
+
+ bp = &((dsl_dataset_phys_t *)DN_BONUS(mdn))->ds_bp;
+ osp = (objset_phys_t *)stack;
+ stack += sizeof (objset_phys_t);
+ if (errnum = zio_read(bp, osp, stack))
+ return (errnum);
+
+ grub_memmove((char *)mdn, (char *)&osp->os_meta_dnode, DNODE_SIZE);
+
+ return (0);
+}
+
+/*
+ * Parse the packed nvlist and search for the string value of a given name.
+ *
+ * An XDR packed nvlist is encoded as (from nvs_xdr_create) :
+ *
+ * encoding method/host endian (4 bytes)
+ * nvl_version (4 bytes)
+ * nvl_nvflag (4 bytes)
+ * encoded nvpairs:
+ * encoded size of the nvpair (4 bytes)
+ * decoded size of the nvpair (4 bytes)
+ * name string size (4 bytes)
+ * name string data (sizeof(NV_ALIGN4(string))
+ * data type (4 bytes)
+ * # of elements in the nvpair (4 bytes)
+ * data
+ * 2 zero's for the last nvpair
+ * (end of the entire list) (8 bytes)
+ *
+ * Return:
+ * 0 - success
+ * 1 - failure
+ */
+int
+nvlist_lookup_value(char *nvlist, char *name, void *val, int valtype)
+{
+ int name_len, type, nelm, slen, encode_size;
+ char *nvpair, *nvp_name, *strval = val;
+ uint64_t *intval = val;
+
+ /* Verify if the 1st and 2nd byte in the nvlist are valid. */
+ if (nvlist[0] != NV_ENCODE_XDR || nvlist[1] != HOST_ENDIAN)
+ return (1);
+
+ /* skip the header, nvl_version, and nvl_nvflag */
+ nvlist = nvlist + 4 * 3;
+
+ /*
+ * Loop thru the nvpair list
+ * The XDR representation of an integer is in big-endian byte order.
+ */
+ while (encode_size = BSWAP_32(*(uint32_t *)nvlist)) {
+
+ nvpair = nvlist + 4 * 2; /* skip the encode/decode size */
+
+ name_len = BSWAP_32(*(uint32_t *)nvpair);
+ nvpair += 4;
+
+ nvp_name = nvpair;
+ nvpair = nvpair + ((name_len + 3) & ~3); /* align */
+
+ type = BSWAP_32(*(uint32_t *)nvpair);
+ nvpair += 4;
+
+ if ((grub_strncmp(nvp_name, name, name_len) == 0) &&
+ type == valtype) {
+
+ if ((nelm = BSWAP_32(*(uint32_t *)nvpair)) != 1)
+ return (1);
+ nvpair += 4;
+
+ switch (valtype) {
+ case DATA_TYPE_STRING:
+ slen = BSWAP_32(*(uint32_t *)nvpair);
+ nvpair += 4;
+ grub_memmove(strval, nvpair, slen);
+ strval[slen] = '\0';
+ return (0);
+
+ case DATA_TYPE_UINT64:
+ *intval = BSWAP_64(*(uint64_t *)nvpair);
+ return (0);
+ }
+ }
+
+ nvlist += encode_size; /* goto the next nvpair */
+ }
+
+ return (1);
+}
+
+/*
+ * Get the pool name of the root pool from the vdev nvpair list of the label.
+ *
+ * Return:
+ * 0 - success
+ * errnum - failure
+ */
+int
+get_pool_name_value(int label, char *name, void *value, int valtype,
+ char *stack)
+{
+ vdev_phys_t *vdev;
+ uint64_t sector;
+
+ sector = (label * sizeof (vdev_label_t) + VDEV_SKIP_SIZE +
+ VDEV_BOOT_HEADER_SIZE) >> SPA_MINBLOCKSHIFT;
+
+ /* Read in the vdev name-value pair list (112K). */
+ if (devread(sector, 0, VDEV_PHYS_SIZE, stack) == 0)
+ return (ERR_READ);
+
+ vdev = (vdev_phys_t *)stack;
+
+ if (nvlist_lookup_value(vdev->vp_nvlist, name, value, valtype))
+ return (ERR_FSYS_CORRUPT);
+ else
+ return (0);
+}
+
+/*
+ * zfs_mount() locates a valid uberblock of the root pool and read in its MOS
+ * to the memory address MOS.
+ *
+ * Return:
+ * 1 - success
+ * 0 - failure
+ */
+int
+zfs_mount(void)
+{
+ char *stack;
+ int label = 0;
+ uberblock_phys_t *ub_array, *ubbest = NULL;
+ objset_phys_t *osp;
+
+ /* if zfs is already mounted, don't do it again */
+ if (is_zfs_mount == 1)
+ return (1);
+
+ stackbase = ZFS_SCRATCH;
+ stack = stackbase;
+ ub_array = (uberblock_phys_t *)stack;
+ stack += VDEV_UBERBLOCK_RING;
+
+ osp = (objset_phys_t *)stack;
+ stack += sizeof (objset_phys_t);
+
+ /* XXX add back labels support? */
+ for (label = 0; ubbest == NULL && label < (VDEV_LABELS/2); label++) {
+ uint64_t sector = (label * sizeof (vdev_label_t) +
+ VDEV_SKIP_SIZE + VDEV_BOOT_HEADER_SIZE +
+ VDEV_PHYS_SIZE) >> SPA_MINBLOCKSHIFT;
+
+ /* Read in the uberblock ring (128K). */
+ if (devread(sector, 0, VDEV_UBERBLOCK_RING,
+ (char *)ub_array) == 0)
+ continue;
+
+ if ((ubbest = find_bestub(ub_array, label)) != NULL &&
+ zio_read(&ubbest->ubp_uberblock.ub_rootbp, osp, stack)
+ == 0) {
+ uint64_t pool_state;
+
+ VERIFY_OS_TYPE(osp, DMU_OST_META);
+
+ /* Got the MOS. Save it at the memory addr MOS. */
+ grub_memmove(MOS, &osp->os_meta_dnode, DNODE_SIZE);
+
+ if (get_pool_name_value(label, ZPOOL_CONFIG_POOL_STATE,
+ &pool_state, DATA_TYPE_UINT64, stack))
+ return (0);
+
+ if (pool_state == POOL_STATE_DESTROYED)
+ return (0);
+
+ if (get_pool_name_value(label, ZPOOL_CONFIG_POOL_NAME,
+ current_rootpool, DATA_TYPE_STRING, stack))
+ return (0);
+
+ is_zfs_mount = 1;
+ return (1);
+ }
+ }
+
+ return (0);
+}
+
+/*
+ * zfs_open() locates a file in the rootpool by following the
+ * MOS and places the dnode of the file in the memory address DNODE.
+ *
+ * Return:
+ * 1 - success
+ * 0 - failure
+ */
+int
+zfs_open(char *filename)
+{
+ char *stack;
+ dnode_phys_t *mdn;
+
+ file_buf = NULL;
+ stackbase = ZFS_SCRATCH;
+ stack = stackbase;
+
+ mdn = (dnode_phys_t *)stack;
+ stack += sizeof (dnode_phys_t);
+
+ dnode_mdn = NULL;
+ dnode_buf = (dnode_phys_t *)stack;
+ stack += 1<<DNODE_BLOCK_SHIFT;
+
+ /*
+ * menu.lst is placed at the root pool filesystem level,
+ * do not goto 'current_bootfs'.
+ */
+ if (is_menu_lst(filename)) {
+ if (errnum = get_objset_mdn(MOS, NULL, NULL, mdn, stack))
+ return (0);
+
+ current_bootfs_obj = 0;
+ } else {
+ if (current_bootfs[0] == '\0') {
+ /* Get the default root filesystem object number */
+ if (get_default_bootfsobj(MOS,
+ &current_bootfs_obj, stack)) {
+ errnum = ERR_FILESYSTEM_NOT_FOUND;
+ return (0);
+ }
+
+ if (errnum = get_objset_mdn(MOS, NULL,
+ &current_bootfs_obj, mdn, stack))
+ return (0);
+ } else {
+ if (errnum = get_objset_mdn(MOS,
+ current_bootfs, &current_bootfs_obj, mdn, stack))
+ return (0);
+ }
+ }
+
+ if (dnode_get_path(mdn, filename, DNODE, stack)) {
+ errnum = ERR_FILE_NOT_FOUND;
+ return (0);
+ }
+
+ /* get the file size and set the file position to 0 */
+ filemax = ((znode_phys_t *)DN_BONUS(DNODE))->zp_size;
+ filepos = 0;
+
+ dnode_buf = NULL;
+ return (1);
+}
+
+/*
+ * zfs_read reads in the data blocks pointed by the DNODE.
+ *
+ * Return:
+ * len - the length successfully read in to the buffer
+ * 0 - failure
+ */
+int
+zfs_read(char *buf, int len)
+{
+ char *stack;
+ char *tmpbuf;
+ int blksz, length, movesize;
+
+ if (file_buf == NULL) {
+ file_buf = stackbase;
+ stackbase += SPA_MAXBLOCKSIZE;
+ file_start = file_end = 0;
+ }
+ stack = stackbase;
+
+ /*
+ * If offset is in memory, move it into the buffer provided and return.
+ */
+ if (filepos >= file_start && filepos+len <= file_end) {
+ grub_memmove(buf, file_buf + filepos - file_start, len);
+ filepos += len;
+ return (len);
+ }
+
+ blksz = DNODE->dn_datablkszsec << SPA_MINBLOCKSHIFT;
+
+ /*
+ * Entire Dnode is too big to fit into the space available. We
+ * will need to read it in chunks. This could be optimized to
+ * read in as large a chunk as there is space available, but for
+ * now, this only reads in one data block at a time.
+ */
+ length = len;
+ while (length) {
+ /*
+ * Find requested blkid and the offset within that block.
+ */
+ uint64_t blkid = filepos / blksz;
+
+ if (errnum = dmu_read(DNODE, blkid, file_buf, stack))
+ return (0);
+
+ file_start = blkid * blksz;
+ file_end = file_start + blksz;
+
+ movesize = MIN(length, file_end - filepos);
+
+ grub_memmove(buf, file_buf + filepos - file_start,
+ movesize);
+ buf += movesize;
+ length -= movesize;
+ filepos += movesize;
+ }
+
+ return (len);
+}
+
+/*
+ * No-Op
+ */
+int
+zfs_embed(int *start_sector, int needed_sectors)
+{
+ return (1);
+}
+
+#endif /* FSYS_ZFS */
diff --git a/usr/src/grub/grub-0.95/stage2/fsys_zfs.h b/usr/src/grub/grub-0.95/stage2/fsys_zfs.h
new file mode 100644
index 0000000000..e9bad3099c
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/fsys_zfs.h
@@ -0,0 +1,191 @@
+/*
+ * 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 _FSYS_ZFS_H
+#define _FSYS_ZFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef FSYS_ZFS
+
+typedef unsigned long long uint64_t;
+typedef unsigned int uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+typedef unsigned char uchar_t;
+
+#if defined(_LP64) || defined(_I32LPx)
+typedef unsigned long size_t;
+#else
+typedef unsigned int size_t;
+#endif
+
+#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 *)(RAW_ADDR(0x100000)))
+#define DNODE ((dnode_phys_t *)(MOS + DNODE_SIZE))
+#define ZFS_SCRATCH ((char *)(DNODE + DNODE_SIZE))
+
+/*
+ * 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) ((int)&(((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
+
+/*
+ * 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 */
+
+#endif /* !_FSYS_ZFS_H */
diff --git a/usr/src/grub/grub-0.95/stage2/shared.h b/usr/src/grub/grub-0.95/stage2/shared.h
index a3b3e5796a..8e5b181afd 100644
--- a/usr/src/grub/grub-0.95/stage2/shared.h
+++ b/usr/src/grub/grub-0.95/stage2/shared.h
@@ -44,6 +44,9 @@ extern char *grub_scratch_mem;
# define RAW_SEG(x) (x)
#endif
+#define MAXNAMELEN 256
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+
/*
* Integer sizes
*/
@@ -214,6 +217,7 @@ extern char *grub_scratch_mem;
#define STAGE2_ID_ISO9660_STAGE1_5 9
#define STAGE2_ID_UFS2_STAGE1_5 10
#define STAGE2_ID_UFS_STAGE1_5 11
+#define STAGE2_ID_ZFS_STAGE1_5 12
#ifndef STAGE1_5
# define STAGE2_ID STAGE2_ID_STAGE2
@@ -240,6 +244,8 @@ extern char *grub_scratch_mem;
# define STAGE2_ID STAGE2_ID_UFS2_STAGE1_5
# elif defined(FSYS_UFS)
# define STAGE2_ID STAGE2_ID_UFS_STAGE1_5
+# elif defined(FSYS_ZFS)
+# define STAGE2_ID STAGE2_ID_ZFS_STAGE1_5
# else
# error "unknown Stage 2"
# endif
@@ -554,6 +560,7 @@ typedef enum
ERR_NO_DISK_SPACE,
ERR_NUMBER_OVERFLOW,
ERR_BAD_GZIP_CRC,
+ ERR_FILESYSTEM_NOT_FOUND,
MAX_ERR_NUM
} grub_error_t;
@@ -640,6 +647,10 @@ extern int debug;
extern unsigned long current_drive;
extern unsigned long current_partition;
+extern char current_rootpool[MAXNAMELEN];
+extern char current_bootfs[MAXNAMELEN];
+extern unsigned long long current_bootfs_obj;
+extern int is_zfs_mount;
extern int fsys_type;
diff --git a/usr/src/grub/grub-0.95/stage2/ufs.h b/usr/src/grub/grub-0.95/stage2/ufs.h
index 701abff052..29f2f1485f 100644
--- a/usr/src/grub/grub-0.95/stage2/ufs.h
+++ b/usr/src/grub/grub-0.95/stage2/ufs.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -17,7 +17,6 @@
#define UFS_NIADDR 3 /* indirect blocks */
#define MAXMNTLEN 512
#define MAXCSBUFS 32
-#define MAXNAMELEN 256
/* file types */
#define IFMT 0xf000
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/dmu.h b/usr/src/grub/grub-0.95/stage2/zfs-include/dmu.h
new file mode 100644
index 0000000000..e57e45682d
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/dmu.h
@@ -0,0 +1,106 @@
+/*
+ * 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
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * 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"
+
+#endif /* _SYS_DMU_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/dmu_objset.h b/usr/src/grub/grub-0.95/stage2/zfs-include/dmu_objset.h
new file mode 100644
index 0000000000..6345c13988
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/dmu_objset.h
@@ -0,0 +1,37 @@
+/*
+ * 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_OBJSET_H
+#define _SYS_DMU_OBJSET_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+typedef struct objset_phys {
+ dnode_phys_t os_meta_dnode;
+ zil_header_t os_zil_header;
+ uint64_t os_type;
+ char os_pad[1024 - sizeof (dnode_phys_t) - sizeof (zil_header_t) -
+ sizeof (uint64_t)];
+} objset_phys_t;
+
+#endif /* _SYS_DMU_OBJSET_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/dnode.h b/usr/src/grub/grub-0.95/stage2/zfs-include/dnode.h
new file mode 100644
index 0000000000..80f08fa2ca
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/dnode.h
@@ -0,0 +1,78 @@
+/*
+ * 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_DNODE_H
+#define _SYS_DNODE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Fixed constants.
+ */
+#define DNODE_SHIFT 9 /* 512 bytes */
+#define DN_MIN_INDBLKSHIFT 10 /* 1k */
+#define DN_MAX_INDBLKSHIFT 14 /* 16k */
+#define DNODE_BLOCK_SHIFT 14 /* 16k */
+#define DNODE_CORE_SIZE 64 /* 64 bytes for dnode sans blkptrs */
+#define DN_MAX_OBJECT_SHIFT 48 /* 256 trillion (zfs_fid_t limit) */
+#define DN_MAX_OFFSET_SHIFT 64 /* 2^64 bytes in a dnode */
+
+/*
+ * Derived constants.
+ */
+#define DNODE_SIZE (1 << DNODE_SHIFT)
+#define DN_MAX_NBLKPTR ((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT)
+#define DN_MAX_BONUSLEN (DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT))
+#define DN_MAX_OBJECT (1ULL << DN_MAX_OBJECT_SHIFT)
+
+#define DNODES_PER_BLOCK_SHIFT (DNODE_BLOCK_SHIFT - DNODE_SHIFT)
+#define DNODES_PER_BLOCK (1ULL << DNODES_PER_BLOCK_SHIFT)
+#define DNODES_PER_LEVEL_SHIFT (DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT)
+
+#define DN_BONUS(dnp) ((void*)((dnp)->dn_bonus + \
+ (((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t))))
+
+typedef struct dnode_phys {
+ uint8_t dn_type; /* dmu_object_type_t */
+ uint8_t dn_indblkshift; /* ln2(indirect block size) */
+ uint8_t dn_nlevels; /* 1=dn_blkptr->data blocks */
+ uint8_t dn_nblkptr; /* length of dn_blkptr */
+ uint8_t dn_bonustype; /* type of data in bonus buffer */
+ uint8_t dn_checksum; /* ZIO_CHECKSUM type */
+ uint8_t dn_compress; /* ZIO_COMPRESS type */
+ uint8_t dn_flags; /* DNODE_FLAG_* */
+ uint16_t dn_datablkszsec; /* data block size in 512b sectors */
+ uint16_t dn_bonuslen; /* length of dn_bonus */
+ uint8_t dn_pad2[4];
+
+ /* accounting is protected by dn_dirty_mtx */
+ uint64_t dn_maxblkid; /* largest allocated block ID */
+ uint64_t dn_used; /* bytes (or sectors) of disk space */
+
+ uint64_t dn_pad3[4];
+
+ blkptr_t dn_blkptr[1];
+ uint8_t dn_bonus[DN_MAX_BONUSLEN];
+} dnode_phys_t;
+
+#endif /* _SYS_DNODE_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dataset.h b/usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dataset.h
new file mode 100644
index 0000000000..a8c60c4fcc
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dataset.h
@@ -0,0 +1,55 @@
+/*
+ * 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_DSL_DATASET_H
+#define _SYS_DSL_DATASET_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+typedef struct dsl_dataset_phys {
+ uint64_t ds_dir_obj;
+ uint64_t ds_prev_snap_obj;
+ uint64_t ds_prev_snap_txg;
+ uint64_t ds_next_snap_obj;
+ uint64_t ds_snapnames_zapobj; /* zap obj of snaps; ==0 for snaps */
+ uint64_t ds_num_children; /* clone/snap children; ==0 for head */
+ uint64_t ds_creation_time; /* seconds since 1970 */
+ uint64_t ds_creation_txg;
+ uint64_t ds_deadlist_obj;
+ uint64_t ds_used_bytes;
+ uint64_t ds_compressed_bytes;
+ uint64_t ds_uncompressed_bytes;
+ uint64_t ds_unique_bytes; /* only relevant to snapshots */
+ /*
+ * The ds_fsid_guid is a 56-bit ID that can change to avoid
+ * collisions. The ds_guid is a 64-bit ID that will never
+ * change, so there is a small probability that it will collide.
+ */
+ uint64_t ds_fsid_guid;
+ uint64_t ds_guid;
+ uint64_t ds_flags;
+ blkptr_t ds_bp;
+ uint64_t ds_pad[8]; /* pad out to 320 bytes for good measure */
+} dsl_dataset_phys_t;
+
+#endif /* _SYS_DSL_DATASET_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dir.h b/usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dir.h
new file mode 100644
index 0000000000..7fc8b1eaba
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/dsl_dir.h
@@ -0,0 +1,50 @@
+/*
+ * 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_DSL_DIR_H
+#define _SYS_DSL_DIR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+typedef struct dsl_dir_phys {
+ uint64_t dd_creation_time; /* not actually used */
+ uint64_t dd_head_dataset_obj;
+ uint64_t dd_parent_obj;
+ uint64_t dd_clone_parent_obj;
+ uint64_t dd_child_dir_zapobj;
+ /*
+ * how much space our children are accounting for; for leaf
+ * datasets, == physical space used by fs + snaps
+ */
+ uint64_t dd_used_bytes;
+ uint64_t dd_compressed_bytes;
+ uint64_t dd_uncompressed_bytes;
+ /* Administrative quota setting */
+ uint64_t dd_quota;
+ /* Administrative reservation setting */
+ uint64_t dd_reserved;
+ uint64_t dd_props_zapobj;
+ uint64_t dd_pad[21]; /* pad out to 256 bytes for good measure */
+} dsl_dir_phys_t;
+
+#endif /* _SYS_DSL_DIR_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/spa.h b/usr/src/grub/grub-0.95/stage2/zfs-include/spa.h
new file mode 100644
index 0000000000..a034e01da4
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/spa.h
@@ -0,0 +1,285 @@
+/*
+ * 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_SPA_H
+#define _SYS_SPA_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * General-purpose 32-bit and 64-bit bitfield encodings.
+ */
+#define BF32_DECODE(x, low, len) P2PHASE((x) >> (low), 1U << (len))
+#define BF64_DECODE(x, low, len) P2PHASE((x) >> (low), 1ULL << (len))
+#define BF32_ENCODE(x, low, len) (P2PHASE((x), 1U << (len)) << (low))
+#define BF64_ENCODE(x, low, len) (P2PHASE((x), 1ULL << (len)) << (low))
+
+#define BF32_GET(x, low, len) BF32_DECODE(x, low, len)
+#define BF64_GET(x, low, len) BF64_DECODE(x, low, len)
+
+#define BF32_SET(x, low, len, val) \
+ ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
+#define BF64_SET(x, low, len, val) \
+ ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
+
+#define BF32_GET_SB(x, low, len, shift, bias) \
+ ((BF32_GET(x, low, len) + (bias)) << (shift))
+#define BF64_GET_SB(x, low, len, shift, bias) \
+ ((BF64_GET(x, low, len) + (bias)) << (shift))
+
+#define BF32_SET_SB(x, low, len, shift, bias, val) \
+ BF32_SET(x, low, len, ((val) >> (shift)) - (bias))
+#define BF64_SET_SB(x, low, len, shift, bias, val) \
+ BF64_SET(x, low, len, ((val) >> (shift)) - (bias))
+
+/*
+ * We currently support nine block sizes, from 512 bytes to 128K.
+ * We could go higher, but the benefits are near-zero and the cost
+ * of COWing a giant block to modify one byte would become excessive.
+ */
+#define SPA_MINBLOCKSHIFT 9
+#define SPA_MAXBLOCKSHIFT 17
+#define SPA_MINBLOCKSIZE (1ULL << SPA_MINBLOCKSHIFT)
+#define SPA_MAXBLOCKSIZE (1ULL << SPA_MAXBLOCKSHIFT)
+
+#define SPA_BLOCKSIZES (SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)
+
+/*
+ * The DVA size encodings for LSIZE and PSIZE support blocks up to 32MB.
+ * The ASIZE encoding should be at least 64 times larger (6 more bits)
+ * to support up to 4-way RAID-Z mirror mode with worst-case gang block
+ * overhead, three DVAs per bp, plus one more bit in case we do anything
+ * else that expands the ASIZE.
+ */
+#define SPA_LSIZEBITS 16 /* LSIZE up to 32M (2^16 * 512) */
+#define SPA_PSIZEBITS 16 /* PSIZE up to 32M (2^16 * 512) */
+#define SPA_ASIZEBITS 24 /* ASIZE up to 64 times larger */
+
+/*
+ * All SPA data is represented by 128-bit data virtual addresses (DVAs).
+ * The members of the dva_t should be considered opaque outside the SPA.
+ */
+typedef struct dva {
+ uint64_t dva_word[2];
+} dva_t;
+
+/*
+ * Each block has a 256-bit checksum -- strong enough for cryptographic hashes.
+ */
+typedef struct zio_cksum {
+ uint64_t zc_word[4];
+} zio_cksum_t;
+
+/*
+ * Each block is described by its DVAs, time of birth, checksum, etc.
+ * The word-by-word, bit-by-bit layout of the blkptr is as follows:
+ *
+ * 64 56 48 40 32 24 16 8 0
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 0 | vdev1 | GRID | ASIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 1 |G| offset1 |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 2 | vdev2 | GRID | ASIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 3 |G| offset2 |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 4 | vdev3 | GRID | ASIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 5 |G| offset3 |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 6 |E| lvl | type | cksum | comp | PSIZE | LSIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 7 | padding |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 8 | padding |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 9 | padding |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * a | birth txg |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * b | fill count |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * c | checksum[0] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * d | checksum[1] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * e | checksum[2] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * f | checksum[3] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ *
+ * Legend:
+ *
+ * vdev virtual device ID
+ * offset offset into virtual device
+ * LSIZE logical size
+ * PSIZE physical size (after compression)
+ * ASIZE allocated size (including RAID-Z parity and gang block headers)
+ * GRID RAID-Z layout information (reserved for future use)
+ * cksum checksum function
+ * comp compression function
+ * G gang block indicator
+ * E endianness
+ * type DMU object type
+ * lvl level of indirection
+ * birth txg transaction group in which the block was born
+ * fill count number of non-zero blocks under this bp
+ * checksum[4] 256-bit checksum of the data this bp describes
+ */
+typedef struct blkptr {
+ dva_t blk_dva[3]; /* 128-bit Data Virtual Address */
+ uint64_t blk_prop; /* size, compression, type, etc */
+ uint64_t blk_pad[3]; /* Extra space for the future */
+ uint64_t blk_birth; /* transaction group at birth */
+ uint64_t blk_fill; /* fill count */
+ zio_cksum_t blk_cksum; /* 256-bit checksum */
+} blkptr_t;
+
+#define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */
+#define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */
+
+/*
+ * Macros to get and set fields in a bp or DVA.
+ */
+#define DVA_GET_ASIZE(dva) \
+ BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0)
+#define DVA_SET_ASIZE(dva, x) \
+ BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x)
+
+#define DVA_GET_GRID(dva) BF64_GET((dva)->dva_word[0], 24, 8)
+#define DVA_SET_GRID(dva, x) BF64_SET((dva)->dva_word[0], 24, 8, x)
+
+#define DVA_GET_VDEV(dva) BF64_GET((dva)->dva_word[0], 32, 32)
+#define DVA_SET_VDEV(dva, x) BF64_SET((dva)->dva_word[0], 32, 32, x)
+
+#define DVA_GET_OFFSET(dva) \
+ BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
+#define DVA_SET_OFFSET(dva, x) \
+ BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x)
+
+#define DVA_GET_GANG(dva) BF64_GET((dva)->dva_word[1], 63, 1)
+#define DVA_SET_GANG(dva, x) BF64_SET((dva)->dva_word[1], 63, 1, x)
+
+#define BP_GET_LSIZE(bp) \
+ (BP_IS_HOLE(bp) ? 0 : \
+ BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1))
+#define BP_SET_LSIZE(bp, x) \
+ BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
+
+#define BP_GET_PSIZE(bp) \
+ BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1)
+#define BP_SET_PSIZE(bp, x) \
+ BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
+
+#define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8)
+#define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x)
+
+#define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8)
+#define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x)
+
+#define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8)
+#define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x)
+
+#define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5)
+#define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x)
+
+#define BP_GET_BYTEORDER(bp) (0 - BF64_GET((bp)->blk_prop, 63, 1))
+#define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x)
+
+#define BP_GET_ASIZE(bp) \
+ (DVA_GET_ASIZE(&(bp)->blk_dva[0]) + DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
+ DVA_GET_ASIZE(&(bp)->blk_dva[2]))
+
+#define BP_GET_UCSIZE(bp) \
+ ((BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) ? \
+ BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp));
+
+#define BP_GET_NDVAS(bp) \
+ (!!DVA_GET_ASIZE(&(bp)->blk_dva[0]) + \
+ !!DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
+ !!DVA_GET_ASIZE(&(bp)->blk_dva[2]))
+
+#define BP_COUNT_GANG(bp) \
+ (DVA_GET_GANG(&(bp)->blk_dva[0]) + \
+ DVA_GET_GANG(&(bp)->blk_dva[1]) + \
+ DVA_GET_GANG(&(bp)->blk_dva[2]))
+
+#define DVA_EQUAL(dva1, dva2) \
+ ((dva1)->dva_word[1] == (dva2)->dva_word[1] && \
+ (dva1)->dva_word[0] == (dva2)->dva_word[0])
+
+#define ZIO_CHECKSUM_EQUAL(zc1, zc2) \
+ (0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
+ ((zc1).zc_word[1] - (zc2).zc_word[1]) | \
+ ((zc1).zc_word[2] - (zc2).zc_word[2]) | \
+ ((zc1).zc_word[3] - (zc2).zc_word[3])))
+
+
+#define DVA_IS_VALID(dva) (DVA_GET_ASIZE(dva) != 0)
+
+#define ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3) \
+{ \
+ (zcp)->zc_word[0] = w0; \
+ (zcp)->zc_word[1] = w1; \
+ (zcp)->zc_word[2] = w2; \
+ (zcp)->zc_word[3] = w3; \
+}
+
+#define BP_IDENTITY(bp) (&(bp)->blk_dva[0])
+#define BP_IS_GANG(bp) DVA_GET_GANG(BP_IDENTITY(bp))
+#define BP_IS_HOLE(bp) ((bp)->blk_birth == 0)
+#define BP_IS_OLDER(bp, txg) (!BP_IS_HOLE(bp) && (bp)->blk_birth < (txg))
+
+#define BP_ZERO(bp) \
+{ \
+ (bp)->blk_dva[0].dva_word[0] = 0; \
+ (bp)->blk_dva[0].dva_word[1] = 0; \
+ (bp)->blk_dva[1].dva_word[0] = 0; \
+ (bp)->blk_dva[1].dva_word[1] = 0; \
+ (bp)->blk_dva[2].dva_word[0] = 0; \
+ (bp)->blk_dva[2].dva_word[1] = 0; \
+ (bp)->blk_prop = 0; \
+ (bp)->blk_pad[0] = 0; \
+ (bp)->blk_pad[1] = 0; \
+ (bp)->blk_pad[2] = 0; \
+ (bp)->blk_birth = 0; \
+ (bp)->blk_fill = 0; \
+ ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \
+}
+
+/*
+ * Note: the byteorder is either 0 or -1, both of which are palindromes.
+ * This simplifies the endianness handling a bit.
+ */
+#ifdef _BIG_ENDIAN
+#define ZFS_HOST_BYTEORDER (0ULL)
+#else
+#define ZFS_HOST_BYTEORDER (-1ULL)
+#endif
+
+#define BP_SHOULD_BYTESWAP(bp) (BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER)
+
+#define BP_SPRINTF_LEN 320
+
+#endif /* _SYS_SPA_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/uberblock_impl.h b/usr/src/grub/grub-0.95/stage2/zfs-include/uberblock_impl.h
new file mode 100644
index 0000000000..9e70ac0a71
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/uberblock_impl.h
@@ -0,0 +1,51 @@
+/*
+ * 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_UBERBLOCK_IMPL_H
+#define _SYS_UBERBLOCK_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * The uberblock version is incremented whenever an incompatible on-disk
+ * format change is made to the SPA, DMU, or ZAP.
+ *
+ * Note: the first two fields should never be moved. When a storage pool
+ * is opened, the uberblock must be read off the disk before the version
+ * can be checked. If the ub_version field is moved, we may not detect
+ * version mismatch. If the ub_magic field is moved, applications that
+ * expect the magic number in the first word won't work.
+ */
+#define UBERBLOCK_MAGIC 0x00bab10c /* oo-ba-bloc! */
+#define UBERBLOCK_SHIFT 10 /* up to 1K */
+
+struct uberblock {
+ uint64_t ub_magic; /* UBERBLOCK_MAGIC */
+ uint64_t ub_version; /* ZFS_VERSION */
+ uint64_t ub_txg; /* txg of last sync */
+ uint64_t ub_guid_sum; /* sum of all vdev guids */
+ uint64_t ub_timestamp; /* UTC time of last sync */
+ blkptr_t ub_rootbp; /* MOS objset_phys_t */
+};
+
+#endif /* _SYS_UBERBLOCK_IMPL_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/vdev_impl.h b/usr/src/grub/grub-0.95/stage2/zfs-include/vdev_impl.h
new file mode 100644
index 0000000000..93c3689acb
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/vdev_impl.h
@@ -0,0 +1,72 @@
+/*
+ * 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_VDEV_IMPL_H
+#define _SYS_VDEV_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#define VDEV_SKIP_SIZE (8 << 10)
+#define VDEV_BOOT_HEADER_SIZE (8 << 10)
+#define VDEV_PHYS_SIZE (112 << 10)
+#define VDEV_UBERBLOCK_RING (128 << 10)
+
+/* ZFS boot block */
+#define VDEV_BOOT_MAGIC 0x2f5b007b10cULL
+#define VDEV_BOOT_VERSION 1 /* version number */
+
+typedef struct vdev_boot_header {
+ uint64_t vb_magic; /* VDEV_BOOT_MAGIC */
+ uint64_t vb_version; /* VDEV_BOOT_VERSION */
+ uint64_t vb_offset; /* start offset (bytes) */
+ uint64_t vb_size; /* size (bytes) */
+ char vb_pad[VDEV_BOOT_HEADER_SIZE - 4 * sizeof (uint64_t)];
+} vdev_boot_header_t;
+
+typedef struct vdev_phys {
+ char vp_nvlist[VDEV_PHYS_SIZE - sizeof (zio_block_tail_t)];
+ zio_block_tail_t vp_zbt;
+} vdev_phys_t;
+
+typedef struct vdev_label {
+ char vl_pad[VDEV_SKIP_SIZE]; /* 8K */
+ vdev_boot_header_t vl_boot_header; /* 8K */
+ vdev_phys_t vl_vdev_phys; /* 112K */
+ char vl_uberblock[VDEV_UBERBLOCK_RING]; /* 128K */
+} vdev_label_t; /* 256K total */
+
+/*
+ * Size and offset of embedded boot loader region on each label.
+ * The total size of the first two labels plus the boot area is 4MB.
+ */
+#define VDEV_BOOT_OFFSET (2 * sizeof (vdev_label_t))
+#define VDEV_BOOT_SIZE (7ULL << 19) /* 3.5M */
+
+/*
+ * Size of label regions at the start and end of each leaf device.
+ */
+#define VDEV_LABEL_START_SIZE (2 * sizeof (vdev_label_t) + VDEV_BOOT_SIZE)
+#define VDEV_LABEL_END_SIZE (2 * sizeof (vdev_label_t))
+#define VDEV_LABELS 4
+
+#endif /* _SYS_VDEV_IMPL_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zap_impl.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zap_impl.h
new file mode 100644
index 0000000000..8ffd8c670d
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zap_impl.h
@@ -0,0 +1,112 @@
+/*
+ * 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_IMPL_H
+#define _SYS_ZAP_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#define ZAP_MAGIC 0x2F52AB2ABULL
+
+#define ZAP_HASHBITS 28
+#define MZAP_ENT_LEN 64
+#define MZAP_NAME_LEN (MZAP_ENT_LEN - 8 - 4 - 2)
+#define MZAP_MAX_BLKSHIFT SPA_MAXBLOCKSHIFT
+#define MZAP_MAX_BLKSZ (1 << MZAP_MAX_BLKSHIFT)
+
+typedef struct mzap_ent_phys {
+ uint64_t mze_value;
+ uint32_t mze_cd;
+ uint16_t mze_pad; /* in case we want to chain them someday */
+ char mze_name[MZAP_NAME_LEN];
+} mzap_ent_phys_t;
+
+typedef struct mzap_phys {
+ uint64_t mz_block_type; /* ZBT_MICRO */
+ uint64_t mz_salt;
+ uint64_t mz_pad[6];
+ mzap_ent_phys_t mz_chunk[1];
+ /* actually variable size depending on block size */
+} mzap_phys_t;
+
+/*
+ * The (fat) zap is stored in one object. It is an array of
+ * 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
+ *
+ * ptrtbl fits in first block:
+ * [zap_phys_t zap_ptrtbl_shift < 6] [zap_leaf_t] ...
+ *
+ * ptrtbl too big for first block:
+ * [zap_phys_t zap_ptrtbl_shift >= 6] [zap_leaf_t] [ptrtbl] ...
+ *
+ */
+
+#define ZBT_LEAF ((1ULL << 63) + 0)
+#define ZBT_HEADER ((1ULL << 63) + 1)
+#define ZBT_MICRO ((1ULL << 63) + 3)
+/* any other values are ptrtbl blocks */
+
+/*
+ * the embedded pointer table takes up half a block:
+ * block size / entry size (2^3) / 2
+ */
+#define ZAP_EMBEDDED_PTRTBL_SHIFT(zap) (FZAP_BLOCK_SHIFT(zap) - 3 - 1)
+
+/*
+ * The embedded pointer table starts half-way through the block. Since
+ * the pointer table itself is half the block, it starts at (64-bit)
+ * word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
+ */
+#define ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
+ ((uint64_t *)(zap)->zap_f.zap_phys) \
+ [(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
+
+/*
+ * TAKE NOTE:
+ * If zap_phys_t is modified, zap_byteswap() must be modified.
+ */
+typedef struct zap_phys {
+ uint64_t zap_block_type; /* ZBT_HEADER */
+ uint64_t zap_magic; /* ZAP_MAGIC */
+
+ struct zap_table_phys {
+ uint64_t zt_blk; /* starting block number */
+ uint64_t zt_numblks; /* number of blocks */
+ uint64_t zt_shift; /* bits to index it */
+ uint64_t zt_nextblk; /* next (larger) copy start block */
+ uint64_t zt_blks_copied; /* number source blocks copied */
+ } zap_ptrtbl;
+
+ uint64_t zap_freeblk; /* the next free block */
+ uint64_t zap_num_leafs; /* number of leafs */
+ uint64_t zap_num_entries; /* number of entries */
+ uint64_t zap_salt; /* salt to stir into hash function */
+ /*
+ * This structure is followed by padding, and then the embedded
+ * pointer table. The embedded pointer table takes up second
+ * half of the block. It is accessed using the
+ * ZAP_EMBEDDED_PTRTBL_ENT() macro.
+ */
+} zap_phys_t;
+
+#endif /* _SYS_ZAP_IMPL_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zap_leaf.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zap_leaf.h
new file mode 100644
index 0000000000..4ff35158cf
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zap_leaf.h
@@ -0,0 +1,102 @@
+/*
+ * 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
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#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 */
+ uint8_t la_array[ZAP_LEAF_ARRAY_BYTES];
+ 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 */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zfs.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zfs.h
new file mode 100644
index 0000000000..0d7177bca3
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zfs.h
@@ -0,0 +1,96 @@
+/*
+ * 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_FS_ZFS_H
+#define _SYS_FS_ZFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * On-disk version number.
+ */
+#define ZFS_VERSION_1 1ULL
+#define ZFS_VERSION_2 2ULL
+#define ZFS_VERSION_3 3ULL
+#define ZFS_VERSION_4 4ULL
+#define ZFS_VERSION_5 5ULL
+#define ZFS_VERSION_6 6ULL
+#define ZFS_VERSION ZFS_VERSION_6
+
+/*
+ * The following are configuration names used in the nvlist describing a pool's
+ * configuration.
+ */
+#define ZPOOL_CONFIG_VERSION "version"
+#define ZPOOL_CONFIG_POOL_NAME "name"
+#define ZPOOL_CONFIG_POOL_STATE "state"
+#define ZPOOL_CONFIG_POOL_TXG "txg"
+#define ZPOOL_CONFIG_POOL_GUID "pool_guid"
+#define ZPOOL_CONFIG_CREATE_TXG "create_txg"
+#define ZPOOL_CONFIG_TOP_GUID "top_guid"
+#define ZPOOL_CONFIG_VDEV_TREE "vdev_tree"
+#define ZPOOL_CONFIG_TYPE "type"
+#define ZPOOL_CONFIG_CHILDREN "children"
+#define ZPOOL_CONFIG_ID "id"
+#define ZPOOL_CONFIG_GUID "guid"
+#define ZPOOL_CONFIG_PATH "path"
+#define ZPOOL_CONFIG_DEVID "devid"
+#define ZPOOL_CONFIG_METASLAB_ARRAY "metaslab_array"
+#define ZPOOL_CONFIG_METASLAB_SHIFT "metaslab_shift"
+#define ZPOOL_CONFIG_ASHIFT "ashift"
+#define ZPOOL_CONFIG_ASIZE "asize"
+#define ZPOOL_CONFIG_DTL "DTL"
+#define ZPOOL_CONFIG_STATS "stats"
+#define ZPOOL_CONFIG_WHOLE_DISK "whole_disk"
+#define ZPOOL_CONFIG_OFFLINE "offline"
+#define ZPOOL_CONFIG_ERRCOUNT "error_count"
+#define ZPOOL_CONFIG_NOT_PRESENT "not_present"
+#define ZPOOL_CONFIG_SPARES "spares"
+#define ZPOOL_CONFIG_IS_SPARE "is_spare"
+#define ZPOOL_CONFIG_NPARITY "nparity"
+
+#define VDEV_TYPE_ROOT "root"
+#define VDEV_TYPE_MIRROR "mirror"
+#define VDEV_TYPE_REPLACING "replacing"
+#define VDEV_TYPE_RAIDZ "raidz"
+#define VDEV_TYPE_DISK "disk"
+#define VDEV_TYPE_FILE "file"
+#define VDEV_TYPE_MISSING "missing"
+#define VDEV_TYPE_SPARE "spare"
+
+/*
+ * pool state. The following states are written to disk as part of the normal
+ * SPA lifecycle: ACTIVE, EXPORTED, DESTROYED, SPARE. The remaining states are
+ * software abstractions used at various levels to communicate pool state.
+ */
+typedef enum pool_state {
+ POOL_STATE_ACTIVE = 0, /* In active use */
+ POOL_STATE_EXPORTED, /* Explicitly exported */
+ POOL_STATE_DESTROYED, /* Explicitly destroyed */
+ POOL_STATE_SPARE, /* Reserved for hot spare use */
+ POOL_STATE_UNINITIALIZED, /* Internal spa_t state */
+ POOL_STATE_UNAVAIL, /* Internal libzfs state */
+ POOL_STATE_POTENTIALLY_ACTIVE /* Internal libzfs state */
+} pool_state_t;
+
+#endif /* _SYS_FS_ZFS_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zfs_acl.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zfs_acl.h
new file mode 100644
index 0000000000..68e87a2e5a
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zfs_acl.h
@@ -0,0 +1,52 @@
+/*
+ * 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_FS_ZFS_ACL_H
+#define _SYS_FS_ZFS_ACL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#if defined(_LP64) || defined(_I32LPx)
+typedef int uid_t; /* UID type */
+#else
+typedef long uid_t; /* (historical version) */
+#endif
+
+typedef struct ace {
+ uid_t a_who; /* uid or gid */
+ uint32_t a_access_mask; /* read,write,... */
+ uint16_t a_flags; /* see below */
+ uint16_t a_type; /* allow or deny */
+} ace_t;
+
+#define ACE_SLOT_CNT 6
+
+typedef struct zfs_znode_acl {
+ uint64_t z_acl_extern_obj; /* ext acl pieces */
+ uint32_t z_acl_count; /* Number of ACEs */
+ uint16_t z_acl_version; /* acl version */
+ uint16_t z_acl_pad; /* pad */
+ ace_t z_ace_data[ACE_SLOT_CNT]; /* 6 standard ACEs */
+} zfs_znode_acl_t;
+
+#endif /* _SYS_FS_ZFS_ACL_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zfs_znode.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zfs_znode.h
new file mode 100644
index 0000000000..0f96269c7a
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zfs_znode.h
@@ -0,0 +1,65 @@
+/*
+ * 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_FS_ZFS_ZNODE_H
+#define _SYS_FS_ZFS_ZNODE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#define MASTER_NODE_OBJ 1
+#define ZFS_ROOT_OBJ "ROOT"
+
+/*
+ * This is the persistent portion of the znode. It is stored
+ * in the "bonus buffer" of the file. Short symbolic links
+ * are also stored in the bonus buffer.
+ */
+typedef struct znode_phys {
+ uint64_t zp_atime[2]; /* 0 - last file access time */
+ uint64_t zp_mtime[2]; /* 16 - last file modification time */
+ uint64_t zp_ctime[2]; /* 32 - last file change time */
+ uint64_t zp_crtime[2]; /* 48 - creation time */
+ uint64_t zp_gen; /* 64 - generation (txg of creation) */
+ uint64_t zp_mode; /* 72 - file mode bits */
+ uint64_t zp_size; /* 80 - size of file */
+ uint64_t zp_parent; /* 88 - directory parent (`..') */
+ uint64_t zp_links; /* 96 - number of links to file */
+ uint64_t zp_xattr; /* 104 - DMU object for xattrs */
+ uint64_t zp_rdev; /* 112 - dev_t for VBLK & VCHR files */
+ uint64_t zp_flags; /* 120 - persistent flags */
+ uint64_t zp_uid; /* 128 - file owner */
+ uint64_t zp_gid; /* 136 - owning group */
+ uint64_t zp_pad[4]; /* 144 - future */
+ zfs_znode_acl_t zp_acl; /* 176 - 263 ACL */
+ /*
+ * Data may pad out any remaining bytes in the znode buffer, eg:
+ *
+ * |<---------------------- dnode_phys (512) ------------------------>|
+ * |<-- dnode (192) --->|<----------- "bonus" buffer (320) ---------->|
+ * |<---- znode (264) ---->|<---- data (56) ---->|
+ *
+ * At present, we only use this space to store symbolic links.
+ */
+} znode_phys_t;
+
+#endif /* _SYS_FS_ZFS_ZNODE_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zil.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zil.h
new file mode 100644
index 0000000000..11ab4b5a3a
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zil.h
@@ -0,0 +1,53 @@
+/*
+ * 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_ZIL_H
+#define _SYS_ZIL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Intent log format:
+ *
+ * Each objset has its own intent log. The log header (zil_header_t)
+ * for objset N's intent log is kept in the Nth object of the SPA's
+ * intent_log objset. The log header points to a chain of log blocks,
+ * each of which contains log records (i.e., transactions) followed by
+ * a log block trailer (zil_trailer_t). The format of a log record
+ * depends on the record (or transaction) type, but all records begin
+ * with a common structure that defines the type, length, and txg.
+ */
+
+/*
+ * Intent log header - this on disk structure holds fields to manage
+ * the log. All fields are 64 bit to easily handle cross architectures.
+ */
+typedef struct zil_header {
+ uint64_t zh_claim_txg; /* txg in which log blocks were claimed */
+ uint64_t zh_replay_seq; /* highest replayed sequence number */
+ blkptr_t zh_log; /* log chain */
+ uint64_t zh_claim_seq; /* highest claimed sequence number */
+ uint64_t zh_pad[5];
+} zil_header_t;
+
+#endif /* _SYS_ZIL_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zio.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zio.h
new file mode 100644
index 0000000000..feb030b476
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zio.h
@@ -0,0 +1,83 @@
+/*
+ * 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 _ZIO_H
+#define _ZIO_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#define ZBT_MAGIC 0x210da7ab10c7a11ULL /* zio data bloc tail */
+
+typedef struct zio_block_tail {
+ uint64_t zbt_magic; /* for validation, endianness */
+ zio_cksum_t zbt_cksum; /* 256-bit checksum */
+} zio_block_tail_t;
+
+/*
+ * Gang block headers are self-checksumming and contain an array
+ * of block pointers.
+ */
+#define SPA_GANGBLOCKSIZE SPA_MINBLOCKSIZE
+#define SPA_GBH_NBLKPTRS ((SPA_GANGBLOCKSIZE - \
+ sizeof (zio_block_tail_t)) / sizeof (blkptr_t))
+#define SPA_GBH_FILLER ((SPA_GANGBLOCKSIZE - \
+ sizeof (zio_block_tail_t) - \
+ (SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
+ sizeof (uint64_t))
+
+#define ZIO_GET_IOSIZE(zio) \
+ (BP_IS_GANG((zio)->io_bp) ? \
+ SPA_GANGBLOCKSIZE : BP_GET_PSIZE((zio)->io_bp))
+
+typedef struct zio_gbh {
+ blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS];
+ uint64_t zg_filler[SPA_GBH_FILLER];
+ zio_block_tail_t zg_tail;
+} zio_gbh_phys_t;
+
+enum zio_checksum {
+ ZIO_CHECKSUM_INHERIT = 0,
+ ZIO_CHECKSUM_ON,
+ ZIO_CHECKSUM_OFF,
+ ZIO_CHECKSUM_LABEL,
+ ZIO_CHECKSUM_GANG_HEADER,
+ ZIO_CHECKSUM_ZILOG,
+ ZIO_CHECKSUM_FLETCHER_2,
+ ZIO_CHECKSUM_FLETCHER_4,
+ ZIO_CHECKSUM_SHA256,
+ ZIO_CHECKSUM_FUNCTIONS
+};
+
+#define ZIO_CHECKSUM_ON_VALUE ZIO_CHECKSUM_FLETCHER_2
+#define ZIO_CHECKSUM_DEFAULT ZIO_CHECKSUM_ON
+
+enum zio_compress {
+ ZIO_COMPRESS_INHERIT = 0,
+ ZIO_COMPRESS_ON,
+ ZIO_COMPRESS_OFF,
+ ZIO_COMPRESS_LZJB,
+ ZIO_COMPRESS_EMPTY,
+ ZIO_COMPRESS_FUNCTIONS
+};
+
+#endif /* _ZIO_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs-include/zio_checksum.h b/usr/src/grub/grub-0.95/stage2/zfs-include/zio_checksum.h
new file mode 100644
index 0000000000..a8376d58e3
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs-include/zio_checksum.h
@@ -0,0 +1,44 @@
+/*
+ * 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_ZIO_CHECKSUM_H
+#define _SYS_ZIO_CHECKSUM_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Signature for checksum functions.
+ */
+typedef void zio_checksum_t(const void *data, uint64_t size, zio_cksum_t *zcp);
+
+/*
+ * Information about each checksum function.
+ */
+typedef struct zio_checksum_info {
+ zio_checksum_t *ci_func[2]; /* checksum function for each byteorder */
+ int ci_correctable; /* number of correctable bits */
+ int ci_zbt; /* uses zio block tail? */
+ char *ci_name; /* descriptive name */
+} zio_checksum_info_t;
+
+#endif /* _SYS_ZIO_CHECKSUM_H */
diff --git a/usr/src/grub/grub-0.95/stage2/zfs_fletcher.c b/usr/src/grub/grub-0.95/stage2/zfs_fletcher.c
new file mode 100644
index 0000000000..34a034efad
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs_fletcher.c
@@ -0,0 +1,95 @@
+/*
+ * 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.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "fsys_zfs.h"
+
+
+void
+fletcher_2_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint64_t *ip = buf;
+ const uint64_t *ipend = ip + (size / sizeof (uint64_t));
+ uint64_t a0, b0, a1, b1;
+
+ for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
+ a0 += ip[0];
+ a1 += ip[1];
+ b0 += a0;
+ b1 += a1;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
+}
+
+void
+fletcher_2_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint64_t *ip = buf;
+ const uint64_t *ipend = ip + (size / sizeof (uint64_t));
+ uint64_t a0, b0, a1, b1;
+
+ for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
+ a0 += BSWAP_64(ip[0]);
+ a1 += BSWAP_64(ip[1]);
+ b0 += a0;
+ b1 += a1;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
+}
+
+void
+fletcher_4_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint32_t *ip = buf;
+ const uint32_t *ipend = ip + (size / sizeof (uint32_t));
+ uint64_t a, b, c, d;
+
+ for (a = b = c = d = 0; ip < ipend; ip++) {
+ a += ip[0];
+ b += a;
+ c += b;
+ d += c;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a, b, c, d);
+}
+
+void
+fletcher_4_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint32_t *ip = buf;
+ const uint32_t *ipend = ip + (size / sizeof (uint32_t));
+ uint64_t a, b, c, d;
+
+ for (a = b = c = d = 0; ip < ipend; ip++) {
+ a += BSWAP_32(ip[0]);
+ b += a;
+ c += b;
+ d += c;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a, b, c, d);
+}
diff --git a/usr/src/grub/grub-0.95/stage2/zfs_lzjb.c b/usr/src/grub/grub-0.95/stage2/zfs_lzjb.c
new file mode 100644
index 0000000000..22df6b2e39
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs_lzjb.c
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "fsys_zfs.h"
+
+#define MATCH_BITS 6
+#define MATCH_MIN 3
+#define OFFSET_MASK ((1 << (16 - MATCH_BITS)) - 1)
+
+
+/*ARGSUSED*/
+int
+lzjb_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len)
+{
+ uchar_t *src = s_start;
+ uchar_t *dst = d_start;
+ uchar_t *d_end = (uchar_t *)d_start + d_len;
+ uchar_t *cpy, copymap;
+ int copymask = 1 << (NBBY - 1);
+
+ while (dst < d_end) {
+ if ((copymask <<= 1) == (1 << NBBY)) {
+ copymask = 1;
+ copymap = *src++;
+ }
+ if (copymap & copymask) {
+ int mlen = (src[0] >> (NBBY - MATCH_BITS)) + MATCH_MIN;
+ int offset = ((src[0] << NBBY) | src[1]) & OFFSET_MASK;
+ src += 2;
+ if ((cpy = dst - offset) < (uchar_t *)d_start)
+ return (-1);
+ while (--mlen >= 0 && dst < d_end)
+ *dst++ = *cpy++;
+ } else {
+ *dst++ = *src++;
+ }
+ }
+ return (0);
+}
diff --git a/usr/src/grub/grub-0.95/stage2/zfs_sha256.c b/usr/src/grub/grub-0.95/stage2/zfs_sha256.c
new file mode 100644
index 0000000000..393eaee05b
--- /dev/null
+++ b/usr/src/grub/grub-0.95/stage2/zfs_sha256.c
@@ -0,0 +1,126 @@
+/*
+ * 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.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "fsys_zfs.h"
+
+/*
+ * SHA-256 checksum, as specified in FIPS 180-2, available at:
+ * http://csrc.nist.gov/cryptval
+ *
+ * This is a very compact implementation of SHA-256.
+ * It is designed to be simple and portable, not to be fast.
+ */
+
+/*
+ * The literal definitions according to FIPS180-2 would be:
+ *
+ * Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z)))
+ * Maj(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+ *
+ * We use logical equivalents which require one less op.
+ */
+#define Ch(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define Maj(x, y, z) (((x) & (y)) ^ ((z) & ((x) ^ (y))))
+#define Rot32(x, s) (((x) >> s) | ((x) << (32 - s)))
+#define SIGMA0(x) (Rot32(x, 2) ^ Rot32(x, 13) ^ Rot32(x, 22))
+#define SIGMA1(x) (Rot32(x, 6) ^ Rot32(x, 11) ^ Rot32(x, 25))
+#define sigma0(x) (Rot32(x, 7) ^ Rot32(x, 18) ^ ((x) >> 3))
+#define sigma1(x) (Rot32(x, 17) ^ Rot32(x, 19) ^ ((x) >> 10))
+
+static const uint32_t SHA256_K[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+static void
+SHA256Transform(uint32_t *H, const uint8_t *cp)
+{
+ uint32_t a, b, c, d, e, f, g, h, t, T1, T2, W[64];
+
+ for (t = 0; t < 16; t++, cp += 4)
+ W[t] = (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
+
+ for (t = 16; t < 64; t++)
+ W[t] = sigma1(W[t - 2]) + W[t - 7] +
+ sigma0(W[t - 15]) + W[t - 16];
+
+ a = H[0]; b = H[1]; c = H[2]; d = H[3];
+ e = H[4]; f = H[5]; g = H[6]; h = H[7];
+
+ for (t = 0; t < 64; t++) {
+ T1 = h + SIGMA1(e) + Ch(e, f, g) + SHA256_K[t] + W[t];
+ T2 = SIGMA0(a) + Maj(a, b, c);
+ h = g; g = f; f = e; e = d + T1;
+ d = c; c = b; b = a; a = T1 + T2;
+ }
+
+ H[0] += a; H[1] += b; H[2] += c; H[3] += d;
+ H[4] += e; H[5] += f; H[6] += g; H[7] += h;
+}
+
+void
+zio_checksum_SHA256(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ uint32_t H[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
+ 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
+ uint8_t pad[128];
+ int padsize = size & 63;
+ int i;
+
+ for (i = 0; i < size - padsize; i += 64)
+ SHA256Transform(H, (uint8_t *)buf + i);
+
+ for (i = 0; i < padsize; i++)
+ pad[i] = ((uint8_t *)buf)[i];
+
+ for (pad[padsize++] = 0x80; (padsize & 63) != 56; padsize++)
+ pad[padsize] = 0;
+
+ for (i = 0; i < 8; i++)
+ pad[padsize++] = (size << 3) >> (56 - 8 * i);
+
+ for (i = 0; i < padsize; i += 64)
+ SHA256Transform(H, pad + i);
+
+ ZIO_SET_CHECKSUM(zcp,
+ (uint64_t)H[0] << 32 | H[1],
+ (uint64_t)H[2] << 32 | H[3],
+ (uint64_t)H[4] << 32 | H[5],
+ (uint64_t)H[6] << 32 | H[7]);
+}
diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h
index 2967ef0d11..307d2dcf89 100644
--- a/usr/src/lib/libzfs/common/libzfs.h
+++ b/usr/src/lib/libzfs/common/libzfs.h
@@ -94,7 +94,10 @@ enum {
EZFS_NOHISTORY, /* no history object */
EZFS_UNSHAREISCSIFAILED, /* iscsitgtd failed request to unshare */
EZFS_SHAREISCSIFAILED, /* iscsitgtd failed request to share */
- EZFS_UNKNOWN /* unknown error */
+ EZFS_POOLPROPS, /* couldn't retrieve pool props */
+ EZFS_POOL_NOTSUP, /* ops not supported for this type of pool */
+ EZFS_POOL_INVALARG, /* invalid argument for this pool operation */
+ EZFS_UNKNOWN
};
/*
@@ -162,6 +165,15 @@ extern int zpool_clear(zpool_handle_t *, const char *);
extern nvlist_t *zpool_find_vdev(zpool_handle_t *, const char *, boolean_t *);
/*
+ * Functions to manage pool properties
+ */
+extern int zpool_set_prop(zpool_handle_t *, const char *, const char *);
+extern int zpool_get_prop(zpool_handle_t *, zfs_prop_t, char *,
+ size_t proplen, zfs_source_t *);
+extern const char *zpool_prop_to_name(zpool_prop_t);
+extern const char *zpool_prop_values(zpool_prop_t);
+
+/*
* Pool health statistics.
*/
typedef enum {
@@ -237,16 +249,6 @@ extern void zfs_close(zfs_handle_t *);
extern zfs_type_t zfs_get_type(const zfs_handle_t *);
extern const char *zfs_get_name(const zfs_handle_t *);
-typedef enum {
- ZFS_SRC_NONE = 0x1,
- ZFS_SRC_DEFAULT = 0x2,
- ZFS_SRC_TEMPORARY = 0x4,
- ZFS_SRC_LOCAL = 0x8,
- ZFS_SRC_INHERITED = 0x10
-} zfs_source_t;
-
-#define ZFS_SRC_ALL 0x1f
-
/*
* Property management functions. Some functions are shared with the kernel,
* and are found in sys/fs/zfs.h.
@@ -267,6 +269,7 @@ extern uint64_t zfs_prop_default_numeric(zfs_prop_t);
extern int zfs_prop_is_string(zfs_prop_t prop);
extern const char *zfs_prop_column_name(zfs_prop_t);
extern boolean_t zfs_prop_align_right(zfs_prop_t);
+extern void nicebool(int value, char *buf, size_t buflen);
typedef struct zfs_proplist {
zfs_prop_t pl_prop;
@@ -277,15 +280,40 @@ typedef struct zfs_proplist {
boolean_t pl_fixed;
} zfs_proplist_t;
+typedef zfs_proplist_t zpool_proplist_t;
+
extern int zfs_get_proplist(libzfs_handle_t *, char *, zfs_proplist_t **);
-extern void zfs_free_proplist(zfs_proplist_t *);
+extern int zpool_get_proplist(libzfs_handle_t *, char *, zpool_proplist_t **);
extern int zfs_expand_proplist(zfs_handle_t *, zfs_proplist_t **);
+extern int zpool_expand_proplist(zpool_handle_t *, zpool_proplist_t **);
+extern void zfs_free_proplist(zfs_proplist_t *);
extern nvlist_t *zfs_get_user_props(zfs_handle_t *);
#define ZFS_MOUNTPOINT_NONE "none"
#define ZFS_MOUNTPOINT_LEGACY "legacy"
/*
+ * Functions for printing properties from zfs/zpool
+ */
+typedef struct libzfs_get_cbdata {
+ int cb_sources;
+ int cb_columns[4];
+ int cb_colwidths[5];
+ boolean_t cb_scripted;
+ boolean_t cb_literal;
+ boolean_t cb_first;
+ zfs_proplist_t *cb_proplist;
+} libzfs_get_cbdata_t;
+
+void libzfs_print_one_property(const char *, libzfs_get_cbdata_t *,
+ const char *, const char *, zfs_source_t, const char *);
+
+#define GET_COL_NAME 1
+#define GET_COL_PROPERTY 2
+#define GET_COL_VALUE 3
+#define GET_COL_SOURCE 4
+
+/*
* Iterator functions.
*/
typedef int (*zfs_iter_f)(zfs_handle_t *, void *);
diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c
index 8e0b15174e..c14f0229fd 100644
--- a/usr/src/lib/libzfs/common/libzfs_dataset.c
+++ b/usr/src/lib/libzfs/common/libzfs_dataset.c
@@ -680,13 +680,39 @@ prop_parse_index(libzfs_handle_t *hdl, nvpair_t *elem, zfs_prop_t prop,
}
/*
+ * Check if the bootfs name has the same pool name as it is set to.
+ * Assuming bootfs is a valid dataset name.
+ */
+static boolean_t
+bootfs_poolname_valid(char *pool, char *bootfs)
+{
+ char ch, *pname;
+
+ /* get the pool name from the bootfs name */
+ pname = bootfs;
+ while (*bootfs && !isspace(*bootfs) && *bootfs != '/')
+ bootfs++;
+
+ ch = *bootfs;
+ *bootfs = 0;
+
+ if (strcmp(pool, pname) == 0) {
+ *bootfs = ch;
+ return (B_TRUE);
+ }
+
+ *bootfs = ch;
+ return (B_FALSE);
+}
+
+/*
* Given an nvlist of properties to set, validates that they are correct, and
* parses any numeric properties (index, boolean, etc) if they are specified as
* strings.
*/
-static nvlist_t *
-zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
- uint64_t zoned, zfs_handle_t *zhp, const char *errbuf)
+nvlist_t *
+zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, char *pool_name,
+ nvlist_t *nvl, uint64_t zoned, zfs_handle_t *zhp, const char *errbuf)
{
nvpair_t *elem;
const char *propname;
@@ -694,6 +720,7 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
uint64_t intval;
char *strval;
nvlist_t *ret;
+ int isuser;
if (nvlist_alloc(&ret, NV_UNIQUE_NAME, 0) != 0) {
(void) no_memory(hdl);
@@ -714,8 +741,10 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
/*
* Make sure this property is valid and applies to this type.
*/
- if ((prop = zfs_name_to_prop(propname)) == ZFS_PROP_INVAL) {
- if (!zfs_prop_user(propname)) {
+ if ((prop = zfs_name_to_prop_common(propname, type))
+ == ZFS_PROP_INVAL) {
+ isuser = zfs_prop_user(propname);
+ if (!isuser || (isuser && (type & ZFS_TYPE_POOL))) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"invalid property '%s'"),
propname);
@@ -927,6 +956,22 @@ zfs_validate_properties(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
}
break;
+
+ case ZFS_PROP_BOOTFS:
+ /*
+ * bootfs property value has to be a dataset name and
+ * the dataset has to be in the same pool as it sets to.
+ */
+ if (strval[0] != '\0' && (!zfs_name_valid(strval,
+ ZFS_TYPE_FILESYSTEM) || !bootfs_poolname_valid(
+ pool_name, strval))) {
+
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "'%s' "
+ "is an invalid name"), strval);
+ (void) zfs_error(hdl, EZFS_INVALIDNAME, errbuf);
+ goto error;
+ }
+ break;
}
/*
@@ -1035,7 +1080,7 @@ zfs_prop_set(zfs_handle_t *zhp, const char *propname, const char *propval)
goto error;
}
- if ((realprops = zfs_validate_properties(hdl, zhp->zfs_type, nvl,
+ if ((realprops = zfs_validate_properties(hdl, zhp->zfs_type, NULL, nvl,
zfs_prop_get_int(zhp, ZFS_PROP_ZONED), zhp, errbuf)) == NULL)
goto error;
nvlist_free(nvl);
@@ -1246,7 +1291,7 @@ error:
return (ret);
}
-static void
+void
nicebool(int value, char *buf, size_t buflen)
{
if (value)
@@ -1533,7 +1578,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
return (-1);
if (literal)
(void) snprintf(propbuf, proplen, "%llu",
- (u_longlong_t)val);
+ (u_longlong_t)val);
else
zfs_nicenum(val, propbuf, proplen);
break;
@@ -1644,7 +1689,7 @@ zfs_prop_get(zfs_handle_t *zhp, zfs_prop_t prop, char *propbuf, size_t proplen,
} else {
if (literal)
(void) snprintf(propbuf, proplen, "%llu",
- (u_longlong_t)val);
+ (u_longlong_t)val);
else
zfs_nicenum(val, propbuf, proplen);
}
@@ -1995,8 +2040,8 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,
else
zc.zc_objset_type = DMU_OST_ZFS;
- if (props && (props = zfs_validate_properties(hdl, type, props, zoned,
- NULL, errbuf)) == 0)
+ if (props && (props = zfs_validate_properties(hdl, type, NULL, props,
+ zoned, NULL, errbuf)) == 0)
return (-1);
if (type == ZFS_TYPE_VOLUME) {
@@ -2053,8 +2098,17 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,
/* create the dataset */
ret = ioctl(hdl->libzfs_fd, ZFS_IOC_CREATE, &zc);
- if (ret == 0 && type == ZFS_TYPE_VOLUME)
+ if (ret == 0 && type == ZFS_TYPE_VOLUME) {
ret = zvol_create_link(hdl, path);
+ if (ret) {
+ (void) zfs_standard_error(hdl, errno,
+ dgettext(TEXT_DOMAIN,
+ "Volume successfully created, but device links "
+ "were not created"));
+ zcmd_free_nvlists(&zc);
+ return (-1);
+ }
+ }
zcmd_free_nvlists(&zc);
@@ -2262,8 +2316,8 @@ zfs_clone(zfs_handle_t *zhp, const char *target, nvlist_t *props)
}
if (props) {
- if ((props = zfs_validate_properties(hdl, type, props, zoned,
- zhp, errbuf)) == NULL)
+ if ((props = zfs_validate_properties(hdl, type, NULL, props,
+ zoned, zhp, errbuf)) == NULL)
return (-1);
if (zcmd_write_src_nvlist(hdl, &zc, props, NULL) != 0) {
@@ -2724,7 +2778,7 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, int isprefix,
if (strchr(drr.drr_u.drr_begin.drr_toname, '@') == NULL) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "invalid "
- "stream (bad snapshot name)"));
+ "stream (bad snapshot name)"));
return (zfs_error(hdl, EZFS_BADSTREAM, errbuf));
}
/*
@@ -3174,7 +3228,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target)
"snapshots must be part of same "
"dataset"));
return (zfs_error(hdl, EZFS_CROSSTARGET,
- errbuf));
+ errbuf));
}
}
if (!zfs_validate_name(hdl, target, zhp->zfs_type))
@@ -3201,7 +3255,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target)
/* new name cannot be a child of the current dataset name */
if (strncmp(parent, zhp->zfs_name,
- strlen(zhp->zfs_name)) == 0) {
+ strlen(zhp->zfs_name)) == 0) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"New dataset name cannot be a descendent of "
"current dataset name"));
@@ -3352,7 +3406,8 @@ zfs_get_user_props(zfs_handle_t *zhp)
* per-dataset basis by zfs_expand_proplist().
*/
int
-zfs_get_proplist(libzfs_handle_t *hdl, char *fields, zfs_proplist_t **listp)
+zfs_get_proplist_common(libzfs_handle_t *hdl, char *fields,
+ zfs_proplist_t **listp, zfs_type_t type)
{
size_t len;
char *s, *p;
@@ -3408,13 +3463,19 @@ zfs_get_proplist(libzfs_handle_t *hdl, char *fields, zfs_proplist_t **listp)
*/
c = s[len];
s[len] = '\0';
- prop = zfs_name_to_prop(s);
+ prop = zfs_name_to_prop_common(s, type);
+
+ if (prop != ZFS_PROP_INVAL &&
+ !zfs_prop_valid_for_type(prop, type))
+ prop = ZFS_PROP_INVAL;
/*
- * If no column is specified, and this isn't a user property,
- * return failure.
+ * When no property table entry can be found, return failure if
+ * this is a pool property or if this isn't a user-defined
+ * dataset property,
*/
- if (prop == ZFS_PROP_INVAL && !zfs_prop_user(s)) {
+ if (prop == ZFS_PROP_INVAL &&
+ (type & ZFS_TYPE_POOL || !zfs_prop_user(s))) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"invalid property '%s'"), s);
return (zfs_error(hdl, EZFS_BADPROP,
@@ -3448,6 +3509,12 @@ zfs_get_proplist(libzfs_handle_t *hdl, char *fields, zfs_proplist_t **listp)
return (0);
}
+int
+zfs_get_proplist(libzfs_handle_t *hdl, char *fields, zfs_proplist_t **listp)
+{
+ return (zfs_get_proplist_common(hdl, fields, listp, ZFS_TYPE_ANY));
+}
+
void
zfs_free_proplist(zfs_proplist_t *pl)
{
@@ -3485,27 +3552,12 @@ zfs_expand_proplist_cb(zfs_prop_t prop, void *cb)
return (ZFS_PROP_CONT);
}
-/*
- * This function is used by 'zfs list' to determine the exact set of columns to
- * display, and their maximum widths. This does two main things:
- *
- * - If this is a list of all properties, then expand the list to include
- * all native properties, and set a flag so that for each dataset we look
- * for new unique user properties and add them to the list.
- *
- * - For non fixed-width properties, keep track of the maximum width seen
- * so that we can size the column appropriately.
- */
int
-zfs_expand_proplist(zfs_handle_t *zhp, zfs_proplist_t **plp)
+zfs_expand_proplist_common(libzfs_handle_t *hdl, zfs_proplist_t **plp,
+ zfs_type_t type)
{
- libzfs_handle_t *hdl = zhp->zfs_hdl;
zfs_proplist_t *entry;
- zfs_proplist_t **last, **start;
- nvlist_t *userprops, *propval;
- nvpair_t *elem;
- char *strval;
- char buf[ZFS_MAXPROPLEN];
+ zfs_proplist_t **last;
expand_data_t exp;
if (*plp == NULL) {
@@ -3519,7 +3571,7 @@ zfs_expand_proplist(zfs_handle_t *zhp, zfs_proplist_t **plp)
exp.last = last;
exp.hdl = hdl;
- if (zfs_prop_iter(zfs_expand_proplist_cb, &exp,
+ if (zfs_prop_iter_common(zfs_expand_proplist_cb, &exp, type,
B_FALSE) == ZFS_PROP_INVAL)
return (-1);
@@ -3538,6 +3590,33 @@ zfs_expand_proplist(zfs_handle_t *zhp, zfs_proplist_t **plp)
entry->pl_next = *plp;
*plp = entry;
}
+ return (0);
+}
+
+/*
+ * This function is used by 'zfs list' to determine the exact set of columns to
+ * display, and their maximum widths. This does two main things:
+ *
+ * - If this is a list of all properties, then expand the list to include
+ * all native properties, and set a flag so that for each dataset we look
+ * for new unique user properties and add them to the list.
+ *
+ * - For non fixed-width properties, keep track of the maximum width seen
+ * so that we can size the column appropriately.
+ */
+int
+zfs_expand_proplist(zfs_handle_t *zhp, zfs_proplist_t **plp)
+{
+ libzfs_handle_t *hdl = zhp->zfs_hdl;
+ zfs_proplist_t *entry;
+ zfs_proplist_t **last, **start;
+ nvlist_t *userprops, *propval;
+ nvpair_t *elem;
+ char *strval;
+ char buf[ZFS_MAXPROPLEN];
+
+ if (zfs_expand_proplist_common(hdl, plp, ZFS_TYPE_ANY) != 0)
+ return (-1);
userprops = zfs_get_user_props(zhp);
diff --git a/usr/src/lib/libzfs/common/libzfs_impl.h b/usr/src/lib/libzfs/common/libzfs_impl.h
index 3cb4585407..4bd66994bf 100644
--- a/usr/src/lib/libzfs/common/libzfs_impl.h
+++ b/usr/src/lib/libzfs/common/libzfs_impl.h
@@ -82,6 +82,7 @@ struct zpool_handle {
size_t zpool_config_size;
nvlist_t *zpool_config;
nvlist_t *zpool_old_config;
+ nvlist_t *zpool_props;
};
int zfs_error(libzfs_handle_t *, int, const char *);
@@ -100,6 +101,16 @@ int zpool_standard_error_fmt(libzfs_handle_t *, int, const char *, ...);
int get_dependents(libzfs_handle_t *, boolean_t, const char *, char ***,
size_t *);
+int zfs_expand_proplist_common(libzfs_handle_t *, zfs_proplist_t **,
+ zfs_type_t);
+int zfs_get_proplist_common(libzfs_handle_t *, char *, zfs_proplist_t **,
+ zfs_type_t);
+zfs_prop_t zfs_prop_iter_common(zfs_prop_f, void *, zfs_type_t, boolean_t);
+zfs_prop_t zfs_name_to_prop_common(const char *, zfs_type_t);
+
+nvlist_t *zfs_validate_properties(libzfs_handle_t *, zfs_type_t, char *,
+ nvlist_t *, uint64_t, zfs_handle_t *zhp, const char *errbuf);
+
typedef struct prop_changelist prop_changelist_t;
int zcmd_alloc_dst_nvlist(libzfs_handle_t *, zfs_cmd_t *, size_t);
diff --git a/usr/src/lib/libzfs/common/libzfs_pool.c b/usr/src/lib/libzfs/common/libzfs_pool.c
index 0f76a53b57..de2d6ba467 100644
--- a/usr/src/lib/libzfs/common/libzfs_pool.c
+++ b/usr/src/lib/libzfs/common/libzfs_pool.c
@@ -43,6 +43,7 @@
#include <strings.h>
#include "zfs_namecheck.h"
+#include "zfs_prop.h"
#include "libzfs_impl.h"
/*
@@ -131,6 +132,39 @@ zpool_name_valid(libzfs_handle_t *hdl, boolean_t isopen, const char *pool)
return (B_TRUE);
}
+static int
+zpool_get_all_props(zpool_handle_t *zhp)
+{
+ zfs_cmd_t zc = { 0 };
+ libzfs_handle_t *hdl = zhp->zpool_hdl;
+
+ (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
+
+ if (zcmd_alloc_dst_nvlist(hdl, &zc, 0) != 0)
+ return (-1);
+
+ while (ioctl(hdl->libzfs_fd, ZFS_IOC_POOL_GET_PROPS, &zc) != 0) {
+ if (errno == ENOMEM) {
+ if (zcmd_expand_dst_nvlist(hdl, &zc) != 0) {
+ zcmd_free_nvlists(&zc);
+ return (-1);
+ }
+ } else {
+ zcmd_free_nvlists(&zc);
+ return (-1);
+ }
+ }
+
+ if (zcmd_read_dst_nvlist(hdl, &zc, &zhp->zpool_props) != 0) {
+ zcmd_free_nvlists(&zc);
+ return (-1);
+ }
+
+ zcmd_free_nvlists(&zc);
+
+ return (0);
+}
+
/*
* Open a handle to the given pool, even if the pool is currently in the FAULTED
* state.
@@ -238,6 +272,8 @@ zpool_close(zpool_handle_t *zhp)
nvlist_free(zhp->zpool_config);
if (zhp->zpool_old_config)
nvlist_free(zhp->zpool_old_config);
+ if (zhp->zpool_props)
+ nvlist_free(zhp->zpool_props);
free(zhp);
}
@@ -547,6 +583,12 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot)
(void) zfs_error(hdl, EZFS_BADVERSION, msg);
break;
+ case EDOM:
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "root pool can not have concatenated devices"));
+ (void) zfs_error(hdl, EZFS_POOL_NOTSUP, msg);
+ break;
+
default:
(void) zpool_standard_error(hdl, errno, msg);
}
@@ -579,7 +621,6 @@ zpool_export(zpool_handle_t *zhp)
return (zpool_standard_error_fmt(zhp->zpool_hdl, errno,
dgettext(TEXT_DOMAIN, "cannot export '%s'"),
zhp->zpool_name));
-
return (0);
}
@@ -1646,7 +1687,7 @@ zpool_upgrade(zpool_handle_t *zhp)
*/
void
zpool_log_history(libzfs_handle_t *hdl, int argc, char **argv, const char *path,
- boolean_t pool, boolean_t pool_create)
+ boolean_t pool, boolean_t pool_create)
{
char cmd_buf[HIS_MAX_RECORD_LEN];
char *dspath;
@@ -1862,3 +1903,151 @@ zpool_obj_to_path(zpool_handle_t *zhp, uint64_t dsobj, uint64_t obj,
}
free(mntpnt);
}
+
+int
+zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval)
+{
+ zfs_cmd_t zc = { 0 };
+ int ret = -1;
+ char errbuf[1024];
+ nvlist_t *nvl = NULL;
+ nvlist_t *realprops;
+
+ (void) snprintf(errbuf, sizeof (errbuf),
+ dgettext(TEXT_DOMAIN, "cannot set property for '%s'"),
+ zhp->zpool_name);
+
+ if (zpool_get_version(zhp) < ZFS_VERSION_BOOTFS) {
+ zfs_error_aux(zhp->zpool_hdl,
+ dgettext(TEXT_DOMAIN, "pool must be "
+ "upgraded to support pool properties"));
+ return (zfs_error(zhp->zpool_hdl, EZFS_BADVERSION, errbuf));
+ }
+
+ if (zhp->zpool_props == NULL && zpool_get_all_props(zhp))
+ return (zfs_error(zhp->zpool_hdl, EZFS_POOLPROPS, errbuf));
+
+ if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0 ||
+ nvlist_add_string(nvl, propname, propval) != 0) {
+ return (no_memory(zhp->zpool_hdl));
+ }
+
+ if ((realprops = zfs_validate_properties(zhp->zpool_hdl, ZFS_TYPE_POOL,
+ zhp->zpool_name, nvl, 0, NULL, errbuf)) == NULL) {
+ nvlist_free(nvl);
+ return (-1);
+ }
+
+ nvlist_free(nvl);
+ nvl = realprops;
+
+ /*
+ * Execute the corresponding ioctl() to set this property.
+ */
+ (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
+
+ if (zcmd_write_src_nvlist(zhp->zpool_hdl, &zc, nvl, NULL) != 0)
+ return (-1);
+
+ ret = ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_POOL_SET_PROPS, &zc);
+ zcmd_free_nvlists(&zc);
+
+ if (ret)
+ (void) zpool_standard_error(zhp->zpool_hdl, errno, errbuf);
+
+ return (ret);
+}
+
+int
+zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *propbuf,
+ size_t proplen, zfs_source_t *srctype)
+{
+ uint64_t value;
+ char msg[1024], *strvalue;
+ nvlist_t *nvp;
+ zfs_source_t src = ZFS_SRC_NONE;
+
+ (void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
+ "cannot get property '%s'"), zpool_prop_to_name(prop));
+
+ if (zpool_get_version(zhp) < ZFS_VERSION_BOOTFS) {
+ zfs_error_aux(zhp->zpool_hdl,
+ dgettext(TEXT_DOMAIN, "pool must be "
+ "upgraded to support pool properties"));
+ return (zfs_error(zhp->zpool_hdl, EZFS_BADVERSION, msg));
+ }
+
+ if (zhp->zpool_props == NULL && zpool_get_all_props(zhp))
+ return (zfs_error(zhp->zpool_hdl, EZFS_POOLPROPS, msg));
+
+ /*
+ * the "name" property is special cased
+ */
+ if (!zfs_prop_valid_for_type(prop, ZFS_TYPE_POOL) &&
+ prop != ZFS_PROP_NAME)
+ return (-1);
+
+ switch (prop) {
+ case ZFS_PROP_NAME:
+ (void) strlcpy(propbuf, zhp->zpool_name, proplen);
+ break;
+
+ case ZFS_PROP_BOOTFS:
+ if (nvlist_lookup_nvlist(zhp->zpool_props,
+ zpool_prop_to_name(prop), &nvp) != 0) {
+ strvalue = (char *)zfs_prop_default_string(prop);
+ if (strvalue == NULL)
+ strvalue = "-";
+ src = ZFS_SRC_DEFAULT;
+ } else {
+ VERIFY(nvlist_lookup_uint64(nvp,
+ ZFS_PROP_SOURCE, &value) == 0);
+ src = value;
+ VERIFY(nvlist_lookup_string(nvp, ZFS_PROP_VALUE,
+ &strvalue) == 0);
+ if (strlen(strvalue) >= proplen)
+ return (-1);
+ }
+ (void) strcpy(propbuf, strvalue);
+ break;
+
+ default:
+ return (-1);
+ }
+ if (srctype)
+ *srctype = src;
+ return (0);
+}
+
+int
+zpool_get_proplist(libzfs_handle_t *hdl, char *fields, zpool_proplist_t **listp)
+{
+ return (zfs_get_proplist_common(hdl, fields, listp, ZFS_TYPE_POOL));
+}
+
+
+int
+zpool_expand_proplist(zpool_handle_t *zhp, zpool_proplist_t **plp)
+{
+ libzfs_handle_t *hdl = zhp->zpool_hdl;
+ zpool_proplist_t *entry;
+ char buf[ZFS_MAXPROPLEN];
+
+ if (zfs_expand_proplist_common(hdl, plp, ZFS_TYPE_POOL) != 0)
+ return (-1);
+
+ for (entry = *plp; entry != NULL; entry = entry->pl_next) {
+
+ if (entry->pl_fixed)
+ continue;
+
+ if (entry->pl_prop != ZFS_PROP_INVAL &&
+ zpool_get_prop(zhp, entry->pl_prop, buf, sizeof (buf),
+ NULL) == 0) {
+ if (strlen(buf) > entry->pl_width)
+ entry->pl_width = strlen(buf);
+ }
+ }
+
+ return (0);
+}
diff --git a/usr/src/lib/libzfs/common/libzfs_util.c b/usr/src/lib/libzfs/common/libzfs_util.c
index a16202534b..9170180630 100644
--- a/usr/src/lib/libzfs/common/libzfs_util.c
+++ b/usr/src/lib/libzfs/common/libzfs_util.c
@@ -158,6 +158,15 @@ libzfs_error_description(libzfs_handle_t *hdl)
case EZFS_SHAREISCSIFAILED:
return (dgettext(TEXT_DOMAIN,
"iscsitgtd failed request to share"));
+ case EZFS_POOLPROPS:
+ return (dgettext(TEXT_DOMAIN, "failed to retrieve "
+ "pool properties"));
+ case EZFS_POOL_NOTSUP:
+ return (dgettext(TEXT_DOMAIN, "operation not supported "
+ "on this type of pool"));
+ case EZFS_POOL_INVALARG:
+ return (dgettext(TEXT_DOMAIN, "invalid argument for "
+ "this pool operation"));
case EZFS_UNKNOWN:
return (dgettext(TEXT_DOMAIN, "unknown error"));
default:
@@ -201,7 +210,7 @@ zfs_verror(libzfs_handle_t *hdl, int error, const char *fmt, va_list ap)
}
(void) fprintf(stderr, "%s: %s\n", hdl->libzfs_action,
- libzfs_error_description(hdl));
+ libzfs_error_description(hdl));
if (error == EZFS_NOMEM)
exit(1);
}
@@ -297,7 +306,6 @@ zfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
"dataset is busy"));
zfs_verror(hdl, EZFS_BUSY, fmt, ap);
break;
-
default:
zfs_error_aux(hdl, strerror(errno));
zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
@@ -333,7 +341,8 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
break;
case ENOENT:
- zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "no such pool"));
+ zfs_error_aux(hdl,
+ dgettext(TEXT_DOMAIN, "no such pool or dataset"));
zfs_verror(hdl, EZFS_NOENT, fmt, ap);
break;
@@ -358,6 +367,14 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
zfs_verror(hdl, EZFS_DEVOVERFLOW, fmt, ap);
break;
+ case ENOTSUP:
+ zfs_verror(hdl, EZFS_POOL_NOTSUP, fmt, ap);
+ break;
+
+ case EINVAL:
+ zfs_verror(hdl, EZFS_POOL_INVALARG, fmt, ap);
+ break;
+
default:
zfs_error_aux(hdl, strerror(error));
zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
@@ -645,3 +662,179 @@ zcmd_read_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, nvlist_t **nvlp)
return (0);
}
+
+static void
+zfs_print_prop_headers(libzfs_get_cbdata_t *cbp)
+{
+ zfs_proplist_t *pl = cbp->cb_proplist;
+ int i;
+ char *title;
+ size_t len;
+
+ cbp->cb_first = B_FALSE;
+ if (cbp->cb_scripted)
+ return;
+
+ /*
+ * Start with the length of the column headers.
+ */
+ cbp->cb_colwidths[GET_COL_NAME] = strlen(dgettext(TEXT_DOMAIN, "NAME"));
+ cbp->cb_colwidths[GET_COL_PROPERTY] = strlen(dgettext(TEXT_DOMAIN,
+ "PROPERTY"));
+ cbp->cb_colwidths[GET_COL_VALUE] = strlen(dgettext(TEXT_DOMAIN,
+ "VALUE"));
+ cbp->cb_colwidths[GET_COL_SOURCE] = strlen(dgettext(TEXT_DOMAIN,
+ "SOURCE"));
+
+ /*
+ * Go through and calculate the widths for each column. For the
+ * 'source' column, we kludge it up by taking the worst-case scenario of
+ * inheriting from the longest name. This is acceptable because in the
+ * majority of cases 'SOURCE' is the last column displayed, and we don't
+ * use the width anyway. Note that the 'VALUE' column can be oversized,
+ * if the name of the property is much longer the any values we find.
+ */
+ for (pl = cbp->cb_proplist; pl != NULL; pl = pl->pl_next) {
+ /*
+ * 'PROPERTY' column
+ */
+ if (pl->pl_prop != ZFS_PROP_INVAL) {
+ len = strlen(zfs_prop_to_name(pl->pl_prop));
+ if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
+ cbp->cb_colwidths[GET_COL_PROPERTY] = len;
+ } else {
+ len = strlen(pl->pl_user_prop);
+ if (len > cbp->cb_colwidths[GET_COL_PROPERTY])
+ cbp->cb_colwidths[GET_COL_PROPERTY] = len;
+ }
+
+ /*
+ * 'VALUE' column
+ */
+ if ((pl->pl_prop != ZFS_PROP_NAME || !pl->pl_all) &&
+ pl->pl_width > cbp->cb_colwidths[GET_COL_VALUE])
+ cbp->cb_colwidths[GET_COL_VALUE] = pl->pl_width;
+
+ /*
+ * 'NAME' and 'SOURCE' columns
+ */
+ if (pl->pl_prop == ZFS_PROP_NAME &&
+ pl->pl_width > cbp->cb_colwidths[GET_COL_NAME]) {
+ cbp->cb_colwidths[GET_COL_NAME] = pl->pl_width;
+ cbp->cb_colwidths[GET_COL_SOURCE] = pl->pl_width +
+ strlen(dgettext(TEXT_DOMAIN, "inherited from"));
+ }
+ }
+
+ /*
+ * Now go through and print the headers.
+ */
+ for (i = 0; i < 4; i++) {
+ switch (cbp->cb_columns[i]) {
+ case GET_COL_NAME:
+ title = dgettext(TEXT_DOMAIN, "NAME");
+ break;
+ case GET_COL_PROPERTY:
+ title = dgettext(TEXT_DOMAIN, "PROPERTY");
+ break;
+ case GET_COL_VALUE:
+ title = dgettext(TEXT_DOMAIN, "VALUE");
+ break;
+ case GET_COL_SOURCE:
+ title = dgettext(TEXT_DOMAIN, "SOURCE");
+ break;
+ default:
+ title = NULL;
+ }
+
+ if (title != NULL) {
+ if (i == 3 || cbp->cb_columns[i + 1] == 0)
+ (void) printf("%s", title);
+ else
+ (void) printf("%-*s ",
+ cbp->cb_colwidths[cbp->cb_columns[i]],
+ title);
+ }
+ }
+ (void) printf("\n");
+}
+
+/*
+ * Display a single line of output, according to the settings in the callback
+ * structure.
+ */
+void
+libzfs_print_one_property(const char *name, libzfs_get_cbdata_t *cbp,
+ const char *propname, const char *value, zfs_source_t sourcetype,
+ const char *source)
+{
+ int i;
+ const char *str;
+ char buf[128];
+
+ /*
+ * Ignore those source types that the user has chosen to ignore.
+ */
+ if ((sourcetype & cbp->cb_sources) == 0)
+ return;
+
+ if (cbp->cb_first)
+ zfs_print_prop_headers(cbp);
+
+ for (i = 0; i < 4; i++) {
+ switch (cbp->cb_columns[i]) {
+ case GET_COL_NAME:
+ str = name;
+ break;
+
+ case GET_COL_PROPERTY:
+ str = propname;
+ break;
+
+ case GET_COL_VALUE:
+ str = value;
+ break;
+
+ case GET_COL_SOURCE:
+ switch (sourcetype) {
+ case ZFS_SRC_NONE:
+ str = "-";
+ break;
+
+ case ZFS_SRC_DEFAULT:
+ str = "default";
+ break;
+
+ case ZFS_SRC_LOCAL:
+ str = "local";
+ break;
+
+ case ZFS_SRC_TEMPORARY:
+ str = "temporary";
+ break;
+
+ case ZFS_SRC_INHERITED:
+ (void) snprintf(buf, sizeof (buf),
+ "inherited from %s", source);
+ str = buf;
+ break;
+ }
+ break;
+
+ default:
+ continue;
+ }
+
+ if (cbp->cb_columns[i + 1] == 0)
+ (void) printf("%s", str);
+ else if (cbp->cb_scripted)
+ (void) printf("%s\t", str);
+ else
+ (void) printf("%-*s ",
+ cbp->cb_colwidths[cbp->cb_columns[i]],
+ str);
+
+ }
+
+ (void) printf("\n");
+}
diff --git a/usr/src/lib/libzfs/common/mapfile-vers b/usr/src/lib/libzfs/common/mapfile-vers
index 5a4206a9a8..6078e62489 100644
--- a/usr/src/lib/libzfs/common/mapfile-vers
+++ b/usr/src/lib/libzfs/common/mapfile-vers
@@ -33,6 +33,7 @@ SUNWprivate_1.1 {
libzfs_fini;
libzfs_init;
libzfs_print_on_error;
+ libzfs_print_one_property;
zfs_clone;
zfs_close;
zfs_create;
@@ -104,6 +105,7 @@ SUNWprivate_1.1 {
zpool_destroy;
zpool_disable_datasets;
zpool_enable_datasets;
+ zpool_expand_proplist;
zpool_export;
zpool_find_import;
zpool_find_vdev;
@@ -113,6 +115,8 @@ SUNWprivate_1.1 {
zpool_get_handle;
zpool_get_history;
zpool_get_name;
+ zpool_get_prop;
+ zpool_get_proplist;
zpool_get_root;
zpool_get_space_total;
zpool_get_space_used;
@@ -128,10 +132,14 @@ SUNWprivate_1.1 {
zpool_obj_to_path;
zpool_open;
zpool_open_canfail;
+ zpool_prop_iter;
+ zpool_prop_to_name;
+ zpool_prop_values;
zpool_read_label;
zpool_refresh_stats;
zpool_remove_zvol_links;
zpool_scrub;
+ zpool_set_prop;
zpool_unmount_datasets;
zpool_upgrade;
zpool_vdev_attach;
diff --git a/usr/src/lib/libzpool/common/kernel.c b/usr/src/lib/libzpool/common/kernel.c
index f073a73337..a7cd6dba3b 100644
--- a/usr/src/lib/libzpool/common/kernel.c
+++ b/usr/src/lib/libzpool/common/kernel.c
@@ -619,7 +619,7 @@ kobj_read_file(struct _buf *file, char *buf, unsigned size, unsigned off)
vn_rdwr(UIO_READ, (vnode_t *)file->_fd, buf, size, (offset_t)off,
UIO_SYSSPACE, 0, 0, 0, &resid);
- return (0);
+ return (size - resid);
}
void
@@ -630,15 +630,16 @@ kobj_close_file(struct _buf *file)
}
int
-kobj_fstat(intptr_t fd, struct bootstat *bst)
+kobj_get_filesize(struct _buf *file, uint64_t *size)
{
struct stat64 st;
- vnode_t *vp = (vnode_t *)fd;
+ vnode_t *vp = (vnode_t *)file->_fd;
+
if (fstat64(vp->v_fd, &st) == -1) {
vn_close(vp);
return (errno);
}
- bst->st_size = (uint64_t)st.st_size;
+ *size = st.st_size;
return (0);
}
diff --git a/usr/src/lib/libzpool/common/sys/zfs_context.h b/usr/src/lib/libzpool/common/sys/zfs_context.h
index 9e5806cb5d..5c6e500546 100644
--- a/usr/src/lib/libzpool/common/sys/zfs_context.h
+++ b/usr/src/lib/libzpool/common/sys/zfs_context.h
@@ -443,7 +443,6 @@ extern struct _buf *kobj_open_file(char *name);
extern int kobj_read_file(struct _buf *file, char *buf, unsigned size,
unsigned off);
extern void kobj_close_file(struct _buf *file);
-extern int kobj_fstat(intptr_t, struct bootstat *);
-
+extern int kobj_get_filesize(struct _buf *file, uint64_t *size);
#endif /* _SYS_ZFS_CONTEXT_H */
diff --git a/usr/src/pkgdefs/SUNWgrub/prototype_i386 b/usr/src/pkgdefs/SUNWgrub/prototype_i386
index 129f528084..61adab1875 100644
--- a/usr/src/pkgdefs/SUNWgrub/prototype_i386
+++ b/usr/src/pkgdefs/SUNWgrub/prototype_i386
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -19,7 +18,7 @@
#
# CDDL HEADER END
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -59,6 +58,7 @@ f none boot/grub/stage2 0644 root sys
f none boot/grub/stage2_eltorito 0644 root sys
f none boot/grub/ufs2_stage1_5 0644 root sys
f none boot/grub/ufs_stage1_5 0644 root sys
+f none boot/grub/zfs_stage1_5 0644 root sys
f none boot/grub/vstafs_stage1_5 0644 root sys
f none boot/grub/xfs_stage1_5 0644 root sys
f none boot/grub/stage1 0644 root sys
diff --git a/usr/src/pkgdefs/SUNWgrubS/prototype_i386 b/usr/src/pkgdefs/SUNWgrubS/prototype_i386
index 527073dab3..9e61bc96c0 100644
--- a/usr/src/pkgdefs/SUNWgrubS/prototype_i386
+++ b/usr/src/pkgdefs/SUNWgrubS/prototype_i386
@@ -2,9 +2,8 @@
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
-# Common Development and Distribution License, Version 1.0 only
-# (the "License"). You may not use this file except in compliance
-# with the License.
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
@@ -19,7 +18,7 @@
#
# CDDL HEADER END
#
-# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -154,6 +153,7 @@ f none usr/share/src/grub/stage2/fsys_minix.c 0644 root bin
f none usr/share/src/grub/stage2/fsys_reiserfs.c 0644 root bin
f none usr/share/src/grub/stage2/fsys_ufs.c 0644 root bin
f none usr/share/src/grub/stage2/fsys_ufs2.c 0644 root bin
+f none usr/share/src/grub/stage2/fsys_zfs.c 0644 root bin
f none usr/share/src/grub/stage2/fsys_vstafs.c 0644 root bin
f none usr/share/src/grub/stage2/fsys_xfs.c 0644 root bin
f none usr/share/src/grub/stage2/graphics.c 0644 root bin
@@ -189,10 +189,32 @@ f none usr/share/src/grub/stage2/terminfo.c 0644 root bin
f none usr/share/src/grub/stage2/terminfo.h 0644 root bin
f none usr/share/src/grub/stage2/tparm.c 0644 root bin
f none usr/share/src/grub/stage2/tparm.h 0644 root bin
+f none usr/share/src/grub/stage2/fsys_zfs.h 0644 root bin
f none usr/share/src/grub/stage2/ufs.h 0644 root bin
f none usr/share/src/grub/stage2/ufs2.h 0644 root bin
f none usr/share/src/grub/stage2/vstafs.h 0644 root bin
f none usr/share/src/grub/stage2/xfs.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs_sha256.c 0644 root bin
+f none usr/share/src/grub/stage2/zfs_lzjb.c 0644 root bin
+f none usr/share/src/grub/stage2/zfs_fletcher.c 0644 root bin
+
+d none usr/share/src/grub/stage2/zfs-include 0755 root bin
+f none usr/share/src/grub/stage2/zfs-include/dmu.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/dmu_objset.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/dnode.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/dsl_dataset.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/dsl_dir.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/spa.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/uberblock_impl.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/vdev_impl.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zap_impl.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zap_leaf.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zfs.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zfs_acl.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zfs_znode.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zil.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zio.h 0644 root bin
+f none usr/share/src/grub/stage2/zfs-include/zio_checksum.h 0644 root bin
d none usr/share/src/grub/stage1 0755 root bin
f none usr/share/src/grub/stage1/Makefile.am 0644 root bin
diff --git a/usr/src/uts/common/fs/vfs.c b/usr/src/uts/common/fs/vfs.c
index caee5c7fcd..54ce74311d 100644
--- a/usr/src/uts/common/fs/vfs.c
+++ b/usr/src/uts/common/fs/vfs.c
@@ -990,7 +990,7 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp,
int addmip = 0;
int splice = ((uap->flags & MS_NOSPLICE) == 0);
int fromspace = (uap->flags & MS_SYSSPACE) ?
- UIO_SYSSPACE : UIO_USERSPACE;
+ UIO_SYSSPACE : UIO_USERSPACE;
char *resource = NULL, *mountpt = NULL;
refstr_t *oldresource, *oldmntpt;
struct pathname pn, rpn;
@@ -1092,7 +1092,7 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp,
inargs[0] = '\0';
if (optlen) {
error = copyinstr(opts, inargs, (size_t)optlen,
- NULL);
+ NULL);
if (error) {
goto errout;
}
@@ -1165,7 +1165,7 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp,
*/
if ((uap->flags & MS_GLOBAL) == 0 &&
lookupname(uap->spec, fromspace,
- FOLLOW, NULL, &bvp) == 0) {
+ FOLLOW, NULL, &bvp) == 0) {
addmip = 1;
}
@@ -1359,8 +1359,8 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp,
* wlock above. This case is for a non-spliced, non-global filesystem.
*/
if (!addmip) {
- if ((uap->flags & MS_GLOBAL) == 0 &&
- lookupname(uap->spec, fromspace, FOLLOW, NULL, &bvp) == 0) {
+ if ((uap->flags & MS_GLOBAL) == 0 &&
+ lookupname(uap->spec, fromspace, FOLLOW, NULL, &bvp) == 0) {
addmip = 1;
}
}
@@ -1447,11 +1447,11 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp,
/* put back pre-remount options */
vfs_swapopttbl(&mnt_mntopts, &vfsp->vfs_mntopts);
vfs_setmntpoint(vfsp, (stripzonepath(
- refstr_value(oldmntpt))));
+ refstr_value(oldmntpt))));
if (oldmntpt)
refstr_rele(oldmntpt);
vfs_setresource(vfsp, (stripzonepath(
- refstr_value(oldresource))));
+ refstr_value(oldresource))));
if (oldresource)
refstr_rele(oldresource);
vfsp->vfs_flag = ovflags;
@@ -1533,7 +1533,7 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp,
if (uap->flags & MS_OPTIONSTR) {
vfs_list_read_lock();
copyout_error = vfs_buildoptionstr(
- &vfsp->vfs_mntopts, inargs, optlen);
+ &vfsp->vfs_mntopts, inargs, optlen);
vfs_list_unlock();
if (copyout_error == 0 &&
(uap->flags & MS_SYSSPACE) == 0) {
@@ -2746,7 +2746,7 @@ vfs_unmountall(void)
*/
vfs_list_lock();
for (vfsp = rootvfs->vfs_prev;
- vfsp != rootvfs; vfsp = vfsp->vfs_prev)
+ vfsp != rootvfs; vfsp = vfsp->vfs_prev)
if (vfsp == prev_vfsp)
break;
if (vfsp == rootvfs && prev_vfsp != rootvfs)
@@ -2788,7 +2788,7 @@ vfs_delmip(struct vfs *vfsp)
mutex_enter(&vfs_miplist_mutex);
mipprev = NULL;
for (mipp = vfs_miplist;
- mipp && mipp->mip_vfsp != vfsp; mipp = mipp->mip_next) {
+ mipp && mipp->mip_vfsp != vfsp; mipp = mipp->mip_next) {
mipprev = mipp;
}
if (mipp == NULL)
@@ -4162,6 +4162,16 @@ getrootfs(void)
== DDI_SUCCESS) {
(void) strncpy(rootfs.bo_fstype, propstr, BO_MAXFSNAME);
ddi_prop_free(propstr);
+
+ /*
+ * if the boot property 'fstype' is not set, but 'zfs-bootfs' is set,
+ * assume the type of this root filesystem is 'zfs'.
+ */
+ } else if (ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(),
+ DDI_PROP_DONTPASS, "zfs-bootfs", &propstr)
+ == DDI_SUCCESS) {
+ (void) strncpy(rootfs.bo_fstype, "zfs", BO_MAXFSNAME);
+ ddi_prop_free(propstr);
}
if (strncmp(rootfs.bo_fstype, "nfs", 3) != 0)
diff --git a/usr/src/uts/common/fs/zfs/dmu.c b/usr/src/uts/common/fs/zfs/dmu.c
index 9c6efa4bc8..8a7e3192e9 100644
--- a/usr/src/uts/common/fs/zfs/dmu.c
+++ b/usr/src/uts/common/fs/zfs/dmu.c
@@ -78,6 +78,7 @@ const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
{ zap_byteswap, TRUE, "persistent error log" },
{ byteswap_uint8_array, TRUE, "SPA history" },
{ byteswap_uint64_array, TRUE, "SPA history offsets" },
+ { zap_byteswap, TRUE, "Pool properties" },
};
int
@@ -179,7 +180,7 @@ dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset,
if (dn->dn_datablkshift) {
int blkshift = dn->dn_datablkshift;
nblks = (P2ROUNDUP(offset+length, 1ULL<<blkshift) -
- P2ALIGN(offset, 1ULL<<blkshift)) >> blkshift;
+ P2ALIGN(offset, 1ULL<<blkshift)) >> blkshift;
} else {
if (offset + length > dn->dn_datablksz) {
zfs_panic_recover("zfs: accessing past end of object "
@@ -329,7 +330,7 @@ dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset, uint64_t len)
if (dn->dn_datablkshift) {
int blkshift = dn->dn_datablkshift;
nblks = (P2ROUNDUP(offset+len, 1<<blkshift) -
- P2ALIGN(offset, 1<<blkshift)) >> blkshift;
+ P2ALIGN(offset, 1<<blkshift)) >> blkshift;
} else {
nblks = (offset < dn->dn_datablksz);
}
diff --git a/usr/src/uts/common/fs/zfs/dsl_dataset.c b/usr/src/uts/common/fs/zfs/dsl_dataset.c
index 698ac8eea4..a9707a0542 100644
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c
+++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c
@@ -1294,8 +1294,10 @@ dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
if (ds_prev && ds->ds_prev != ds_prev)
dsl_dataset_close(ds_prev, DS_MODE_NONE, FTAG);
+ spa_clear_bootfs(dp->dp_spa, ds->ds_object, tx);
dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, tag);
VERIFY(0 == dmu_object_free(mos, obj, tx));
+
}
/* ARGSUSED */
@@ -1855,3 +1857,33 @@ dsl_dataset_promote(const char *name)
dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
return (err);
}
+
+/*
+ * Given a pool name and a dataset object number in that pool,
+ * return the name of that dataset.
+ */
+int
+dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf)
+{
+ spa_t *spa;
+ dsl_pool_t *dp;
+ dsl_dataset_t *ds = NULL;
+ int error;
+
+ if ((error = spa_open(pname, &spa, FTAG)) != 0)
+ return (error);
+ dp = spa_get_dsl(spa);
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ if ((error = dsl_dataset_open_obj(dp, obj,
+ NULL, DS_MODE_NONE, FTAG, &ds)) != 0) {
+ rw_exit(&dp->dp_config_rwlock);
+ spa_close(spa, FTAG);
+ return (error);
+ }
+ dsl_dataset_name(ds, buf);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ rw_exit(&dp->dp_config_rwlock);
+ spa_close(spa, FTAG);
+
+ return (0);
+}
diff --git a/usr/src/uts/common/fs/zfs/spa.c b/usr/src/uts/common/fs/zfs/spa.c
index 15da66131d..aaa02792f5 100644
--- a/usr/src/uts/common/fs/zfs/spa.c
+++ b/usr/src/uts/common/fs/zfs/spa.c
@@ -48,10 +48,13 @@
#include <sys/txg.h>
#include <sys/avl.h>
#include <sys/dmu_traverse.h>
+#include <sys/dmu_objset.h>
#include <sys/unique.h>
#include <sys/dsl_pool.h>
+#include <sys/dsl_dataset.h>
#include <sys/dsl_dir.h>
#include <sys/dsl_prop.h>
+#include <sys/dsl_synctask.h>
#include <sys/fs/zfs.h>
#include <sys/callb.h>
@@ -134,6 +137,7 @@ spa_activate(spa_t *spa)
mutex_init(&spa->spa_config_lock.scl_lock, NULL, MUTEX_DEFAULT, NULL);
mutex_init(&spa->spa_sync_bplist.bpl_lock, NULL, MUTEX_DEFAULT, NULL);
mutex_init(&spa->spa_history_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_props_lock, NULL, MUTEX_DEFAULT, NULL);
list_create(&spa->spa_dirty_list, sizeof (vdev_t),
offsetof(vdev_t, vdev_dirty_node));
@@ -672,6 +676,23 @@ spa_load(spa_t *spa, nvlist_t *config, spa_load_state_t state, int mosconfig)
spa_config_exit(spa, FTAG);
}
+ error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_PROPS, sizeof (uint64_t), 1, &spa->spa_pool_props_object);
+
+ if (error && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ if (error == 0) {
+ (void) zap_lookup(spa->spa_meta_objset,
+ spa->spa_pool_props_object,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS),
+ sizeof (uint64_t), 1, &spa->spa_bootfs);
+ }
+
/*
* Load the vdev state for all toplevel vdevs.
*/
@@ -1176,6 +1197,7 @@ spa_create(const char *pool, nvlist_t *nvroot, const char *altroot)
dmu_tx_commit(tx);
+ spa->spa_bootfs = zfs_prop_default_numeric(ZFS_PROP_BOOTFS);
spa->spa_sync_on = B_TRUE;
txg_sync_start(spa->spa_dsl_pool);
@@ -2815,6 +2837,43 @@ spa_sync_config_object(spa_t *spa, dmu_tx_t *tx)
spa_sync_nvlist(spa, spa->spa_config_object, config, tx);
}
+static void
+spa_sync_props(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ spa_t *spa = arg1;
+ nvlist_t *nvp = arg2;
+ nvpair_t *nvpair;
+ objset_t *mos = spa->spa_meta_objset;
+ uint64_t zapobj;
+
+ mutex_enter(&spa->spa_props_lock);
+ if (spa->spa_pool_props_object == 0) {
+ zapobj = zap_create(mos, DMU_OT_POOL_PROPS, DMU_OT_NONE, 0, tx);
+ VERIFY(zapobj > 0);
+
+ spa->spa_pool_props_object = zapobj;
+
+ VERIFY(zap_update(mos, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_PROPS, 8, 1,
+ &spa->spa_pool_props_object, tx) == 0);
+ }
+ mutex_exit(&spa->spa_props_lock);
+
+ nvpair = NULL;
+ while ((nvpair = nvlist_next_nvpair(nvp, nvpair))) {
+ switch (zpool_name_to_prop(nvpair_name(nvpair))) {
+ case ZFS_PROP_BOOTFS:
+ VERIFY(nvlist_lookup_uint64(nvp,
+ nvpair_name(nvpair), &spa->spa_bootfs) == 0);
+ VERIFY(zap_update(mos,
+ spa->spa_pool_props_object,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS), 8, 1,
+ &spa->spa_bootfs, tx) == 0);
+ break;
+ }
+ }
+}
+
/*
* Sync the specified transaction group. New blocks may be dirtied as
* part of the process, so we iterate until it converges.
@@ -3093,3 +3152,105 @@ spa_has_spare(spa_t *spa, uint64_t guid)
return (B_FALSE);
}
+
+int
+spa_set_props(spa_t *spa, nvlist_t *nvp)
+{
+ return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_sync_props,
+ spa, nvp, 3));
+}
+
+int
+spa_get_props(spa_t *spa, nvlist_t **nvp)
+{
+ zap_cursor_t zc;
+ zap_attribute_t za;
+ objset_t *mos = spa->spa_meta_objset;
+ zfs_source_t src;
+ zfs_prop_t prop;
+ nvlist_t *propval;
+ uint64_t value;
+ int err;
+
+ VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ mutex_enter(&spa->spa_props_lock);
+ /* If no props object, then just return empty nvlist */
+ if (spa->spa_pool_props_object == 0) {
+ mutex_exit(&spa->spa_props_lock);
+ return (0);
+ }
+
+ for (zap_cursor_init(&zc, mos, spa->spa_pool_props_object);
+ (err = zap_cursor_retrieve(&zc, &za)) == 0;
+ zap_cursor_advance(&zc)) {
+
+ if ((prop = zpool_name_to_prop(za.za_name)) == ZFS_PROP_INVAL)
+ continue;
+
+ VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ switch (za.za_integer_length) {
+ case 8:
+ if (zfs_prop_default_numeric(prop) ==
+ za.za_first_integer)
+ src = ZFS_SRC_DEFAULT;
+ else
+ src = ZFS_SRC_LOCAL;
+ value = za.za_first_integer;
+
+ if (prop == ZFS_PROP_BOOTFS) {
+ dsl_pool_t *dp;
+ dsl_dataset_t *ds = NULL;
+ char strval[MAXPATHLEN];
+
+ dp = spa_get_dsl(spa);
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ if ((err = dsl_dataset_open_obj(dp,
+ za.za_first_integer, NULL, DS_MODE_NONE,
+ FTAG, &ds)) != 0) {
+ rw_exit(&dp->dp_config_rwlock);
+ break;
+ }
+ dsl_dataset_name(ds, strval);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ rw_exit(&dp->dp_config_rwlock);
+
+ VERIFY(nvlist_add_uint64(propval,
+ ZFS_PROP_SOURCE, src) == 0);
+ VERIFY(nvlist_add_string(propval,
+ ZFS_PROP_VALUE, strval) == 0);
+ } else {
+ VERIFY(nvlist_add_uint64(propval,
+ ZFS_PROP_SOURCE, src) == 0);
+ VERIFY(nvlist_add_uint64(propval,
+ ZFS_PROP_VALUE, value) == 0);
+ }
+ VERIFY(nvlist_add_nvlist(*nvp, za.za_name,
+ propval) == 0);
+ break;
+ }
+ nvlist_free(propval);
+ }
+ zap_cursor_fini(&zc);
+ mutex_exit(&spa->spa_props_lock);
+ if (err && err != ENOENT) {
+ nvlist_free(*nvp);
+ return (err);
+ }
+
+ return (0);
+}
+
+/*
+ * If the bootfs property value is dsobj, clear it.
+ */
+void
+spa_clear_bootfs(spa_t *spa, uint64_t dsobj, dmu_tx_t *tx)
+{
+ if (spa->spa_bootfs == dsobj && spa->spa_pool_props_object != 0) {
+ VERIFY(zap_remove(spa->spa_meta_objset,
+ spa->spa_pool_props_object,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS), tx) == 0);
+ spa->spa_bootfs = 0;
+ }
+}
diff --git a/usr/src/uts/common/fs/zfs/spa_config.c b/usr/src/uts/common/fs/zfs/spa_config.c
index 03ba60b0e3..803b329edc 100644
--- a/usr/src/uts/common/fs/zfs/spa_config.c
+++ b/usr/src/uts/common/fs/zfs/spa_config.c
@@ -20,7 +20,7 @@
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -74,7 +74,7 @@ spa_config_load(void)
spa_t *spa;
char pathname[128];
struct _buf *file;
- struct bootstat bst;
+ uint64_t fsize;
/*
* Open the configuration file.
@@ -86,21 +86,21 @@ spa_config_load(void)
if (file == (struct _buf *)-1)
return;
- if (kobj_fstat(file->_fd, &bst) != 0)
+ if (kobj_get_filesize(file, &fsize) != 0)
goto out;
- buf = kmem_alloc(bst.st_size, KM_SLEEP);
+ buf = kmem_alloc(fsize, KM_SLEEP);
/*
* Read the nvlist from the file.
*/
- if (kobj_read_file(file, buf, bst.st_size, 0) < 0)
+ if (kobj_read_file(file, buf, fsize, 0) < 0)
goto out;
/*
* Unpack the nvlist.
*/
- if (nvlist_unpack(buf, bst.st_size, &nvlist, KM_SLEEP) != 0)
+ if (nvlist_unpack(buf, fsize, &nvlist, KM_SLEEP) != 0)
goto out;
/*
@@ -132,7 +132,7 @@ spa_config_load(void)
out:
if (buf != NULL)
- kmem_free(buf, bst.st_size);
+ kmem_free(buf, fsize);
kobj_close_file(file);
}
diff --git a/usr/src/uts/common/fs/zfs/spa_misc.c b/usr/src/uts/common/fs/zfs/spa_misc.c
index 1db5529d2e..3e51849766 100644
--- a/usr/src/uts/common/fs/zfs/spa_misc.c
+++ b/usr/src/uts/common/fs/zfs/spa_misc.c
@@ -291,6 +291,7 @@ spa_remove(spa_t *spa)
mutex_destroy(&spa->spa_config_cache_lock);
mutex_destroy(&spa->spa_async_lock);
mutex_destroy(&spa->spa_history_lock);
+ mutex_destroy(&spa->spa_props_lock);
kmem_free(spa, sizeof (spa_t));
}
diff --git a/usr/src/uts/common/fs/zfs/sys/dmu.h b/usr/src/uts/common/fs/zfs/sys/dmu.h
index e545565e64..e07ca30234 100644
--- a/usr/src/uts/common/fs/zfs/sys/dmu.h
+++ b/usr/src/uts/common/fs/zfs/sys/dmu.h
@@ -107,6 +107,7 @@ typedef enum dmu_object_type {
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;
@@ -194,6 +195,7 @@ typedef void dmu_byteswap_func_t(void *buf, size_t size);
#define DMU_POOL_SPARES "spares"
#define DMU_POOL_DEFLATE "deflate"
#define DMU_POOL_HISTORY "history"
+#define DMU_POOL_PROPS "pool_props"
/*
* Allocate an object from this objset. The range of object numbers
diff --git a/usr/src/uts/common/fs/zfs/sys/dsl_dataset.h b/usr/src/uts/common/fs/zfs/sys/dsl_dataset.h
index 03350e6aa4..8929dbc875 100644
--- a/usr/src/uts/common/fs/zfs/sys/dsl_dataset.h
+++ b/usr/src/uts/common/fs/zfs/sys/dsl_dataset.h
@@ -163,6 +163,8 @@ uint64_t dsl_dataset_fsid_guid(dsl_dataset_t *ds);
void dsl_dataset_create_root(struct dsl_pool *dp, uint64_t *ddobjp,
dmu_tx_t *tx);
+int dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf);
+
#ifdef ZFS_DEBUG
#define dprintf_ds(ds, fmt, ...) do { \
if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
diff --git a/usr/src/uts/common/fs/zfs/sys/spa.h b/usr/src/uts/common/fs/zfs/sys/spa.h
index e9498cee72..2bcf4c8a32 100644
--- a/usr/src/uts/common/fs/zfs/sys/spa.h
+++ b/usr/src/uts/common/fs/zfs/sys/spa.h
@@ -463,6 +463,12 @@ extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
extern void spa_init(int flags);
extern void spa_fini(void);
+/* properties */
+extern int spa_set_props(spa_t *spa, nvlist_t *nvp);
+extern int spa_get_props(spa_t *spa, nvlist_t **nvp);
+extern void spa_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx);
+extern boolean_t spa_has_bootfs(spa_t *spa);
+
#ifdef ZFS_DEBUG
#define dprintf_bp(bp, fmt, ...) do { \
if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
diff --git a/usr/src/uts/common/fs/zfs/sys/spa_impl.h b/usr/src/uts/common/fs/zfs/sys/spa_impl.h
index 3b67731b67..8c57123ad4 100644
--- a/usr/src/uts/common/fs/zfs/sys/spa_impl.h
+++ b/usr/src/uts/common/fs/zfs/sys/spa_impl.h
@@ -64,6 +64,11 @@ typedef struct spa_history_phys {
uint64_t sh_records_lost; /* num of records overwritten */
} spa_history_phys_t;
+typedef struct spa_props {
+ nvlist_t *spa_props_nvp;
+ list_node_t spa_list_node;
+} spa_props_t;
+
struct spa {
/*
* Fields protected by spa_namespace_lock.
@@ -141,6 +146,9 @@ struct spa {
vdev_t *spa_pending_vdev; /* pending vdev additions */
nvlist_t **spa_pending_spares; /* pending spare additions */
uint_t spa_pending_nspares; /* # pending spares */
+ kmutex_t spa_props_lock; /* property lock */
+ uint64_t spa_pool_props_object; /* object for properties */
+ uint64_t spa_bootfs; /* default boot filesystem */
/*
* spa_refcnt must be the last element because it changes size based on
* compilation options. In order for the MDB module to function
diff --git a/usr/src/uts/common/fs/zfs/sys/zfs_znode.h b/usr/src/uts/common/fs/zfs/sys/zfs_znode.h
index 2b52f57c4c..b53eed9be3 100644
--- a/usr/src/uts/common/fs/zfs/sys/zfs_znode.h
+++ b/usr/src/uts/common/fs/zfs/sys/zfs_znode.h
@@ -85,6 +85,16 @@ extern "C" {
#define ZFS_MAXNAMELEN (MAXNAMELEN - 1)
/*
+ * The directory entry has the type (currently unused on Solaris) in the
+ * top 4 bits, and the object number in the low 48 bits. The "middle"
+ * 12 bits are unused.
+ */
+#define ZFS_DIRENT_TYPE(de) BF64_GET(de, 60, 4)
+#define ZFS_DIRENT_OBJ(de) BF64_GET(de, 0, 48)
+#define ZFS_DIRENT_MAKE(type, obj) (((uint64_t)type << 60) | obj)
+
+
+/*
* This is the persistent portion of the znode. It is stored
* in the "bonus buffer" of the file. Short symbolic links
* are also stored in the bonus buffer.
diff --git a/usr/src/uts/common/fs/zfs/zfs_dir.c b/usr/src/uts/common/fs/zfs/zfs_dir.c
index 2f161f987a..bf459719c5 100644
--- a/usr/src/uts/common/fs/zfs/zfs_dir.c
+++ b/usr/src/uts/common/fs/zfs/zfs_dir.c
@@ -172,6 +172,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
} else {
error = zap_lookup(zfsvfs->z_os, dzp->z_id, name,
8, 1, &zoid);
+ zoid = ZFS_DIRENT_OBJ(zoid);
if (error == ENOENT)
dnlc_update(ZTOV(dzp), name, DNLC_NO_VNODE);
}
@@ -398,7 +399,8 @@ zfs_purgedir(znode_t *dzp)
for (zap_cursor_init(&zc, zfsvfs->z_os, dzp->z_id);
(error = zap_cursor_retrieve(&zc, &zap)) == 0;
zap_cursor_advance(&zc)) {
- error = zfs_zget(zfsvfs, zap.za_first_integer, &xzp);
+ error = zfs_zget(zfsvfs,
+ ZFS_DIRENT_OBJ(zap.za_first_integer), &xzp);
ASSERT3U(error, ==, 0);
ASSERT((ZTOV(xzp)->v_type == VREG) ||
@@ -522,6 +524,7 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
{
znode_t *dzp = dl->dl_dzp;
vnode_t *vp = ZTOV(zp);
+ uint64_t value;
int zp_is_dir = (vp->v_type == VDIR);
int error;
@@ -549,8 +552,12 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
zfs_time_stamper_locked(dzp, CONTENT_MODIFIED, tx);
mutex_exit(&dzp->z_lock);
+ /*
+ * MacOS X will fill in the 4-bit object type here.
+ */
+ value = ZFS_DIRENT_MAKE(0, zp->z_id);
error = zap_add(zp->z_zfsvfs->z_os, dzp->z_id, dl->dl_name,
- 8, 1, &zp->z_id, tx);
+ 8, 1, &value, tx);
ASSERT(error == 0);
dnlc_update(ZTOV(dzp), dl->dl_name, vp);
diff --git a/usr/src/uts/common/fs/zfs/zfs_ioctl.c b/usr/src/uts/common/fs/zfs/zfs_ioctl.c
index fb321cf034..987d3b5493 100644
--- a/usr/src/uts/common/fs/zfs/zfs_ioctl.c
+++ b/usr/src/uts/common/fs/zfs/zfs_ioctl.c
@@ -40,7 +40,9 @@
#include <sys/zfs_ioctl.h>
#include <sys/zap.h>
#include <sys/spa.h>
+#include <sys/spa_impl.h>
#include <sys/vdev.h>
+#include <sys/vdev_impl.h>
#include <sys/dmu.h>
#include <sys/dsl_dir.h>
#include <sys/dsl_dataset.h>
@@ -547,25 +549,10 @@ zfs_ioc_pool_log_history(zfs_cmd_t *zc)
static int
zfs_ioc_dsobj_to_dsname(zfs_cmd_t *zc)
{
- spa_t *spa;
- dsl_pool_t *dp;
- dsl_dataset_t *ds = NULL;
int error;
- if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ if (error = dsl_dsobj_to_dsname(zc->zc_name, zc->zc_obj, zc->zc_value))
return (error);
- dp = spa_get_dsl(spa);
- rw_enter(&dp->dp_config_rwlock, RW_READER);
- if ((error = dsl_dataset_open_obj(dp, zc->zc_obj,
- NULL, DS_MODE_NONE, FTAG, &ds)) != 0) {
- rw_exit(&dp->dp_config_rwlock);
- spa_close(spa, FTAG);
- return (error);
- }
- dsl_dataset_name(ds, zc->zc_value);
- dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
- rw_exit(&dp->dp_config_rwlock);
- spa_close(spa, FTAG);
return (0);
}
@@ -598,6 +585,15 @@ zfs_ioc_vdev_add(zfs_cmd_t *zc)
if (error != 0)
return (error);
+ /*
+ * A root pool with concatenated devices is not supported.
+ * Thus, can not add a device to a root pool with one device.
+ */
+ if (spa->spa_root_vdev->vdev_children == 1 && spa->spa_bootfs != 0) {
+ spa_close(spa, FTAG);
+ return (EDOM);
+ }
+
if ((error = get_nvlist(zc, &config)) == 0) {
error = spa_vdev_add(spa, config);
nvlist_free(config);
@@ -1060,6 +1056,126 @@ zfs_ioc_set_prop(zfs_cmd_t *zc)
}
static int
+zfs_ioc_pool_props_set(zfs_cmd_t *zc)
+{
+ nvlist_t *nvl;
+ int error, reset_bootfs = 0;
+ uint64_t objnum;
+ zpool_prop_t prop;
+ nvpair_t *elem;
+ char *propname, *strval;
+ spa_t *spa;
+ vdev_t *rvdev;
+ char *vdev_type;
+ objset_t *os;
+
+ if ((error = get_nvlist(zc, &nvl)) != 0)
+ return (error);
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0) {
+ nvlist_free(nvl);
+ return (error);
+ }
+
+ if (spa_version(spa) < ZFS_VERSION_BOOTFS) {
+ nvlist_free(nvl);
+ spa_close(spa, FTAG);
+ return (ENOTSUP);
+ }
+
+ elem = NULL;
+ while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
+
+ propname = nvpair_name(elem);
+
+ if ((prop = zpool_name_to_prop(propname)) ==
+ ZFS_PROP_INVAL) {
+ nvlist_free(nvl);
+ spa_close(spa, FTAG);
+ return (EINVAL);
+ }
+
+ switch (prop) {
+ case ZFS_PROP_BOOTFS:
+ /*
+ * A bootable filesystem can not be on a RAIDZ pool
+ * nor a striped pool with more than 1 device.
+ */
+ rvdev = spa->spa_root_vdev;
+ vdev_type =
+ rvdev->vdev_child[0]->vdev_ops->vdev_op_type;
+ if (strcmp(vdev_type, VDEV_TYPE_RAIDZ) == 0 ||
+ (strcmp(vdev_type, VDEV_TYPE_MIRROR) != 0 &&
+ rvdev->vdev_children > 1)) {
+ error = ENOTSUP;
+ break;
+ }
+
+ reset_bootfs = 1;
+
+ VERIFY(nvpair_value_string(elem, &strval) == 0);
+ if (strval == NULL || strval[0] == '\0') {
+ objnum =
+ zfs_prop_default_numeric(ZFS_PROP_BOOTFS);
+ break;
+ }
+
+ if (error = dmu_objset_open(strval, DMU_OST_ZFS,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &os))
+ break;
+ objnum = dmu_objset_id(os);
+ dmu_objset_close(os);
+ break;
+
+ default:
+ error = EINVAL;
+ }
+
+ if (error)
+ break;
+ }
+ if (error == 0) {
+ if (reset_bootfs) {
+ VERIFY(nvlist_remove(nvl,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS),
+ DATA_TYPE_STRING) == 0);
+ VERIFY(nvlist_add_uint64(nvl,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS), objnum) == 0);
+ }
+ error = spa_set_props(spa, nvl);
+ }
+
+ nvlist_free(nvl);
+ spa_close(spa, FTAG);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_props_get(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+ nvlist_t *nvp = NULL;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ error = spa_get_props(spa, &nvp);
+
+ if (error == 0 && zc->zc_nvlist_dst != NULL)
+ error = put_nvlist(zc, nvp);
+ else
+ error = EFAULT;
+
+ spa_close(spa, FTAG);
+
+ if (nvp)
+ nvlist_free(nvp);
+ return (error);
+}
+
+static int
zfs_ioc_create_minor(zfs_cmd_t *zc)
{
return (zvol_create_minor(zc->zc_name, zc->zc_dev));
@@ -1523,7 +1639,9 @@ static zfs_ioc_vec_t zfs_ioc_vec[] = {
{ zfs_ioc_destroy_snaps, zfs_secpolicy_write, dataset_name },
{ zfs_ioc_snapshot, zfs_secpolicy_write, dataset_name },
{ zfs_ioc_dsobj_to_dsname, zfs_secpolicy_config, pool_name },
- { zfs_ioc_obj_to_path, zfs_secpolicy_config, no_name }
+ { zfs_ioc_obj_to_path, zfs_secpolicy_config, no_name },
+ { zfs_ioc_pool_props_set, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_props_get, zfs_secpolicy_read, pool_name },
};
static int
diff --git a/usr/src/uts/common/fs/zfs/zfs_vfsops.c b/usr/src/uts/common/fs/zfs/zfs_vfsops.c
index e5bd45c720..951fffcfac 100644
--- a/usr/src/uts/common/fs/zfs/zfs_vfsops.c
+++ b/usr/src/uts/common/fs/zfs/zfs_vfsops.c
@@ -45,6 +45,7 @@
#include <sys/fs/zfs.h>
#include <sys/dmu.h>
#include <sys/dsl_prop.h>
+#include <sys/dsl_dataset.h>
#include <sys/spa.h>
#include <sys/zap.h>
#include <sys/varargs.h>
@@ -64,8 +65,6 @@ static major_t zfs_major;
static minor_t zfs_minor;
static kmutex_t zfs_dev_mtx;
-extern char zfs_bootpath[BO_MAXOBJNAME];
-
static int zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr);
static int zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr);
static int zfs_mountroot(vfs_t *vfsp, enum whymountroot);
@@ -368,7 +367,7 @@ zfs_refresh_properties(vfs_t *vfsp)
if (!dmu_objset_is_snapshot(zfsvfs->z_os))
readonly_changed_cb(zfsvfs, B_FALSE);
else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL))
- return (EROFS);
+ return (EROFS);
}
if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
@@ -444,8 +443,7 @@ zfs_register_callbacks(vfs_t *vfsp)
if (vfs_optionisset(vfsp, MNTOPT_NODEVICES, NULL)) {
devices = B_FALSE;
do_devices = B_TRUE;
- } else if (vfs_optionisset(vfsp,
- MNTOPT_DEVICES, NULL)) {
+ } else if (vfs_optionisset(vfsp, MNTOPT_DEVICES, NULL)) {
devices = B_TRUE;
do_devices = B_TRUE;
}
@@ -699,6 +697,59 @@ zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
}
}
+/*
+ * Convert a decimal digit string to a uint64_t integer.
+ */
+static int
+str_to_uint64(char *str, uint64_t *objnum)
+{
+ uint64_t num = 0;
+
+ while (*str) {
+ if (*str < '0' || *str > '9')
+ return (EINVAL);
+
+ num = num*10 + *str++ - '0';
+ }
+
+ *objnum = num;
+ return (0);
+}
+
+
+/*
+ * The boot path passed from the boot loader is in the form of
+ * "rootpool-name/root-filesystem-object-number'. Convert this
+ * string to a dataset name: "rootpool-name/root-filesystem-name".
+ */
+static int
+parse_bootpath(char *bpath, char *outpath)
+{
+ char *slashp;
+ uint64_t objnum;
+ int error;
+
+ if (*bpath == 0 || *bpath == '/')
+ return (EINVAL);
+
+ slashp = strchr(bpath, '/');
+
+ /* if no '/', just return the pool name */
+ if (slashp == NULL) {
+ (void) strcpy(outpath, bpath);
+ return (0);
+ }
+
+ if (error = str_to_uint64(slashp+1, &objnum))
+ return (error);
+
+ *slashp = '\0';
+ error = dsl_dsobj_to_dsname(bpath, objnum, outpath);
+ *slashp = '/';
+
+ return (error);
+}
+
static int
zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
{
@@ -708,31 +759,33 @@ zfs_mountroot(vfs_t *vfsp, enum whymountroot why)
zfsvfs_t *zfsvfs = NULL;
znode_t *zp = NULL;
vnode_t *vp = NULL;
+ char *zfs_bootpath;
ASSERT(vfsp);
/*
- * The filesystem that we mount as root is defined in
- * /etc/system using the zfsroot variable. The value defined
- * there is copied early in startup code to zfs_bootpath
- * (defined in modsysfile.c).
+ * The filesystem that we mount as root is defined in the
+ * "zfs-bootfs" property.
*/
if (why == ROOT_INIT) {
if (zfsrootdone++)
return (EBUSY);
- /*
- * This needs to be done here, so that when we return from
- * mountroot, the vfs resource name will be set correctly.
- */
- if (snprintf(rootfs.bo_name, BO_MAXOBJNAME, "%s", zfs_bootpath)
- >= BO_MAXOBJNAME)
- return (ENAMETOOLONG);
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(),
+ DDI_PROP_DONTPASS, "zfs-bootfs", &zfs_bootpath) !=
+ DDI_SUCCESS)
+ return (EIO);
+
+ error = parse_bootpath(zfs_bootpath, rootfs.bo_name);
+ ddi_prop_free(zfs_bootpath);
+
+ if (error)
+ return (error);
if (error = vfs_lock(vfsp))
return (error);
- if (error = zfs_domount(vfsp, zfs_bootpath, CRED()))
+ if (error = zfs_domount(vfsp, rootfs.bo_name, CRED()))
goto out;
zfsvfs = (zfsvfs_t *)vfsp->vfs_data;
@@ -791,7 +844,7 @@ zfs_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
pathname_t spn;
int error = 0;
uio_seg_t fromspace = (uap->flags & MS_SYSSPACE) ?
- UIO_SYSSPACE : UIO_USERSPACE;
+ UIO_SYSSPACE : UIO_USERSPACE;
int canwrite;
if (mvp->v_type != VDIR)
diff --git a/usr/src/uts/common/fs/zfs/zfs_vnops.c b/usr/src/uts/common/fs/zfs/zfs_vnops.c
index fd1aae2e38..e18f04823e 100644
--- a/usr/src/uts/common/fs/zfs/zfs_vnops.c
+++ b/usr/src/uts/common/fs/zfs/zfs_vnops.c
@@ -1601,9 +1601,7 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp)
zap_cursor_t zc;
zap_attribute_t zap;
uint_t bytes_wanted;
- ushort_t this_reclen;
uint64_t offset; /* must be unsigned; checks for < 1 */
- off64_t *next;
int local_eof;
int outcount;
int error;
@@ -1673,22 +1671,22 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp)
*/
outcount = 0;
while (outcount < bytes_wanted) {
+ ino64_t objnum;
+ ushort_t reclen;
+ off64_t *next;
+
/*
* Special case `.', `..', and `.zfs'.
*/
if (offset == 0) {
(void) strcpy(zap.za_name, ".");
- zap.za_first_integer = zp->z_id;
- this_reclen = DIRENT64_RECLEN(1);
+ objnum = zp->z_id;
} else if (offset == 1) {
(void) strcpy(zap.za_name, "..");
- zap.za_first_integer = zp->z_phys->zp_parent;
- this_reclen = DIRENT64_RECLEN(2);
+ objnum = zp->z_phys->zp_parent;
} else if (offset == 2 && zfs_show_ctldir(zp)) {
(void) strcpy(zap.za_name, ZFS_CTLDIR_NAME);
- zap.za_first_integer = ZFSCTL_INO_ROOT;
- this_reclen =
- DIRENT64_RECLEN(sizeof (ZFS_CTLDIR_NAME) - 1);
+ objnum = ZFSCTL_INO_ROOT;
} else {
/*
* Grab next entry.
@@ -1709,13 +1707,19 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp)
error = ENXIO;
goto update;
}
- this_reclen = DIRENT64_RECLEN(strlen(zap.za_name));
+
+ objnum = ZFS_DIRENT_OBJ(zap.za_first_integer);
+ /*
+ * MacOS X can extract the object type here such as:
+ * uint8_t type = ZFS_DIRENT_TYPE(zap.za_first_integer);
+ */
}
+ reclen = DIRENT64_RECLEN(strlen(zap.za_name));
/*
* Will this entry fit in the buffer?
*/
- if (outcount + this_reclen > bufsize) {
+ if (outcount + reclen > bufsize) {
/*
* Did we manage to fit anything in the buffer?
*/
@@ -1728,20 +1732,20 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp)
/*
* Add this entry:
*/
- odp->d_ino = (ino64_t)zap.za_first_integer;
- odp->d_reclen = (ushort_t)this_reclen;
+ odp->d_ino = objnum;
+ odp->d_reclen = reclen;
/* NOTE: d_off is the offset for the *next* entry */
next = &(odp->d_off);
(void) strncpy(odp->d_name, zap.za_name,
- DIRENT64_NAMELEN(this_reclen));
- outcount += this_reclen;
- odp = (dirent64_t *)((intptr_t)odp + this_reclen);
+ DIRENT64_NAMELEN(reclen));
+ outcount += reclen;
+ odp = (dirent64_t *)((intptr_t)odp + reclen);
ASSERT(outcount <= bufsize);
/* Prefetch znode */
if (prefetch)
- dmu_prefetch(os, zap.za_first_integer, 0, 0);
+ dmu_prefetch(os, objnum, 0, 0);
/*
* Move to the next entry, fill in the previous offset.
diff --git a/usr/src/uts/common/krtld/kobj.c b/usr/src/uts/common/krtld/kobj.c
index 87c66363c8..ad0f5239a7 100644
--- a/usr/src/uts/common/krtld/kobj.c
+++ b/usr/src/uts/common/krtld/kobj.c
@@ -668,7 +668,7 @@ attr_val(val_t *bootaux)
strlen(bootaux[libmacros[i].lmi_ba_index].ba_ptr) +
1, KM_WAIT);
(void) strcpy(libmacros[i].lmi_list,
- bootaux[libmacros[i].lmi_ba_index].ba_ptr);
+ bootaux[libmacros[i].lmi_ba_index].ba_ptr);
}
libmacros[i].lmi_macrolen = strlen(libmacros[i].lmi_macroname);
}
@@ -916,12 +916,12 @@ load_linker(val_t *bootaux)
mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize;
mp->flags = KOBJ_INTERP|KOBJ_PRIM;
mp->strhdr = (Shdr *)
- (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize);
+ (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize);
mp->strings = (char *)mp->strhdr->sh_addr;
mp->hashsize = kobj_gethashsize(mp->nsyms);
mp->symsize = mp->symhdr->sh_size + mp->strhdr->sh_size + sizeof (int) +
- (mp->hashsize + mp->nsyms) * sizeof (symid_t);
+ (mp->hashsize + mp->nsyms) * sizeof (symid_t);
mp->chains = kobj_zalloc(mp->nsyms * sizeof (symid_t), KM_WAIT);
mp->buckets = kobj_zalloc(mp->hashsize * sizeof (symid_t), KM_WAIT);
@@ -1218,12 +1218,12 @@ bind_primary(val_t *bootaux, int lmid)
case DT_RELA:
shtype = SHT_RELA;
rela = (char *)(dyn->d_un.d_ptr +
- dynseg);
+ dynseg);
break;
case DT_REL:
shtype = SHT_REL;
rela = (char *)(dyn->d_un.d_ptr +
- dynseg);
+ dynseg);
break;
}
}
@@ -1828,7 +1828,7 @@ kobj_set_ctf(struct module *mp, caddr_t data, size_t size)
if (!standalone) {
if (mp->ctfdata != NULL) {
if (vmem_contains(ctf_arena, mp->ctfdata,
- mp->ctfsize)) {
+ mp->ctfsize)) {
vmem_free(ctf_arena, mp->ctfdata, mp->ctfsize);
} else {
kobj_free(mp->ctfdata, mp->ctfsize);
@@ -2303,14 +2303,14 @@ get_progbits(struct module *mp, struct _buf *file)
limit = _text + lg_pagesize;
mp->text = kobj_segbrk(&_etext, mp->text_size,
- tp->align, limit);
+ tp->align, limit);
/*
* If we can't grow the text segment, try the
* data segment before failing.
*/
if (mp->text == NULL) {
mp->text = kobj_segbrk(&_edata, mp->text_size,
- tp->align, 0);
+ tp->align, 0);
}
mp->data = kobj_segbrk(&_edata, mp->data_size, dp->align, 0);
@@ -2530,7 +2530,7 @@ get_syms(struct module *mp, struct _buf *file)
if (mp->flags & KOBJ_EXEC)
return (0);
_kobj_printf(ops, "krtld: get_syms: %s ",
- mp->filename);
+ mp->filename);
_kobj_printf(ops, "no SHT_SYMTAB symbol table found\n");
return (-1);
}
@@ -2541,7 +2541,7 @@ get_syms(struct module *mp, struct _buf *file)
if ((mp->symhdr == 0) || (mp->symhdr->sh_link >= mp->hdr.e_shnum))
return (-1);
mp->strhdr = (Shdr *)
- (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize);
+ (mp->shdrs + mp->symhdr->sh_link * mp->hdr.e_shentsize);
mp->nsyms = mp->symhdr->sh_size / mp->symhdr->sh_entsize;
mp->hashsize = kobj_gethashsize(mp->nsyms);
@@ -2719,7 +2719,7 @@ crypto_es_hash(struct module *mp, char *hash, char *shstrtab)
_kobj_printf(ops,
"krtld: crypto_es_hash: updating hash with"
" %s data size=%d\n", shstrtab + shp->sh_name,
- shp->sh_size);
+ shp->sh_size);
#endif
ASSERT(shp->sh_addr != NULL);
SHA1Update(&ctx, (const uint8_t *)shp->sh_addr, shp->sh_size);
@@ -3006,9 +3006,9 @@ do_symbols(struct module *mp, Elf64_Addr bss_base)
if (ELF_ST_TYPE(sp->st_info) == STT_SPARC_REGISTER) {
if (*name != '\0') {
_kobj_printf(ops, "%s: named REGISTER symbol ",
- mp->filename);
+ mp->filename);
_kobj_printf(ops, "not supported '%s'\n",
- name);
+ name);
err = DOSYM_UNDEF;
}
continue;
@@ -3019,9 +3019,9 @@ do_symbols(struct module *mp, Elf64_Addr bss_base)
*/
if (ELF_ST_TYPE(sp->st_info) == STT_TLS) {
_kobj_printf(ops, "%s: TLS symbol ",
- mp->filename);
+ mp->filename);
_kobj_printf(ops, "not supported '%s'\n",
- name);
+ name);
err = DOSYM_UNDEF;
continue;
}
@@ -3389,7 +3389,7 @@ sym_insert(struct module *mp, char *name, symid_t index)
lastmp = mp;
}
sp = (Sym *)(mp->symtbl +
- index * mp->symhdr->sh_entsize);
+ index * mp->symhdr->sh_entsize);
_kobj_printf(ops, "krtld:\t[%3d]", index);
_kobj_printf(ops, "\t0x%lx", sp->st_value);
_kobj_printf(ops, "\t%s\n", name);
@@ -3596,7 +3596,7 @@ kobjopen_thread(struct kobjopen_tctl *ltp)
mutex_init(&cpr_lk, NULL, MUTEX_DEFAULT, NULL);
CALLB_CPR_INIT(&cpr_i, &cpr_lk, callb_generic_cpr, "kobjopen");
ltp->Errno = vn_open(ltp->name, UIO_SYSSPACE, FREAD, 0, &(ltp->vp),
- 0, 0);
+ 0, 0);
sema_v(&ltp->sema);
mutex_enter(&cpr_lk);
CALLB_CPR_EXIT(&cpr_i);
@@ -3808,7 +3808,7 @@ kobj_read_file(struct _buf *file, char *buf, unsigned size, unsigned off)
if (page_addr == off &&
(c_size = F_PAGE(size)) && buf) {
c_size = kobj_read(file->_fd, buf, c_size,
- page_addr);
+ page_addr);
if (c_size < 0) {
count = -1;
break;
@@ -3826,7 +3826,7 @@ kobj_read_file(struct _buf *file, char *buf, unsigned size, unsigned off)
} else {
file->_off = page_addr;
c_size = kobj_read(file->_fd, file->_base,
- MAXBSIZE, page_addr);
+ MAXBSIZE, page_addr);
file->_ptr = file->_base;
file->_cnt = c_size;
file->_size = c_size;
@@ -3987,7 +3987,7 @@ kobj_segbrk(caddr_t *spp, size_t size, size_t align, caddr_t limit)
}
npva = (uintptr_t)BOP_ALLOC(ops, (caddr_t)pva,
- alloc_size, alloc_align);
+ alloc_size, alloc_align);
if (npva == NULL) {
_kobj_printf(ops, "BOP_ALLOC failed, 0x%lx bytes",
@@ -4021,6 +4021,45 @@ kobj_gethashsize(uint_t n)
return (hsize);
}
+/*
+ * Get the file size.
+ *
+ * Before root is mounted, files are compressed in the boot_archive ramdisk
+ * (in the memory). kobj_fstat would return the compressed file size.
+ * In order to get the uncompressed file size, read the file to the end and
+ * count its size.
+ */
+int
+kobj_get_filesize(struct _buf *file, uint64_t *size)
+{
+ if (_modrootloaded) {
+ struct bootstat bst;
+
+ if (kobj_fstat(file->_fd, &bst) != 0)
+ return (EIO);
+ *size = bst.st_size;
+ } else {
+ char *buf;
+ int count;
+ uint64_t offset = 0;
+
+ buf = kmem_alloc(MAXBSIZE, KM_SLEEP);
+ do {
+ count = kobj_read_file(file, buf, MAXBSIZE, offset);
+ if (count < 0) {
+ kmem_free(buf, MAXBSIZE);
+ return (EIO);
+ }
+ offset += count;
+ } while (count == MAXBSIZE);
+ kmem_free(buf, MAXBSIZE);
+
+ *size = offset;
+ }
+
+ return (0);
+}
+
static char *
basename(char *s)
{
diff --git a/usr/src/uts/common/krtld/kobj_stubs.c b/usr/src/uts/common/krtld/kobj_stubs.c
index c592fb5317..3ef581f1c3 100644
--- a/usr/src/uts/common/krtld/kobj_stubs.c
+++ b/usr/src/uts/common/krtld/kobj_stubs.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -114,6 +114,13 @@ kobj_fstat(intptr_t descr, struct bootstat *buf)
/*ARGSUSED*/
int
+kobj_get_filesize(struct _buf *file, uint64_t *size)
+{
+ return (-1);
+}
+
+/*ARGSUSED*/
+int
kobj_filbuf(struct _buf *f)
{
return (-1);
diff --git a/usr/src/uts/common/krtld/mapfile b/usr/src/uts/common/krtld/mapfile
index cb1f85b04a..65ff471ca8 100644
--- a/usr/src/uts/common/krtld/mapfile
+++ b/usr/src/uts/common/krtld/mapfile
@@ -18,7 +18,7 @@
#
# CDDL HEADER END
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
#pragma ident "%Z%%M% %I% %E% SMI"
@@ -36,6 +36,7 @@
kobj_filbuf;
kobj_free;
kobj_fstat;
+ kobj_get_filesize;
kobj_getelfsym;
kobj_getmodinfo;
kobj_getpagesize;
diff --git a/usr/src/uts/common/os/modsysfile.c b/usr/src/uts/common/os/modsysfile.c
index 6e94457e95..d1538a3f9d 100644
--- a/usr/src/uts/common/os/modsysfile.c
+++ b/usr/src/uts/common/os/modsysfile.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -72,7 +72,6 @@ static vmem_t *mod_sysfile_arena; /* parser memory */
char obp_bootpath[BO_MAXOBJNAME]; /* bootpath from obp */
char svm_bootpath[BO_MAXOBJNAME]; /* bootpath redirected via rootdev */
-char zfs_bootpath[BO_MAXOBJNAME]; /* zfs bootpath, set via zfsroot */
#if defined(_PSM_MODULES)
@@ -135,7 +134,7 @@ parse_debug(struct _buf *file, char *fmt, ...)
vprintf(fmt, adx);
if (file)
printf(" on line %d of %s\n", kobj_linenum(file),
- kobj_filename(file));
+ kobj_filename(file));
va_end(adx);
}
}
@@ -489,8 +488,6 @@ static struct modcmd modcmd[] = {
{ "set32", MOD_SET32 },
{ "SET64", MOD_SET64 },
{ "set64", MOD_SET64 },
- { "ZFSROOT", MOD_ZFSROOT },
- { "zfsroot", MOD_ZFSROOT },
{ NULL, MOD_UNKNOWN }
};
@@ -530,7 +527,6 @@ do_sysfile_cmd(struct _buf *file, const char *cmd)
*/
case MOD_ROOTFS:
case MOD_SWAPFS:
- case MOD_ZFSROOT:
if ((token = kobj_lex(file, tok1, sizeof (tok1))) == COLON) {
token = kobj_lex(file, tok1, sizeof (tok1));
} else {
@@ -1182,9 +1178,9 @@ sys_set_var(int fcn, struct sysparam *sysp, void *p)
symaddr = kobj_getelfsym(sysp->sys_ptr, NULL, &size);
} else if (fcn == SYS_SET_MVAR) {
if (sysp->sys_modnam == (char *)NULL ||
- strcmp(((struct modctl *)p)->mod_modname,
- sysp->sys_modnam) != 0)
- return;
+ strcmp(((struct modctl *)p)->mod_modname,
+ sysp->sys_modnam) != 0)
+ return;
symaddr = kobj_getelfsym(sysp->sys_ptr,
((struct modctl *)p)->mod_mp, &size);
} else
@@ -1523,10 +1519,6 @@ setparams()
(void) copystr(sysp->sys_ptr, bootobjp->bo_fstype,
BO_MAXOBJNAME, NULL);
break;
- case MOD_ZFSROOT:
- (void) copystr(sysp->sys_ptr, zfs_bootpath,
- BO_MAXOBJNAME, NULL);
- break;
default:
break;
}
@@ -1636,13 +1628,13 @@ valid_prop_name(char *name)
for (i = 0; i < len; i++) {
if (name[i] < 0x21 ||
- name[i] == '/' ||
- name[i] == '\\' ||
- name[i] == ':' ||
- name[i] == '[' ||
- name[i] == ']' ||
- name[i] == '@')
- return (0);
+ name[i] == '/' ||
+ name[i] == '\\' ||
+ name[i] == ':' ||
+ name[i] == '[' ||
+ name[i] == ']' ||
+ name[i] == '@')
+ return (0);
}
return (1);
}
@@ -1817,12 +1809,12 @@ get_hwc_spec(struct _buf *file, char *tokbuf, size_t linesize)
strcmp(tokbuf, "class") == 0) {
state = drvclass;
prop_name = kmem_alloc(strlen(tokbuf) +
- 1, KM_SLEEP);
+ 1, KM_SLEEP);
(void) strcpy(prop_name, tokbuf);
} else {
state = prop;
prop_name = kmem_alloc(strlen(tokbuf) +
- 1, KM_SLEEP);
+ 1, KM_SLEEP);
(void) strcpy(prop_name, tokbuf);
}
break;
@@ -1853,7 +1845,7 @@ get_hwc_spec(struct _buf *file, char *tokbuf, size_t linesize)
case name_equals:
if (ddi_get_name((dev_info_t *)devi)) {
kobj_file_err(CE_WARN, file, "%s %s",
- nm_err, omit_err);
+ nm_err, omit_err);
goto bad;
}
devi->devi_name = kmem_alloc(strlen(tokbuf) + 1,
@@ -1864,7 +1856,7 @@ get_hwc_spec(struct _buf *file, char *tokbuf, size_t linesize)
case parent_equals:
if (hwcp->hwc_parent_name) {
kobj_file_err(CE_WARN, file, "%s %s",
- prnt_err, omit_err);
+ prnt_err, omit_err);
goto bad;
}
hwcp->hwc_parent_name = kmem_alloc(strlen
@@ -1940,7 +1932,7 @@ get_hwc_spec(struct _buf *file, char *tokbuf, size_t linesize)
case prop_equals_string:
case prop_equals_integer:
make_prop(file, (dev_info_t *)devi,
- prop_name, val_list);
+ prop_name, val_list);
break;
case hwc_begin:
@@ -2769,7 +2761,7 @@ add_class(char *exporter, char *class)
*/
if (ddi_name_to_major(exporter) >= devcnt) {
cmn_err(CE_WARN, "No major number for driver %s"
- " in class %s", exporter, class);
+ " in class %s", exporter, class);
return;
}
hcl = kmem_zalloc(sizeof (struct hwc_class), KM_SLEEP);
@@ -3022,7 +3014,7 @@ close_mach_list(void)
machp = pmach_head;
pmach_head = machp->m_next;
kmem_free(machp, sizeof (struct psm_mach) +
- strlen(machp->m_machname) + 1);
+ strlen(machp->m_machname) + 1);
}
}
#endif /* _PSM_MODULES */
diff --git a/usr/src/uts/common/sys/fs/zfs.h b/usr/src/uts/common/sys/fs/zfs.h
index 185a084806..82a9fdf2dd 100644
--- a/usr/src/uts/common/sys/fs/zfs.h
+++ b/usr/src/uts/common/sys/fs/zfs.h
@@ -45,7 +45,8 @@ extern "C" {
typedef enum {
ZFS_TYPE_FILESYSTEM = 0x1,
ZFS_TYPE_SNAPSHOT = 0x2,
- ZFS_TYPE_VOLUME = 0x4
+ ZFS_TYPE_VOLUME = 0x4,
+ ZFS_TYPE_POOL = 0x8
} zfs_type_t;
#define ZFS_TYPE_ANY \
@@ -94,20 +95,35 @@ typedef enum {
ZFS_PROP_ISCSIOPTIONS, /* not exposed to the user */
ZFS_PROP_XATTR,
ZFS_PROP_NUMCLONES, /* not exposed to the user */
- ZFS_PROP_COPIES
+ ZFS_PROP_COPIES,
+ ZFS_PROP_BOOTFS
} zfs_prop_t;
+typedef zfs_prop_t zpool_prop_t;
+
#define ZFS_PROP_VALUE "value"
#define ZFS_PROP_SOURCE "source"
+typedef enum {
+ ZFS_SRC_NONE = 0x1,
+ ZFS_SRC_DEFAULT = 0x2,
+ ZFS_SRC_TEMPORARY = 0x4,
+ ZFS_SRC_LOCAL = 0x8,
+ ZFS_SRC_INHERITED = 0x10
+} zfs_source_t;
+
+#define ZFS_SRC_ALL 0x1f
+
/*
* The following functions are shared between libzfs and the kernel.
*/
zfs_prop_t zfs_name_to_prop(const char *);
+zpool_prop_t zpool_name_to_prop(const char *);
boolean_t zfs_prop_user(const char *);
int zfs_prop_readonly(zfs_prop_t);
const char *zfs_prop_default_string(zfs_prop_t);
const char *zfs_prop_to_name(zfs_prop_t);
+const char *zpool_prop_to_name(zfs_prop_t);
uint64_t zfs_prop_default_numeric(zfs_prop_t);
int zfs_prop_inheritable(zfs_prop_t);
int zfs_prop_string_to_index(zfs_prop_t, const char *, uint64_t *);
@@ -117,7 +133,9 @@ int zfs_prop_index_to_string(zfs_prop_t, uint64_t, const char **);
* Property Iterator
*/
typedef zfs_prop_t (*zfs_prop_f)(zfs_prop_t, void *);
+typedef zfs_prop_f zpool_prop_f;
extern zfs_prop_t zfs_prop_iter(zfs_prop_f, void *, boolean_t);
+extern zpool_prop_t zpool_prop_iter(zpool_prop_f, void *, boolean_t);
/*
* On-disk version number.
@@ -127,8 +145,14 @@ extern zfs_prop_t zfs_prop_iter(zfs_prop_f, void *, boolean_t);
#define ZFS_VERSION_3 3ULL
#define ZFS_VERSION_4 4ULL
#define ZFS_VERSION_5 5ULL
-#define ZFS_VERSION ZFS_VERSION_5
-#define ZFS_VERSION_STRING "5"
+#define ZFS_VERSION_6 6ULL
+/*
+ * When bumping up ZFS_VERSION, make sure GRUB ZFS understand the on-disk
+ * format change. Go to usr/src/grub/grub-0.95/stage2/{zfs-include/, fsys_zfs*},
+ * and do the appropriate changes.
+ */
+#define ZFS_VERSION ZFS_VERSION_6
+#define ZFS_VERSION_STRING "6"
/*
* Symbolic names for the changes that caused a ZFS_VERSION switch.
@@ -150,6 +174,7 @@ extern zfs_prop_t zfs_prop_iter(zfs_prop_f, void *, boolean_t);
#define ZFS_VERSION_DNODE_BYTES ZFS_VERSION_3
#define ZFS_VERSION_ZPOOL_HISTORY ZFS_VERSION_4
#define ZFS_VERSION_GZIP_COMPRESSION ZFS_VERSION_5
+#define ZFS_VERSION_BOOTFS ZFS_VERSION_6
/*
* The following are configuration names used in the nvlist describing a pool's
@@ -367,7 +392,9 @@ typedef enum zfs_ioc {
ZFS_IOC_DESTROY_SNAPS,
ZFS_IOC_SNAPSHOT,
ZFS_IOC_DSOBJ_TO_DSNAME,
- ZFS_IOC_OBJ_TO_PATH
+ ZFS_IOC_OBJ_TO_PATH,
+ ZFS_IOC_POOL_SET_PROPS,
+ ZFS_IOC_POOL_GET_PROPS
} zfs_ioc_t;
/*
diff --git a/usr/src/uts/common/sys/kobj.h b/usr/src/uts/common/sys/kobj.h
index 9276aa370f..6c8fde02b4 100644
--- a/usr/src/uts/common/sys/kobj.h
+++ b/usr/src/uts/common/sys/kobj.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -174,6 +174,7 @@ extern void kobj_free(void *, size_t);
extern struct _buf *kobj_open_file(char *);
extern void kobj_close_file(struct _buf *);
extern int kobj_read_file(struct _buf *, char *, unsigned, unsigned);
+extern int kobj_get_filesize(struct _buf *, uint64_t *size);
extern uintptr_t kobj_getelfsym(char *, void *, int *);
extern void kobj_set_ctf(struct module *, caddr_t data, size_t size);
diff --git a/usr/src/uts/common/sys/sysconf.h b/usr/src/uts/common/sys/sysconf.h
index 654436a115..5bb62c40a1 100644
--- a/usr/src/uts/common/sys/sysconf.h
+++ b/usr/src/uts/common/sys/sysconf.h
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -71,7 +71,6 @@ struct modcmd {
#define MOD_UNKNOWN 9 /* unknown command */
#define MOD_SET32 10 /* like MOD_SET but -only- on 32-bit kernel */
#define MOD_SET64 11 /* like MOD_SET but -only- on 64-bit kernel */
-#define MOD_ZFSROOT 12 /* use zfs as the root filesystem */
/*
* Commands for mod_sysctl()
diff --git a/usr/src/uts/intel/sys/bootconf.h b/usr/src/uts/intel/sys/bootconf.h
index 0cde010b88..d500d3aa4f 100644
--- a/usr/src/uts/intel/sys/bootconf.h
+++ b/usr/src/uts/intel/sys/bootconf.h
@@ -184,7 +184,6 @@ extern struct bootobj swapfile;
extern char obp_bootpath[BO_MAXOBJNAME];
extern char svm_bootpath[BO_MAXOBJNAME];
-extern char zfs_bootpath[BO_MAXOBJNAME];
extern dev_t getrootdev(void);
extern void getfsname(char *, char *, size_t);
diff --git a/usr/src/uts/sparc/krtld/mapfile b/usr/src/uts/sparc/krtld/mapfile
index 708305072d..7bb78430c8 100644
--- a/usr/src/uts/sparc/krtld/mapfile
+++ b/usr/src/uts/sparc/krtld/mapfile
@@ -35,6 +35,7 @@
kobj_filbuf;
kobj_free;
kobj_fstat;
+ kobj_get_filesize;
kobj_getelfsym;
kobj_getmodinfo;
kobj_getpagesize;
diff --git a/usr/src/uts/sun/sys/bootconf.h b/usr/src/uts/sun/sys/bootconf.h
index 8d8c361139..2387d44d0d 100644
--- a/usr/src/uts/sun/sys/bootconf.h
+++ b/usr/src/uts/sun/sys/bootconf.h
@@ -218,7 +218,6 @@ extern struct bootobj swapfile;
extern char obp_bootpath[BO_MAXOBJNAME];
extern char svm_bootpath[BO_MAXOBJNAME];
-extern char zfs_bootpath[BO_MAXOBJNAME];
extern dev_t getrootdev(void);
extern void getfsname(char *, char *, size_t);