Print this page
2882 implement libzfs_core
2883 changing "canmount" property to "on" should not always remount dataset
2900 "zfs snapshot" should be able to create multiple, arbitrary snapshots at once
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Chris Siden <christopher.siden@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Bill Pijewski <wdp@joyent.com>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>


  35 #include <sys/fs/zfs.h>
  36 
  37 #ifdef  __cplusplus
  38 extern "C" {
  39 #endif
  40 
  41 /*
  42  * Forward references that lots of things need.
  43  */
  44 typedef struct spa spa_t;
  45 typedef struct vdev vdev_t;
  46 typedef struct metaslab metaslab_t;
  47 typedef struct metaslab_group metaslab_group_t;
  48 typedef struct metaslab_class metaslab_class_t;
  49 typedef struct zio zio_t;
  50 typedef struct zilog zilog_t;
  51 typedef struct spa_aux_vdev spa_aux_vdev_t;
  52 typedef struct ddt ddt_t;
  53 typedef struct ddt_entry ddt_entry_t;
  54 struct dsl_pool;

  55 
  56 /*
  57  * General-purpose 32-bit and 64-bit bitfield encodings.
  58  */
  59 #define BF32_DECODE(x, low, len)        P2PHASE((x) >> (low), 1U << (len))
  60 #define BF64_DECODE(x, low, len)        P2PHASE((x) >> (low), 1ULL << (len))
  61 #define BF32_ENCODE(x, low, len)        (P2PHASE((x), 1U << (len)) << (low))
  62 #define BF64_ENCODE(x, low, len)        (P2PHASE((x), 1ULL << (len)) << (low))
  63 
  64 #define BF32_GET(x, low, len)           BF32_DECODE(x, low, len)
  65 #define BF64_GET(x, low, len)           BF64_DECODE(x, low, len)
  66 
  67 #define BF32_SET(x, low, len, val)      \
  68         ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
  69 #define BF64_SET(x, low, len, val)      \
  70         ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
  71 
  72 #define BF32_GET_SB(x, low, len, shift, bias)   \
  73         ((BF32_GET(x, low, len) + (bias)) << (shift))
  74 #define BF64_GET_SB(x, low, len, shift, bias)   \


 401 }
 402 
 403 #include <sys/dmu.h>
 404 
 405 #define BP_GET_BUFC_TYPE(bp)                                            \
 406         (((BP_GET_LEVEL(bp) > 0) || (DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))) ? \
 407         ARC_BUFC_METADATA : ARC_BUFC_DATA)
 408 
 409 typedef enum spa_import_type {
 410         SPA_IMPORT_EXISTING,
 411         SPA_IMPORT_ASSEMBLE
 412 } spa_import_type_t;
 413 
 414 /* state manipulation functions */
 415 extern int spa_open(const char *pool, spa_t **, void *tag);
 416 extern int spa_open_rewind(const char *pool, spa_t **, void *tag,
 417     nvlist_t *policy, nvlist_t **config);
 418 extern int spa_get_stats(const char *pool, nvlist_t **config, char *altroot,
 419     size_t buflen);
 420 extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
 421     const char *history_str, nvlist_t *zplprops);
 422 extern int spa_import_rootpool(char *devpath, char *devid);
 423 extern int spa_import(const char *pool, nvlist_t *config, nvlist_t *props,
 424     uint64_t flags);
 425 extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
 426 extern int spa_destroy(char *pool);
 427 extern int spa_export(char *pool, nvlist_t **oldconfig, boolean_t force,
 428     boolean_t hardforce);
 429 extern int spa_reset(char *pool);
 430 extern void spa_async_request(spa_t *spa, int flag);
 431 extern void spa_async_unrequest(spa_t *spa, int flag);
 432 extern void spa_async_suspend(spa_t *spa);
 433 extern void spa_async_resume(spa_t *spa);
 434 extern spa_t *spa_inject_addref(char *pool);
 435 extern void spa_inject_delref(spa_t *spa);
 436 extern void spa_scan_stat_init(spa_t *spa);
 437 extern int spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps);
 438 
 439 #define SPA_ASYNC_CONFIG_UPDATE 0x01
 440 #define SPA_ASYNC_REMOVE        0x02
 441 #define SPA_ASYNC_PROBE         0x04


 615 extern uint64_t spa_get_random(uint64_t range);
 616 extern uint64_t spa_generate_guid(spa_t *spa);
 617 extern void sprintf_blkptr(char *buf, const blkptr_t *bp);
 618 extern void spa_freeze(spa_t *spa);
 619 extern int spa_change_guid(spa_t *spa);
 620 extern void spa_upgrade(spa_t *spa, uint64_t version);
 621 extern void spa_evict_all(void);
 622 extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid,
 623     boolean_t l2cache);
 624 extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
 625 extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva);
 626 extern uint64_t bp_get_dsize_sync(spa_t *spa, const blkptr_t *bp);
 627 extern uint64_t bp_get_dsize(spa_t *spa, const blkptr_t *bp);
 628 extern boolean_t spa_has_slogs(spa_t *spa);
 629 extern boolean_t spa_is_root(spa_t *spa);
 630 extern boolean_t spa_writeable(spa_t *spa);
 631 
 632 extern int spa_mode(spa_t *spa);
 633 extern uint64_t strtonum(const char *str, char **nptr);
 634 
 635 /* history logging */
 636 typedef enum history_log_type {
 637         LOG_CMD_POOL_CREATE,
 638         LOG_CMD_NORMAL,
 639         LOG_INTERNAL
 640 } history_log_type_t;
 641 
 642 typedef struct history_arg {
 643         char *ha_history_str;
 644         history_log_type_t ha_log_type;
 645         history_internal_events_t ha_event;
 646         char *ha_zone;
 647         uid_t ha_uid;
 648 } history_arg_t;
 649 
 650 extern char *spa_his_ievent_table[];
 651 
 652 extern void spa_history_create_obj(spa_t *spa, dmu_tx_t *tx);
 653 extern int spa_history_get(spa_t *spa, uint64_t *offset, uint64_t *len_read,
 654     char *his_buf);
 655 extern int spa_history_log(spa_t *spa, const char *his_buf,
 656     history_log_type_t what);
 657 extern void spa_history_log_internal(history_internal_events_t event,
 658     spa_t *spa, dmu_tx_t *tx, const char *fmt, ...);
 659 extern void spa_history_log_version(spa_t *spa, history_internal_events_t evt);




 660 
 661 /* error handling */
 662 struct zbookmark;
 663 extern void spa_log_error(spa_t *spa, zio_t *zio);
 664 extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
 665     zio_t *zio, uint64_t stateoroffset, uint64_t length);
 666 extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
 667 extern void zfs_post_state_change(spa_t *spa, vdev_t *vd);
 668 extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
 669 extern uint64_t spa_get_errlog_size(spa_t *spa);
 670 extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
 671 extern void spa_errlog_rotate(spa_t *spa);
 672 extern void spa_errlog_drain(spa_t *spa);
 673 extern void spa_errlog_sync(spa_t *spa, uint64_t txg);
 674 extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
 675 
 676 /* vdev cache */
 677 extern void vdev_cache_stat_init(void);
 678 extern void vdev_cache_stat_fini(void);
 679 




  35 #include <sys/fs/zfs.h>
  36 
  37 #ifdef  __cplusplus
  38 extern "C" {
  39 #endif
  40 
  41 /*
  42  * Forward references that lots of things need.
  43  */
  44 typedef struct spa spa_t;
  45 typedef struct vdev vdev_t;
  46 typedef struct metaslab metaslab_t;
  47 typedef struct metaslab_group metaslab_group_t;
  48 typedef struct metaslab_class metaslab_class_t;
  49 typedef struct zio zio_t;
  50 typedef struct zilog zilog_t;
  51 typedef struct spa_aux_vdev spa_aux_vdev_t;
  52 typedef struct ddt ddt_t;
  53 typedef struct ddt_entry ddt_entry_t;
  54 struct dsl_pool;
  55 struct dsl_dataset;
  56 
  57 /*
  58  * General-purpose 32-bit and 64-bit bitfield encodings.
  59  */
  60 #define BF32_DECODE(x, low, len)        P2PHASE((x) >> (low), 1U << (len))
  61 #define BF64_DECODE(x, low, len)        P2PHASE((x) >> (low), 1ULL << (len))
  62 #define BF32_ENCODE(x, low, len)        (P2PHASE((x), 1U << (len)) << (low))
  63 #define BF64_ENCODE(x, low, len)        (P2PHASE((x), 1ULL << (len)) << (low))
  64 
  65 #define BF32_GET(x, low, len)           BF32_DECODE(x, low, len)
  66 #define BF64_GET(x, low, len)           BF64_DECODE(x, low, len)
  67 
  68 #define BF32_SET(x, low, len, val)      \
  69         ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
  70 #define BF64_SET(x, low, len, val)      \
  71         ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
  72 
  73 #define BF32_GET_SB(x, low, len, shift, bias)   \
  74         ((BF32_GET(x, low, len) + (bias)) << (shift))
  75 #define BF64_GET_SB(x, low, len, shift, bias)   \


 402 }
 403 
 404 #include <sys/dmu.h>
 405 
 406 #define BP_GET_BUFC_TYPE(bp)                                            \
 407         (((BP_GET_LEVEL(bp) > 0) || (DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))) ? \
 408         ARC_BUFC_METADATA : ARC_BUFC_DATA)
 409 
 410 typedef enum spa_import_type {
 411         SPA_IMPORT_EXISTING,
 412         SPA_IMPORT_ASSEMBLE
 413 } spa_import_type_t;
 414 
 415 /* state manipulation functions */
 416 extern int spa_open(const char *pool, spa_t **, void *tag);
 417 extern int spa_open_rewind(const char *pool, spa_t **, void *tag,
 418     nvlist_t *policy, nvlist_t **config);
 419 extern int spa_get_stats(const char *pool, nvlist_t **config, char *altroot,
 420     size_t buflen);
 421 extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
 422     nvlist_t *zplprops);
 423 extern int spa_import_rootpool(char *devpath, char *devid);
 424 extern int spa_import(const char *pool, nvlist_t *config, nvlist_t *props,
 425     uint64_t flags);
 426 extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
 427 extern int spa_destroy(char *pool);
 428 extern int spa_export(char *pool, nvlist_t **oldconfig, boolean_t force,
 429     boolean_t hardforce);
 430 extern int spa_reset(char *pool);
 431 extern void spa_async_request(spa_t *spa, int flag);
 432 extern void spa_async_unrequest(spa_t *spa, int flag);
 433 extern void spa_async_suspend(spa_t *spa);
 434 extern void spa_async_resume(spa_t *spa);
 435 extern spa_t *spa_inject_addref(char *pool);
 436 extern void spa_inject_delref(spa_t *spa);
 437 extern void spa_scan_stat_init(spa_t *spa);
 438 extern int spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps);
 439 
 440 #define SPA_ASYNC_CONFIG_UPDATE 0x01
 441 #define SPA_ASYNC_REMOVE        0x02
 442 #define SPA_ASYNC_PROBE         0x04


 616 extern uint64_t spa_get_random(uint64_t range);
 617 extern uint64_t spa_generate_guid(spa_t *spa);
 618 extern void sprintf_blkptr(char *buf, const blkptr_t *bp);
 619 extern void spa_freeze(spa_t *spa);
 620 extern int spa_change_guid(spa_t *spa);
 621 extern void spa_upgrade(spa_t *spa, uint64_t version);
 622 extern void spa_evict_all(void);
 623 extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid,
 624     boolean_t l2cache);
 625 extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
 626 extern uint64_t dva_get_dsize_sync(spa_t *spa, const dva_t *dva);
 627 extern uint64_t bp_get_dsize_sync(spa_t *spa, const blkptr_t *bp);
 628 extern uint64_t bp_get_dsize(spa_t *spa, const blkptr_t *bp);
 629 extern boolean_t spa_has_slogs(spa_t *spa);
 630 extern boolean_t spa_is_root(spa_t *spa);
 631 extern boolean_t spa_writeable(spa_t *spa);
 632 
 633 extern int spa_mode(spa_t *spa);
 634 extern uint64_t strtonum(const char *str, char **nptr);
 635 















 636 extern char *spa_his_ievent_table[];
 637 
 638 extern void spa_history_create_obj(spa_t *spa, dmu_tx_t *tx);
 639 extern int spa_history_get(spa_t *spa, uint64_t *offset, uint64_t *len_read,
 640     char *his_buf);
 641 extern int spa_history_log(spa_t *spa, const char *his_buf);
 642 extern int spa_history_log_nvl(spa_t *spa, nvlist_t *nvl);
 643 extern void spa_history_log_version(spa_t *spa, const char *operation);
 644 extern void spa_history_log_internal(spa_t *spa, const char *operation,
 645     dmu_tx_t *tx, const char *fmt, ...);
 646 extern void spa_history_log_internal_ds(struct dsl_dataset *ds, const char *op,
 647     dmu_tx_t *tx, const char *fmt, ...);
 648 extern void spa_history_log_internal_dd(dsl_dir_t *dd, const char *operation,
 649     dmu_tx_t *tx, const char *fmt, ...);
 650 
 651 /* error handling */
 652 struct zbookmark;
 653 extern void spa_log_error(spa_t *spa, zio_t *zio);
 654 extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
 655     zio_t *zio, uint64_t stateoroffset, uint64_t length);
 656 extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
 657 extern void zfs_post_state_change(spa_t *spa, vdev_t *vd);
 658 extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
 659 extern uint64_t spa_get_errlog_size(spa_t *spa);
 660 extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
 661 extern void spa_errlog_rotate(spa_t *spa);
 662 extern void spa_errlog_drain(spa_t *spa);
 663 extern void spa_errlog_sync(spa_t *spa, uint64_t txg);
 664 extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
 665 
 666 /* vdev cache */
 667 extern void vdev_cache_stat_init(void);
 668 extern void vdev_cache_stat_fini(void);
 669