Print this page
5056 ZFS deadlock on db_mtx and dn_holds
Reviewed by: Will Andrews <willa@spectralogic.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Dan McDonald <danmcd@omniti.com>


   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
  24  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.

  25  */
  26 
  27 #ifndef _SYS_SPA_H
  28 #define _SYS_SPA_H
  29 
  30 #include <sys/avl.h>
  31 #include <sys/zfs_context.h>
  32 #include <sys/nvpair.h>
  33 #include <sys/sysmacros.h>
  34 #include <sys/types.h>
  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;


 665 extern void spa_config_load(void);
 666 extern nvlist_t *spa_all_configs(uint64_t *);
 667 extern void spa_config_set(spa_t *spa, nvlist_t *config);
 668 extern nvlist_t *spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg,
 669     int getstats);
 670 extern void spa_config_update(spa_t *spa, int what);
 671 
 672 /*
 673  * Miscellaneous SPA routines in spa_misc.c
 674  */
 675 
 676 /* Namespace manipulation */
 677 extern spa_t *spa_lookup(const char *name);
 678 extern spa_t *spa_add(const char *name, nvlist_t *config, const char *altroot);
 679 extern void spa_remove(spa_t *spa);
 680 extern spa_t *spa_next(spa_t *prev);
 681 
 682 /* Refcount functions */
 683 extern void spa_open_ref(spa_t *spa, void *tag);
 684 extern void spa_close(spa_t *spa, void *tag);

 685 extern boolean_t spa_refcount_zero(spa_t *spa);
 686 
 687 #define SCL_NONE        0x00
 688 #define SCL_CONFIG      0x01
 689 #define SCL_STATE       0x02
 690 #define SCL_L2ARC       0x04            /* hack until L2ARC 2.0 */
 691 #define SCL_ALLOC       0x08
 692 #define SCL_ZIO         0x10
 693 #define SCL_FREE        0x20
 694 #define SCL_VDEV        0x40
 695 #define SCL_LOCKS       7
 696 #define SCL_ALL         ((1 << SCL_LOCKS) - 1)
 697 #define SCL_STATE_ALL   (SCL_STATE | SCL_L2ARC | SCL_ZIO)
 698 
 699 /* Pool configuration locks */
 700 extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
 701 extern void spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw);
 702 extern void spa_config_exit(spa_t *spa, int locks, void *tag);
 703 extern int spa_config_held(spa_t *spa, int locks, krw_t rw);
 704 


 737 extern void spa_altroot(spa_t *, char *, size_t);
 738 extern int spa_sync_pass(spa_t *spa);
 739 extern char *spa_name(spa_t *spa);
 740 extern uint64_t spa_guid(spa_t *spa);
 741 extern uint64_t spa_load_guid(spa_t *spa);
 742 extern uint64_t spa_last_synced_txg(spa_t *spa);
 743 extern uint64_t spa_first_txg(spa_t *spa);
 744 extern uint64_t spa_syncing_txg(spa_t *spa);
 745 extern uint64_t spa_version(spa_t *spa);
 746 extern pool_state_t spa_state(spa_t *spa);
 747 extern spa_load_state_t spa_load_state(spa_t *spa);
 748 extern uint64_t spa_freeze_txg(spa_t *spa);
 749 extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
 750 extern uint64_t spa_get_dspace(spa_t *spa);
 751 extern uint64_t spa_get_slop_space(spa_t *spa);
 752 extern void spa_update_dspace(spa_t *spa);
 753 extern uint64_t spa_version(spa_t *spa);
 754 extern boolean_t spa_deflate(spa_t *spa);
 755 extern metaslab_class_t *spa_normal_class(spa_t *spa);
 756 extern metaslab_class_t *spa_log_class(spa_t *spa);



 757 extern int spa_max_replication(spa_t *spa);
 758 extern int spa_prev_software_version(spa_t *spa);
 759 extern int spa_busy(void);
 760 extern uint8_t spa_get_failmode(spa_t *spa);
 761 extern boolean_t spa_suspended(spa_t *spa);
 762 extern uint64_t spa_bootfs(spa_t *spa);
 763 extern uint64_t spa_delegation(spa_t *spa);
 764 extern objset_t *spa_meta_objset(spa_t *spa);
 765 extern uint64_t spa_deadman_synctime(spa_t *spa);
 766 
 767 /* Miscellaneous support routines */
 768 extern void spa_activate_mos_feature(spa_t *spa, const char *feature,
 769     dmu_tx_t *tx);
 770 extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature);
 771 extern int spa_rename(const char *oldname, const char *newname);
 772 extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
 773 extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
 774 extern char *spa_strdup(const char *);
 775 extern void spa_strfree(char *);
 776 extern uint64_t spa_get_random(uint64_t range);




   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
  24  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  25  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
  26  */
  27 
  28 #ifndef _SYS_SPA_H
  29 #define _SYS_SPA_H
  30 
  31 #include <sys/avl.h>
  32 #include <sys/zfs_context.h>
  33 #include <sys/nvpair.h>
  34 #include <sys/sysmacros.h>
  35 #include <sys/types.h>
  36 #include <sys/fs/zfs.h>
  37 
  38 #ifdef  __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 /*
  43  * Forward references that lots of things need.
  44  */
  45 typedef struct spa spa_t;


 666 extern void spa_config_load(void);
 667 extern nvlist_t *spa_all_configs(uint64_t *);
 668 extern void spa_config_set(spa_t *spa, nvlist_t *config);
 669 extern nvlist_t *spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg,
 670     int getstats);
 671 extern void spa_config_update(spa_t *spa, int what);
 672 
 673 /*
 674  * Miscellaneous SPA routines in spa_misc.c
 675  */
 676 
 677 /* Namespace manipulation */
 678 extern spa_t *spa_lookup(const char *name);
 679 extern spa_t *spa_add(const char *name, nvlist_t *config, const char *altroot);
 680 extern void spa_remove(spa_t *spa);
 681 extern spa_t *spa_next(spa_t *prev);
 682 
 683 /* Refcount functions */
 684 extern void spa_open_ref(spa_t *spa, void *tag);
 685 extern void spa_close(spa_t *spa, void *tag);
 686 extern void spa_async_close(spa_t *spa, void *tag);
 687 extern boolean_t spa_refcount_zero(spa_t *spa);
 688 
 689 #define SCL_NONE        0x00
 690 #define SCL_CONFIG      0x01
 691 #define SCL_STATE       0x02
 692 #define SCL_L2ARC       0x04            /* hack until L2ARC 2.0 */
 693 #define SCL_ALLOC       0x08
 694 #define SCL_ZIO         0x10
 695 #define SCL_FREE        0x20
 696 #define SCL_VDEV        0x40
 697 #define SCL_LOCKS       7
 698 #define SCL_ALL         ((1 << SCL_LOCKS) - 1)
 699 #define SCL_STATE_ALL   (SCL_STATE | SCL_L2ARC | SCL_ZIO)
 700 
 701 /* Pool configuration locks */
 702 extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
 703 extern void spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw);
 704 extern void spa_config_exit(spa_t *spa, int locks, void *tag);
 705 extern int spa_config_held(spa_t *spa, int locks, krw_t rw);
 706 


 739 extern void spa_altroot(spa_t *, char *, size_t);
 740 extern int spa_sync_pass(spa_t *spa);
 741 extern char *spa_name(spa_t *spa);
 742 extern uint64_t spa_guid(spa_t *spa);
 743 extern uint64_t spa_load_guid(spa_t *spa);
 744 extern uint64_t spa_last_synced_txg(spa_t *spa);
 745 extern uint64_t spa_first_txg(spa_t *spa);
 746 extern uint64_t spa_syncing_txg(spa_t *spa);
 747 extern uint64_t spa_version(spa_t *spa);
 748 extern pool_state_t spa_state(spa_t *spa);
 749 extern spa_load_state_t spa_load_state(spa_t *spa);
 750 extern uint64_t spa_freeze_txg(spa_t *spa);
 751 extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
 752 extern uint64_t spa_get_dspace(spa_t *spa);
 753 extern uint64_t spa_get_slop_space(spa_t *spa);
 754 extern void spa_update_dspace(spa_t *spa);
 755 extern uint64_t spa_version(spa_t *spa);
 756 extern boolean_t spa_deflate(spa_t *spa);
 757 extern metaslab_class_t *spa_normal_class(spa_t *spa);
 758 extern metaslab_class_t *spa_log_class(spa_t *spa);
 759 extern void spa_evicting_os_register(spa_t *, objset_t *os);
 760 extern void spa_evicting_os_deregister(spa_t *, objset_t *os);
 761 extern void spa_evicting_os_wait(spa_t *spa);
 762 extern int spa_max_replication(spa_t *spa);
 763 extern int spa_prev_software_version(spa_t *spa);
 764 extern int spa_busy(void);
 765 extern uint8_t spa_get_failmode(spa_t *spa);
 766 extern boolean_t spa_suspended(spa_t *spa);
 767 extern uint64_t spa_bootfs(spa_t *spa);
 768 extern uint64_t spa_delegation(spa_t *spa);
 769 extern objset_t *spa_meta_objset(spa_t *spa);
 770 extern uint64_t spa_deadman_synctime(spa_t *spa);
 771 
 772 /* Miscellaneous support routines */
 773 extern void spa_activate_mos_feature(spa_t *spa, const char *feature,
 774     dmu_tx_t *tx);
 775 extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature);
 776 extern int spa_rename(const char *oldname, const char *newname);
 777 extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
 778 extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
 779 extern char *spa_strdup(const char *);
 780 extern void spa_strfree(char *);
 781 extern uint64_t spa_get_random(uint64_t range);