1 /*
   2  *  GRUB  --  GRand Unified Bootloader
   3  *  Copyright (C) 1999,2000,2001,2002,2003,2004,2009  Free Software Foundation, Inc.
   4  *
   5  *  GRUB is free software; you can redistribute it and/or modify
   6  *  it under the terms of the GNU General Public License as published by
   7  *  the Free Software Foundation; either version 3 of the License, or
   8  *  (at your option) any later version.
   9  *
  10  *  GRUB is distributed in the hope that it will be useful,
  11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  *  GNU General Public License for more details.
  14  *
  15  *  You should have received a copy of the GNU General Public License
  16  *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  17  */
  18  /*
  19   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  20   */
  21 
  22 #ifndef GRUB_ZFS_HEADER
  23 #define GRUB_ZFS_HEADER 1
  24 
  25 #include <grub/err.h>
  26 #include <grub/disk.h>
  27 #include <grub/crypto.h>
  28 
  29 typedef enum grub_zfs_endian
  30   {
  31     GRUB_ZFS_UNKNOWN_ENDIAN = -2,
  32     GRUB_ZFS_LITTLE_ENDIAN = -1,
  33     GRUB_ZFS_BIG_ENDIAN = 0
  34   } grub_zfs_endian_t;
  35 
  36 /*
  37  * On-disk version number.
  38  */
  39 #define SPA_VERSION                     33ULL
  40 
  41 /*
  42  * The following are configuration names used in the nvlist describing a pool's
  43  * configuration.
  44  */
  45 #define ZPOOL_CONFIG_VERSION            "version"
  46 #define ZPOOL_CONFIG_POOL_NAME          "name"
  47 #define ZPOOL_CONFIG_POOL_STATE         "state"
  48 #define ZPOOL_CONFIG_POOL_TXG           "txg"
  49 #define ZPOOL_CONFIG_POOL_GUID          "pool_guid"
  50 #define ZPOOL_CONFIG_CREATE_TXG         "create_txg"
  51 #define ZPOOL_CONFIG_TOP_GUID           "top_guid"
  52 #define ZPOOL_CONFIG_VDEV_TREE          "vdev_tree"
  53 #define ZPOOL_CONFIG_TYPE               "type"
  54 #define ZPOOL_CONFIG_CHILDREN           "children"
  55 #define ZPOOL_CONFIG_ID                 "id"
  56 #define ZPOOL_CONFIG_GUID               "guid"
  57 #define ZPOOL_CONFIG_PATH               "path"
  58 #define ZPOOL_CONFIG_DEVID              "devid"
  59 #define ZPOOL_CONFIG_METASLAB_ARRAY     "metaslab_array"
  60 #define ZPOOL_CONFIG_METASLAB_SHIFT     "metaslab_shift"
  61 #define ZPOOL_CONFIG_ASHIFT             "ashift"
  62 #define ZPOOL_CONFIG_ASIZE              "asize"
  63 #define ZPOOL_CONFIG_DTL                "DTL"
  64 #define ZPOOL_CONFIG_STATS              "stats"
  65 #define ZPOOL_CONFIG_WHOLE_DISK         "whole_disk"
  66 #define ZPOOL_CONFIG_ERRCOUNT           "error_count"
  67 #define ZPOOL_CONFIG_NOT_PRESENT        "not_present"
  68 #define ZPOOL_CONFIG_SPARES             "spares"
  69 #define ZPOOL_CONFIG_IS_SPARE           "is_spare"
  70 #define ZPOOL_CONFIG_NPARITY            "nparity"
  71 #define ZPOOL_CONFIG_PHYS_PATH          "phys_path"
  72 #define ZPOOL_CONFIG_L2CACHE            "l2cache"
  73 #define ZPOOL_CONFIG_HOLE_ARRAY         "hole_array"
  74 #define ZPOOL_CONFIG_VDEV_CHILDREN      "vdev_children"
  75 #define ZPOOL_CONFIG_IS_HOLE            "is_hole"
  76 #define ZPOOL_CONFIG_DDT_HISTOGRAM      "ddt_histogram"
  77 #define ZPOOL_CONFIG_DDT_OBJ_STATS      "ddt_object_stats"
  78 #define ZPOOL_CONFIG_DDT_STATS          "ddt_stats"
  79 /*
  80  * The persistent vdev state is stored as separate values rather than a single
  81  * 'vdev_state' entry.  This is because a device can be in multiple states, such
  82  * as offline and degraded.
  83  */
  84 #define ZPOOL_CONFIG_OFFLINE            "offline"
  85 #define ZPOOL_CONFIG_FAULTED            "faulted"
  86 #define ZPOOL_CONFIG_DEGRADED           "degraded"
  87 #define ZPOOL_CONFIG_REMOVED            "removed"
  88 
  89 #define VDEV_TYPE_ROOT                  "root"
  90 #define VDEV_TYPE_MIRROR                "mirror"
  91 #define VDEV_TYPE_REPLACING             "replacing"
  92 #define VDEV_TYPE_RAIDZ                 "raidz"
  93 #define VDEV_TYPE_DISK                  "disk"
  94 #define VDEV_TYPE_FILE                  "file"
  95 #define VDEV_TYPE_MISSING               "missing"
  96 #define VDEV_TYPE_HOLE                  "hole"
  97 #define VDEV_TYPE_SPARE                 "spare"
  98 #define VDEV_TYPE_L2CACHE               "l2cache"
  99 
 100 /*
 101  * pool state.  The following states are written to disk as part of the normal
 102  * SPA lifecycle: ACTIVE, EXPORTED, DESTROYED, SPARE, L2CACHE.  The remaining
 103  * states are software abstractions used at various levels to communicate pool
 104  * state.
 105  */
 106 typedef enum pool_state {
 107         POOL_STATE_ACTIVE = 0,          /* In active use                */
 108         POOL_STATE_EXPORTED,            /* Explicitly exported          */
 109         POOL_STATE_DESTROYED,           /* Explicitly destroyed         */
 110         POOL_STATE_SPARE,               /* Reserved for hot spare use   */
 111         POOL_STATE_L2CACHE,             /* Level 2 ARC device           */
 112         POOL_STATE_UNINITIALIZED,       /* Internal spa_t state         */
 113         POOL_STATE_UNAVAIL,             /* Internal libzfs state        */
 114         POOL_STATE_POTENTIALLY_ACTIVE   /* Internal libzfs state        */
 115 } pool_state_t;
 116 
 117 struct grub_zfs_data;
 118 
 119 grub_err_t grub_zfs_fetch_nvlist (grub_device_t dev, char **nvlist);
 120 grub_err_t grub_zfs_getmdnobj (grub_device_t dev, const char *fsfilename,
 121                                grub_uint64_t *mdnobj);
 122 
 123 char *grub_zfs_nvlist_lookup_string (const char *nvlist, const char *name);
 124 char *grub_zfs_nvlist_lookup_nvlist (const char *nvlist, const char *name);
 125 int grub_zfs_nvlist_lookup_uint64 (const char *nvlist, const char *name,
 126                                    grub_uint64_t *out);
 127 char *grub_zfs_nvlist_lookup_nvlist_array (const char *nvlist,
 128                                            const char *name,
 129                                            grub_size_t index);
 130 int grub_zfs_nvlist_lookup_nvlist_array_get_nelm (const char *nvlist,
 131                                                   const char *name);
 132 grub_err_t
 133 grub_zfs_add_key (grub_uint8_t *key_in,
 134                   grub_size_t keylen,
 135                   int passphrase);
 136 
 137 extern grub_err_t (*grub_zfs_decrypt) (grub_crypto_cipher_handle_t cipher,
 138                                        grub_uint64_t algo,
 139                                        void *nonce,
 140                                        char *buf, grub_size_t size,
 141                                        const grub_uint32_t *expected_mac,
 142                                        grub_zfs_endian_t endian);
 143 
 144 struct grub_zfs_key;
 145 
 146 extern grub_crypto_cipher_handle_t (*grub_zfs_load_key) (const struct grub_zfs_key *key,
 147                                                          grub_size_t keysize,
 148                                                          grub_uint64_t salt,
 149                                                          grub_uint64_t algo);
 150 
 151 
 152 
 153 #endif  /* ! GRUB_ZFS_HEADER */