fsys_zfs.c revision 2acef22db7808606888f8f92715629ff3ba555b9
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * GRUB -- GRand Unified Bootloader
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * This program is free software; you can redistribute it and/or modify
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * it under the terms of the GNU General Public License as published by
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * the Free Software Foundation; either version 2 of the License, or
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * (at your option) any later version.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * This program is distributed in the hope that it will be useful,
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * but WITHOUT ANY WARRANTY; without even the implied warranty of
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * GNU General Public License for more details.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * You should have received a copy of the GNU General Public License
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * along with this program; if not, write to the Free Software
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Use is subject to license terms.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Copyright (c) 2013 by Delphix. All rights reserved.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * The zfs plug-in routines for GRUB are:
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * zfs_mount() - locates a valid uberblock of the root pool and reads
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * in its MOS at the memory address MOS.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * zfs_open() - locates a plain file object by following the MOS
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * and places its dnode at the memory address DNODE.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * zfs_read() - read in the data blocks pointed by the DNODE.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * ZFS_SCRATCH is used as a working area.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * (memory addr) MOS DNODE ZFS_SCRATCH
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * +-------V---------V----------V---------------+
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * memory | | dnode | dnode | scratch |
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * | | 512B | 512B | area |
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * +--------------------------------------------+
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/* cache for a file block of the currently zfs_open()-ed file */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/* cache for a dnode block */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedydecomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] =
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy {"inherit", 0}, /* ZIO_COMPRESS_INHERIT */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy {"on", lzjb_decompress}, /* ZIO_COMPRESS_ON */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy {"lzjb", lzjb_decompress}, /* ZIO_COMPRESS_LZJB */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy {"lz4", lz4_decompress} /* ZIO_COMPRESS_LZ4 */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic int zio_read_data(blkptr_t *bp, void *buf, char *stack);
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy * Our own version of bcmp().
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedyzfs_bcmp(const void *s1, const void *s2, size_t n)
1d32ba663e202c24a5a1f2e5aef83fffb447cb7fJohn Wren Kennedy } while (--n != 0);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Our own version of log2(). Same thing as highbit()-1.
if (byteswap)
static uint64_t
static uberblock_t *
return (ubbest);
for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
int i, psize;
for (i = 0; i < SPA_DVAS_PER_BP; i++) {
char *retbuf;
return (ERR_FSYS_CORRUPT);
return (ERR_WONT_FIT);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
lsize) != 0) {
return (ERR_FSYS_CORRUPT);
if (level == 0)
return (errnum);
int i, chunks;
for (i = 0; i < chunks; i++) {
return (ERR_FSYS_CORRUPT);
static uint64_t
uint8_t c;
return (crc);
int bseen = 0;
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
zap_leaf_phys_t *l;
return (ERR_FSYS_CORRUPT);
if (errnum)
return (errnum);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (errnum);
char *stack)
int size;
void *zapbuf;
return (errnum);
return (ERR_FSYS_CORRUPT);
typedef struct zap_attribute {
int za_integer_length;
char *za_name;
return (errnum);
int err;
if (err != 0)
return (err);
char *stack)
return (errnum);
char *tptr;
return (ERR_NEWER_VERSION);
char *stack)
return (errnum);
return (errnum);
return (errnum);
return (errnum);
path++;
path++;
return (errnum);
return (errnum);
path++;
return (errnum);
return (ERR_FILESYSTEM_NOT_FOUND);
return (errnum);
return (ERR_FILESYSTEM_NOT_FOUND);
if (!objnum)
return (ERR_FILESYSTEM_NOT_FOUND);
* When this list is updated the version number in usr/src/grub/capability
static const char *spa_feature_names[] = {
return (errnum);
stack)) != 0)
return (errnum);
return (errnum);
int issnapshot = 0;
char *snapname;
goto skip;
return (errnum);
stack))
return (errnum);
return (errnum);
headobj =
goto skip;
fsname++;
fsname++;
fsname++;
*fsname = 0;
snapname++;
*snapname = 0;
childobj =
return (errnum);
return (ERR_FILESYSTEM_NOT_FOUND);
return (errnum);
if (issnapshot)
if (obj)
skip:
return (errnum);
if (issnapshot) {
return (errnum);
return (ERR_FILESYSTEM_NOT_FOUND);
return (errnum);
if (obj)
return (errnum);
int i, encode_size;
for (i = 0; i < index; i++) {
return (nvlist);
int encode_size;
return (NULL);
return (NULL);
return (nvpair);
int len;
return (type);
int nelm;
switch (valtype) {
case DATA_TYPE_BOOLEAN:
case DATA_TYPE_STRING:
case DATA_TYPE_UINT64:
case DATA_TYPE_NVLIST:
case DATA_TYPE_NVLIST_ARRAY:
if (nelmp)
int *nelmp)
char *nvpair;
return (ERR_DEV_VALUES);
int is_spare)
NULL))
return (ERR_FSYS_CORRUPT);
return (ERR_NO_BOOTPATH);
return (ERR_NO_BOOTPATH);
return (ERR_NO_BOOTPATH);
if (is_spare) {
if (!spare)
return (ERR_NO_BOOTPATH);
return (ERR_WONT_FIT);
int nelm, i;
char *child;
return (ERR_FSYS_CORRUPT);
for (i = 0; i < nelm; i++) {
char *child_i;
return (ERR_NO_BOOTPATH);
return (ERR_READ);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_FILESYSTEM_NOT_FOUND);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
if (txg == 0)
return (ERR_NO_BOOTPATH);
return (ERR_FSYS_CORRUPT);
return (ERR_NEWER_VERSION);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_FSYS_CORRUPT);
return (ERR_NO_BOOTPATH);
return (ERR_FSYS_CORRUPT);
char *nvp;
return (ERR_FSYS_CORRUPT);
return (ERR_NEWER_VERSION);
zfs_mount(void)
int label = 0;
pool_guid = 0;
if (pool_guid == 0)
char *stack;
current_bootfs_obj = 0;
int hdrsize;
void *buf;
errnum = 0;
filepos = 0;
char *stack;
return (len);
while (length) {
movesize);
return (len);