FreeBSD ZFS
The Zettabyte File System

sys/spa.h

Go to the documentation of this file.
00001 /*
00002  * CDDL HEADER START
00003  *
00004  * The contents of this file are subject to the terms of the
00005  * Common Development and Distribution License (the "License").
00006  * You may not use this file except in compliance with the License.
00007  *
00008  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
00009  * or http://www.opensolaris.org/os/licensing.
00010  * See the License for the specific language governing permissions
00011  * and limitations under the License.
00012  *
00013  * When distributing Covered Code, include this CDDL HEADER in each
00014  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
00015  * If applicable, add the following below this CDDL HEADER, with the
00016  * fields enclosed by brackets "[]" replaced with your own identifying
00017  * information: Portions Copyright [yyyy] [name of copyright owner]
00018  *
00019  * CDDL HEADER END
00020  */
00021 /*
00022  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
00023  * Copyright (c) 2012 by Delphix. All rights reserved.
00024  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
00025  */
00026 
00027 #ifndef _SYS_SPA_H
00028 #define _SYS_SPA_H
00029 
00030 #include <sys/avl.h>
00031 #include <sys/zfs_context.h>
00032 #include <sys/nvpair.h>
00033 #include <sys/sysmacros.h>
00034 #include <sys/types.h>
00035 #include <sys/fs/zfs.h>
00036 
00037 #ifdef  __cplusplus
00038 extern "C" {
00039 #endif
00040 
00041 /*
00042  * Forward references that lots of things need.
00043  */
00044 typedef struct spa spa_t;
00045 typedef struct vdev vdev_t;
00046 typedef struct metaslab metaslab_t;
00047 typedef struct metaslab_group metaslab_group_t;
00048 typedef struct metaslab_class metaslab_class_t;
00049 typedef struct zio zio_t;
00050 typedef struct zilog zilog_t;
00051 typedef struct spa_aux_vdev spa_aux_vdev_t;
00052 typedef struct ddt ddt_t;
00053 typedef struct ddt_entry ddt_entry_t;
00054 struct dsl_pool;
00055 
00060 #define BF32_DECODE(x, low, len)        P2PHASE((x) >> (low), 1U << (len))
00061 #define BF64_DECODE(x, low, len)        P2PHASE((x) >> (low), 1ULL << (len))
00062 #define BF32_ENCODE(x, low, len)        (P2PHASE((x), 1U << (len)) << (low))
00063 #define BF64_ENCODE(x, low, len)        (P2PHASE((x), 1ULL << (len)) << (low))
00064 
00065 #define BF32_GET(x, low, len)           BF32_DECODE(x, low, len)
00066 #define BF64_GET(x, low, len)           BF64_DECODE(x, low, len)
00067 
00068 #define BF32_SET(x, low, len, val)      \
00069         ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
00070 #define BF64_SET(x, low, len, val)      \
00071         ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
00072 
00073 #define BF32_GET_SB(x, low, len, shift, bias)   \
00074         ((BF32_GET(x, low, len) + (bias)) << (shift))
00075 #define BF64_GET_SB(x, low, len, shift, bias)   \
00076         ((BF64_GET(x, low, len) + (bias)) << (shift))
00077 
00078 #define BF32_SET_SB(x, low, len, shift, bias, val)      \
00079         BF32_SET(x, low, len, ((val) >> (shift)) - (bias))
00080 #define BF64_SET_SB(x, low, len, shift, bias, val)      \
00081         BF64_SET(x, low, len, ((val) >> (shift)) - (bias))
00082 
00084 #define SPA_MINBLOCKSHIFT       9
00085 #define SPA_MAXBLOCKSHIFT       17
00086 #define SPA_MINBLOCKSIZE        (1ULL << SPA_MINBLOCKSHIFT)
00087 #define SPA_MAXBLOCKSIZE        (1ULL << SPA_MAXBLOCKSHIFT)
00088 
00094 #define SPA_BLOCKSIZES          (SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)
00095 
00099 #define SPA_CONFIG_BLOCKSIZE    (1ULL << 14)
00100 
00101 #define SPA_LSIZEBITS           16      /* LSIZE up to 32M (2^16 * 512) */
00102 #define SPA_PSIZEBITS           16      /* PSIZE up to 32M (2^16 * 512) */
00103 
00110 #define SPA_ASIZEBITS           24      /* ASIZE up to 64 times larger  */
00111 
00116 typedef struct dva {
00117         uint64_t        dva_word[2];
00118 } dva_t;
00119 
00123 typedef struct zio_cksum {
00124         uint64_t        zc_word[4];
00125 } zio_cksum_t;
00126 
00127 #define SPA_BLKPTRSHIFT 7               
00128 #define SPA_DVAS_PER_BP 3               
00190 typedef struct blkptr {
00191         dva_t           blk_dva[SPA_DVAS_PER_BP]; 
00192         uint64_t        blk_prop;       
00193         uint64_t        blk_pad[2];     
00194         uint64_t        blk_phys_birth; 
00195         uint64_t        blk_birth;      
00196         uint64_t        blk_fill;       
00197         zio_cksum_t     blk_cksum;      
00198 } blkptr_t;
00199 
00204 #define DVA_GET_ASIZE(dva)      \
00205         BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0)
00206 #define DVA_SET_ASIZE(dva, x)   \
00207         BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x)
00208 
00209 #define DVA_GET_GRID(dva)       BF64_GET((dva)->dva_word[0], 24, 8)
00210 #define DVA_SET_GRID(dva, x)    BF64_SET((dva)->dva_word[0], 24, 8, x)
00211 
00212 #define DVA_GET_VDEV(dva)       BF64_GET((dva)->dva_word[0], 32, 32)
00213 #define DVA_SET_VDEV(dva, x)    BF64_SET((dva)->dva_word[0], 32, 32, x)
00214 
00215 #define DVA_GET_OFFSET(dva)     \
00216         BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
00217 #define DVA_SET_OFFSET(dva, x)  \
00218         BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x)
00219 
00220 #define DVA_GET_GANG(dva)       BF64_GET((dva)->dva_word[1], 63, 1)
00221 #define DVA_SET_GANG(dva, x)    BF64_SET((dva)->dva_word[1], 63, 1, x)
00222 
00223 #define BP_GET_LSIZE(bp)        \
00224         BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1)
00225 #define BP_SET_LSIZE(bp, x)     \
00226         BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
00227 
00228 #define BP_GET_PSIZE(bp)        \
00229         BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1)
00230 #define BP_SET_PSIZE(bp, x)     \
00231         BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
00232 
00233 #define BP_GET_COMPRESS(bp)             BF64_GET((bp)->blk_prop, 32, 8)
00234 #define BP_SET_COMPRESS(bp, x)          BF64_SET((bp)->blk_prop, 32, 8, x)
00235 
00236 #define BP_GET_CHECKSUM(bp)             BF64_GET((bp)->blk_prop, 40, 8)
00237 #define BP_SET_CHECKSUM(bp, x)          BF64_SET((bp)->blk_prop, 40, 8, x)
00238 
00239 #define BP_GET_TYPE(bp)                 BF64_GET((bp)->blk_prop, 48, 8)
00240 #define BP_SET_TYPE(bp, x)              BF64_SET((bp)->blk_prop, 48, 8, x)
00241 
00242 #define BP_GET_LEVEL(bp)                BF64_GET((bp)->blk_prop, 56, 5)
00243 #define BP_SET_LEVEL(bp, x)             BF64_SET((bp)->blk_prop, 56, 5, x)
00244 
00245 #define BP_GET_PROP_BIT_61(bp)          BF64_GET((bp)->blk_prop, 61, 1)
00246 #define BP_SET_PROP_BIT_61(bp, x)       BF64_SET((bp)->blk_prop, 61, 1, x)
00247 
00248 #define BP_GET_DEDUP(bp)                BF64_GET((bp)->blk_prop, 62, 1)
00249 #define BP_SET_DEDUP(bp, x)             BF64_SET((bp)->blk_prop, 62, 1, x)
00250 
00251 #define BP_GET_BYTEORDER(bp)            (0 - BF64_GET((bp)->blk_prop, 63, 1))
00252 #define BP_SET_BYTEORDER(bp, x)         BF64_SET((bp)->blk_prop, 63, 1, x)
00253 
00254 #define BP_PHYSICAL_BIRTH(bp)           \
00255         ((bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth)
00256 
00257 #define BP_SET_BIRTH(bp, logical, physical)     \
00258 {                                               \
00259         (bp)->blk_birth = (logical);            \
00260         (bp)->blk_phys_birth = ((logical) == (physical) ? 0 : (physical)); \
00261 }
00262 
00263 #define BP_GET_ASIZE(bp)        \
00264         (DVA_GET_ASIZE(&(bp)->blk_dva[0]) + DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
00265                 DVA_GET_ASIZE(&(bp)->blk_dva[2]))
00266 
00267 #define BP_GET_UCSIZE(bp) \
00268         ((BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp))) ? \
00269         BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp))
00270 
00271 #define BP_GET_NDVAS(bp)        \
00272         (!!DVA_GET_ASIZE(&(bp)->blk_dva[0]) + \
00273         !!DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
00274         !!DVA_GET_ASIZE(&(bp)->blk_dva[2]))
00275 
00276 #define BP_COUNT_GANG(bp)       \
00277         (DVA_GET_GANG(&(bp)->blk_dva[0]) + \
00278         DVA_GET_GANG(&(bp)->blk_dva[1]) + \
00279         DVA_GET_GANG(&(bp)->blk_dva[2]))
00280 
00281 #define DVA_EQUAL(dva1, dva2)   \
00282         ((dva1)->dva_word[1] == (dva2)->dva_word[1] && \
00283         (dva1)->dva_word[0] == (dva2)->dva_word[0])
00284 
00285 #define BP_EQUAL(bp1, bp2)      \
00286         (BP_PHYSICAL_BIRTH(bp1) == BP_PHYSICAL_BIRTH(bp2) &&    \
00287         DVA_EQUAL(&(bp1)->blk_dva[0], &(bp2)->blk_dva[0]) &&    \
00288         DVA_EQUAL(&(bp1)->blk_dva[1], &(bp2)->blk_dva[1]) &&    \
00289         DVA_EQUAL(&(bp1)->blk_dva[2], &(bp2)->blk_dva[2]))
00290 
00291 #define ZIO_CHECKSUM_EQUAL(zc1, zc2) \
00292         (0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
00293         ((zc1).zc_word[1] - (zc2).zc_word[1]) | \
00294         ((zc1).zc_word[2] - (zc2).zc_word[2]) | \
00295         ((zc1).zc_word[3] - (zc2).zc_word[3])))
00296 
00297 #define DVA_IS_VALID(dva)       (DVA_GET_ASIZE(dva) != 0)
00298 
00299 #define ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3)   \
00300 {                                               \
00301         (zcp)->zc_word[0] = w0;                 \
00302         (zcp)->zc_word[1] = w1;                 \
00303         (zcp)->zc_word[2] = w2;                 \
00304         (zcp)->zc_word[3] = w3;                 \
00305 }
00306 
00307 #define BP_IDENTITY(bp)         (&(bp)->blk_dva[0])
00308 #define BP_IS_GANG(bp)          DVA_GET_GANG(BP_IDENTITY(bp))
00309 #define BP_IS_HOLE(bp)          ((bp)->blk_birth == 0)
00310 
00313 #define BP_IS_RAIDZ(bp)         (DVA_GET_ASIZE(&(bp)->blk_dva[0]) > \
00314                                 BP_GET_PSIZE(bp))
00315 
00316 #define BP_ZERO(bp)                             \
00317 {                                               \
00318         (bp)->blk_dva[0].dva_word[0] = 0;       \
00319         (bp)->blk_dva[0].dva_word[1] = 0;       \
00320         (bp)->blk_dva[1].dva_word[0] = 0;       \
00321         (bp)->blk_dva[1].dva_word[1] = 0;       \
00322         (bp)->blk_dva[2].dva_word[0] = 0;       \
00323         (bp)->blk_dva[2].dva_word[1] = 0;       \
00324         (bp)->blk_prop = 0;                     \
00325         (bp)->blk_pad[0] = 0;                   \
00326         (bp)->blk_pad[1] = 0;                   \
00327         (bp)->blk_phys_birth = 0;               \
00328         (bp)->blk_birth = 0;                    \
00329         (bp)->blk_fill = 0;                     \
00330         ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \
00331 }
00332 
00337 #if BYTE_ORDER == _BIG_ENDIAN
00338 #define ZFS_HOST_BYTEORDER      (0ULL)
00339 #else
00340 #define ZFS_HOST_BYTEORDER      (-1ULL)
00341 #endif
00342 
00343 #define BP_SHOULD_BYTESWAP(bp)  (BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER)
00344 
00345 #define BP_SPRINTF_LEN  320
00346 
00352 #define SPRINTF_BLKPTR(func, ws, buf, bp, type, checksum, compress)     \
00353 {                                                                       \
00354         static const char *copyname[] =                                 \
00355             { "zero", "single", "double", "triple" };                   \
00356         int size = BP_SPRINTF_LEN;                                      \
00357         int len = 0;                                                    \
00358         int copies = 0;                                                 \
00359                                                                         \
00360         if (bp == NULL) {                                               \
00361                 len = func(buf + len, size - len, "<NULL>");            \
00362         } else if (BP_IS_HOLE(bp)) {                                    \
00363                 len = func(buf + len, size - len, "<hole>");            \
00364         } else {                                                        \
00365                 for (int d = 0; d < BP_GET_NDVAS(bp); d++) {            \
00366                         const dva_t *dva = &bp->blk_dva[d];             \
00367                         if (DVA_IS_VALID(dva))                          \
00368                                 copies++;                               \
00369                         len += func(buf + len, size - len,              \
00370                             "DVA[%d]=<%llu:%llx:%llx>%c", d,            \
00371                             (u_longlong_t)DVA_GET_VDEV(dva),            \
00372                             (u_longlong_t)DVA_GET_OFFSET(dva),          \
00373                             (u_longlong_t)DVA_GET_ASIZE(dva),           \
00374                             ws);                                        \
00375                 }                                                       \
00376                 if (BP_IS_GANG(bp) &&                                   \
00377                     DVA_GET_ASIZE(&bp->blk_dva[2]) <=                   \
00378                     DVA_GET_ASIZE(&bp->blk_dva[1]) / 2)                 \
00379                         copies--;                                       \
00380                 len += func(buf + len, size - len,                      \
00381                     "[L%llu %s] %s %s %s %s %s %s%c"                    \
00382                     "size=%llxL/%llxP birth=%lluL/%lluP fill=%llu%c"    \
00383                     "cksum=%llx:%llx:%llx:%llx",                        \
00384                     (u_longlong_t)BP_GET_LEVEL(bp),                     \
00385                     type,                                               \
00386                     checksum,                                           \
00387                     compress,                                           \
00388                     BP_GET_BYTEORDER(bp) == 0 ? "BE" : "LE",            \
00389                     BP_IS_GANG(bp) ? "gang" : "contiguous",             \
00390                     BP_GET_DEDUP(bp) ? "dedup" : "unique",              \
00391                     copyname[copies],                                   \
00392                     ws,                                                 \
00393                     (u_longlong_t)BP_GET_LSIZE(bp),                     \
00394                     (u_longlong_t)BP_GET_PSIZE(bp),                     \
00395                     (u_longlong_t)bp->blk_birth,                        \
00396                     (u_longlong_t)BP_PHYSICAL_BIRTH(bp),                \
00397                     (u_longlong_t)bp->blk_fill,                         \
00398                     ws,                                                 \
00399                     (u_longlong_t)bp->blk_cksum.zc_word[0],             \
00400                     (u_longlong_t)bp->blk_cksum.zc_word[1],             \
00401                     (u_longlong_t)bp->blk_cksum.zc_word[2],             \
00402                     (u_longlong_t)bp->blk_cksum.zc_word[3]);            \
00403         }                                                               \
00404         ASSERT(len < size);                                             \
00405 }
00406 
00407 #include <sys/dmu.h>
00408 
00409 #define BP_GET_BUFC_TYPE(bp)                                            \
00410         (((BP_GET_LEVEL(bp) > 0) || (DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))) ? \
00411         ARC_BUFC_METADATA : ARC_BUFC_DATA)
00412 
00413 typedef enum spa_import_type {
00414         SPA_IMPORT_EXISTING,
00415         SPA_IMPORT_ASSEMBLE
00416 } spa_import_type_t;
00417 
00418 /* state manipulation functions */
00419 extern int spa_open(const char *pool, spa_t **, void *tag);
00420 extern int spa_open_rewind(const char *pool, spa_t **, void *tag,
00421     nvlist_t *policy, nvlist_t **config);
00422 extern int spa_get_stats(const char *pool, nvlist_t **config, char *altroot,
00423     size_t buflen);
00424 extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
00425     const char *history_str, nvlist_t *zplprops);
00426 #if defined(sun)
00427 extern int spa_import_rootpool(char *devpath, char *devid);
00428 #else
00429 extern int spa_import_rootpool(const char *name);
00430 #endif
00431 extern int spa_import(const char *pool, nvlist_t *config, nvlist_t *props,
00432     uint64_t flags);
00433 extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
00434 extern int spa_destroy(char *pool);
00435 extern int spa_export(char *pool, nvlist_t **oldconfig, boolean_t force,
00436     boolean_t hardforce);
00437 extern int spa_reset(char *pool);
00438 extern void spa_async_request(spa_t *spa, int flag);
00439 extern void spa_async_unrequest(spa_t *spa, int flag);
00440 extern void spa_async_suspend(spa_t *spa);
00441 extern void spa_async_resume(spa_t *spa);
00442 extern spa_t *spa_inject_addref(char *pool);
00443 extern void spa_inject_delref(spa_t *spa);
00444 extern void spa_scan_stat_init(spa_t *spa);
00445 extern int spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps);
00446 
00447 #define SPA_ASYNC_CONFIG_UPDATE 0x01
00448 #define SPA_ASYNC_REMOVE        0x02
00449 #define SPA_ASYNC_PROBE         0x04
00450 #define SPA_ASYNC_RESILVER_DONE 0x08
00451 #define SPA_ASYNC_RESILVER      0x10
00452 #define SPA_ASYNC_AUTOEXPAND    0x20
00453 #define SPA_ASYNC_REMOVE_DONE   0x40
00454 #define SPA_ASYNC_REMOVE_STOP   0x80
00455 
00460 #define SPA_REMOVE_UNSPARE      0x01
00461 #define SPA_REMOVE_DONE         0x02
00462 
00464 /* device manipulation */
00465 extern int spa_vdev_add(spa_t *spa, nvlist_t *nvroot);
00466 extern int spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot,
00467     int replacing);
00468 extern int spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid,
00469     int replace_done);
00470 extern int spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare);
00471 extern boolean_t spa_vdev_remove_active(spa_t *spa);
00472 extern int spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath);
00473 extern int spa_vdev_setfru(spa_t *spa, uint64_t guid, const char *newfru);
00474 extern int spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config,
00475     nvlist_t *props, boolean_t exp);
00476 
00477 /* spare state (which is global across all pools) */
00478 extern void spa_spare_add(vdev_t *vd);
00479 extern void spa_spare_remove(vdev_t *vd);
00480 extern boolean_t spa_spare_exists(uint64_t guid, uint64_t *pool, int *refcnt);
00481 extern void spa_spare_activate(vdev_t *vd);
00482 
00483 /* L2ARC state (which is global across all pools) */
00484 extern void spa_l2cache_add(vdev_t *vd);
00485 extern void spa_l2cache_remove(vdev_t *vd);
00486 extern boolean_t spa_l2cache_exists(uint64_t guid, uint64_t *pool);
00487 extern void spa_l2cache_activate(vdev_t *vd);
00488 extern void spa_l2cache_drop(spa_t *spa);
00489 
00490 /* scanning */
00491 extern int spa_scan(spa_t *spa, pool_scan_func_t func);
00492 extern int spa_scan_stop(spa_t *spa);
00493 
00494 /* spa syncing */
00495 extern void spa_sync(spa_t *spa, uint64_t txg);
00496 extern void spa_sync_allpools(void);
00497 
00504 #define SYNC_PASS_DEFERRED_FREE 2
00505 #define SYNC_PASS_DONT_COMPRESS 4       
00506 #define SYNC_PASS_REWRITE       1       
00509 extern kmutex_t spa_namespace_lock;
00510 
00511 /*
00512  * SPA configuration functions in spa_config.c
00513  */
00514 
00515 #define SPA_CONFIG_UPDATE_POOL  0
00516 #define SPA_CONFIG_UPDATE_VDEVS 1
00517 
00518 extern void spa_config_sync(spa_t *, boolean_t, boolean_t);
00519 extern void spa_config_load(void);
00520 extern nvlist_t *spa_all_configs(uint64_t *);
00521 extern void spa_config_set(spa_t *spa, nvlist_t *config);
00522 extern nvlist_t *spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg,
00523     int getstats);
00524 extern void spa_config_update(spa_t *spa, int what);
00525 
00526 /*
00527  * Miscellaneous SPA routines in spa_misc.c
00528  */
00529 
00530 /* Namespace manipulation */
00531 extern spa_t *spa_lookup(const char *name);
00532 extern spa_t *spa_add(const char *name, nvlist_t *config, const char *altroot);
00533 extern void spa_remove(spa_t *spa);
00534 extern spa_t *spa_next(spa_t *prev);
00535 
00536 /* Refcount functions */
00537 extern void spa_open_ref(spa_t *spa, void *tag);
00538 extern void spa_close(spa_t *spa, void *tag);
00539 extern boolean_t spa_refcount_zero(spa_t *spa);
00540 
00541 #define SCL_NONE        0x00
00542 #define SCL_CONFIG      0x01
00543 #define SCL_STATE       0x02
00544 #define SCL_L2ARC       0x04            
00545 #define SCL_ALLOC       0x08
00546 #define SCL_ZIO         0x10
00547 #define SCL_FREE        0x20
00548 #define SCL_VDEV        0x40
00549 #define SCL_LOCKS       7
00550 #define SCL_ALL         ((1 << SCL_LOCKS) - 1)
00551 #define SCL_STATE_ALL   (SCL_STATE | SCL_L2ARC | SCL_ZIO)
00552 
00553 /* Pool configuration locks */
00554 extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
00555 extern void spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw);
00556 extern void spa_config_exit(spa_t *spa, int locks, void *tag);
00557 extern int spa_config_held(spa_t *spa, int locks, krw_t rw);
00558 
00559 /* Pool vdev add/remove lock */
00560 extern uint64_t spa_vdev_enter(spa_t *spa);
00561 extern uint64_t spa_vdev_config_enter(spa_t *spa);
00562 extern void spa_vdev_config_exit(spa_t *spa, vdev_t *vd, uint64_t txg,
00563     int error, char *tag);
00564 extern int spa_vdev_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error);
00565 
00566 /* Pool vdev state change lock */
00567 extern void spa_vdev_state_enter(spa_t *spa, int oplock);
00568 extern int spa_vdev_state_exit(spa_t *spa, vdev_t *vd, int error);
00569 
00571 typedef enum spa_log_state {
00572         SPA_LOG_UNKNOWN = 0,    
00573         SPA_LOG_MISSING,        
00574         SPA_LOG_CLEAR,          
00575         SPA_LOG_GOOD,           
00576 } spa_log_state_t;
00577 
00578 extern spa_log_state_t spa_get_log_state(spa_t *spa);
00579 extern void spa_set_log_state(spa_t *spa, spa_log_state_t state);
00580 extern int spa_offline_log(spa_t *spa);
00581 
00582 extern void spa_claim_notify(zio_t *zio);
00583 
00584 /* Accessor functions */
00585 extern boolean_t spa_shutting_down(spa_t *spa);
00586 extern struct dsl_pool *spa_get_dsl(spa_t *spa);
00587 extern boolean_t spa_is_initializing(spa_t *spa);
00588 extern blkptr_t *spa_get_rootblkptr(spa_t *spa);
00589 extern void spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp);
00590 extern void spa_altroot(spa_t *, char *, size_t);
00591 extern int spa_sync_pass(spa_t *spa);
00592 extern char *spa_name(spa_t *spa);
00593 extern uint64_t spa_guid(spa_t *spa);
00594 extern uint64_t spa_load_guid(spa_t *spa);
00595 extern uint64_t spa_last_synced_txg(spa_t *spa);
00596 extern uint64_t spa_first_txg(spa_t *spa);
00597 extern uint64_t spa_syncing_txg(spa_t *spa);
00598 extern uint64_t spa_version(spa_t *spa);
00599 extern pool_state_t spa_state(spa_t *spa);
00600 extern spa_load_state_t spa_load_state(spa_t *spa);
00601 extern uint64_t spa_freeze_txg(spa_t *spa);
00602 extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
00603 extern uint64_t spa_get_dspace(spa_t *spa);
00604 extern void spa_update_dspace(spa_t *spa);
00605 extern uint64_t spa_version(spa_t *spa);
00606 extern boolean_t spa_deflate(spa_t *spa);
00607 extern metaslab_class_t *spa_normal_class(spa_t *spa);
00608 extern metaslab_class_t *spa_log_class(spa_t *spa);
00609 extern int spa_max_replication(spa_t *spa);
00610 extern int spa_prev_software_version(spa_t *spa);
00611 extern int spa_busy(void);
00612 extern uint8_t spa_get_failmode(spa_t *spa);
00613 extern boolean_t spa_suspended(spa_t *spa);
00614 extern uint64_t spa_bootfs(spa_t *spa);
00615 extern uint64_t spa_delegation(spa_t *spa);
00616 extern objset_t *spa_meta_objset(spa_t *spa);
00617 
00618 /* Miscellaneous support routines */
00619 extern void spa_activate_mos_feature(spa_t *spa, const char *feature);
00620 extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature);
00621 extern int spa_rename(const char *oldname, const char *newname);
00622 extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
00623 extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
00624 extern char *spa_strdup(const char *);
00625 extern void spa_strfree(char *);
00626 extern uint64_t spa_get_random(uint64_t range);
00627 extern uint64_t spa_generate_guid(spa_t *spa);
00628 extern void sprintf_blkptr(char *buf, const blkptr_t *bp);
00629 extern void spa_freeze(spa_t *spa);
00630 extern int spa_change_guid(spa_t *spa);
00631 extern void spa_upgrade(spa_t *spa, uint64_t version);
00632 extern void spa_evict_all(void);
00633 extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid,
00634     boolean_t l2cache);
00635 extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
00636 extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva);
00637 extern uint64_t bp_get_dsize_sync(spa_t *spa, const blkptr_t *bp);
00638 extern uint64_t bp_get_dsize(spa_t *spa, const blkptr_t *bp);
00639 extern boolean_t spa_has_slogs(spa_t *spa);
00640 extern boolean_t spa_is_root(spa_t *spa);
00641 extern boolean_t spa_writeable(spa_t *spa);
00642 
00643 extern int spa_mode(spa_t *spa);
00644 extern uint64_t zfs_strtonum(const char *str, char **nptr);
00645 #define strtonum(str, nptr)     zfs_strtonum((str), (nptr))
00646 
00648 typedef enum history_log_type {
00649         LOG_CMD_POOL_CREATE,
00650         LOG_CMD_NORMAL,
00651         LOG_INTERNAL
00652 } history_log_type_t;
00653 
00654 typedef struct history_arg {
00655         char *ha_history_str;
00656         history_log_type_t ha_log_type;
00657         history_internal_events_t ha_event;
00658         char *ha_zone;
00659         uid_t ha_uid;
00660 } history_arg_t;
00661 
00662 extern char *spa_his_ievent_table[];
00663 
00664 extern void spa_history_create_obj(spa_t *spa, dmu_tx_t *tx);
00665 extern int spa_history_get(spa_t *spa, uint64_t *offset, uint64_t *len_read,
00666     char *his_buf);
00667 extern int spa_history_log(spa_t *spa, const char *his_buf,
00668     history_log_type_t what);
00669 extern void spa_history_log_internal(history_internal_events_t event,
00670     spa_t *spa, dmu_tx_t *tx, const char *fmt, ...);
00671 extern void spa_history_log_version(spa_t *spa, history_internal_events_t evt);
00672 
00673 /* error handling */
00674 struct zbookmark;
00675 extern void spa_log_error(spa_t *spa, zio_t *zio);
00676 extern void zfs_ereport_post(const char *cls, spa_t *spa, vdev_t *vd,
00677     zio_t *zio, uint64_t stateoroffset, uint64_t length);
00678 extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
00679 extern void zfs_post_state_change(spa_t *spa, vdev_t *vd);
00680 extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
00681 extern uint64_t spa_get_errlog_size(spa_t *spa);
00682 extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
00683 extern void spa_errlog_rotate(spa_t *spa);
00684 extern void spa_errlog_drain(spa_t *spa);
00685 extern void spa_errlog_sync(spa_t *spa, uint64_t txg);
00686 extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
00687 
00688 /* vdev cache */
00689 extern void vdev_cache_stat_init(void);
00690 extern void vdev_cache_stat_fini(void);
00691 
00692 /* Initialization and termination */
00693 extern void spa_init(int flags);
00694 extern void spa_fini(void);
00695 extern void spa_boot_init();
00696 
00697 /* properties */
00698 extern int spa_prop_set(spa_t *spa, nvlist_t *nvp);
00699 extern int spa_prop_get(spa_t *spa, nvlist_t **nvp);
00700 extern void spa_prop_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx);
00701 extern void spa_configfile_set(spa_t *, nvlist_t *, boolean_t);
00702 
00703 /* asynchronous event notification */
00704 extern void spa_event_notify(spa_t *spa, vdev_t *vdev, const char *name);
00705 
00706 #ifdef ZFS_DEBUG
00707 #define dprintf_bp(bp, fmt, ...) do {                           \
00708         if (zfs_flags & ZFS_DEBUG_DPRINTF) {                    \
00709         char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP);  \
00710         sprintf_blkptr(__blkbuf, (bp));                         \
00711         dprintf(fmt " %s\n", __VA_ARGS__, __blkbuf);            \
00712         kmem_free(__blkbuf, BP_SPRINTF_LEN);                    \
00713         } \
00714 _NOTE(CONSTCOND) } while (0)
00715 #else
00716 #define dprintf_bp(bp, fmt, ...)
00717 #endif
00718 
00719 extern boolean_t spa_debug_enabled(spa_t *spa);
00720 #define spa_dbgmsg(spa, ...)                    \
00721 {                                               \
00722         if (spa_debug_enabled(spa))             \
00723                 zfs_dbgmsg(__VA_ARGS__);        \
00724 }
00725 
00727 extern int spa_mode_global;
00728 
00729 #ifdef  __cplusplus
00730 }
00731 #endif
00732 
00733 #endif  /* _SYS_SPA_H */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines