usr/src/uts/common/fs/zfs/sys/vdev_impl.h
author eschrock
Tue, 16 May 2006 11:20:11 -0700
changeset 1986 628267397204
parent 1773 d6e4f2855c14
child 2082 76b439ec3ac1
permissions -rw-r--r--
6424405 zpool import destroyed_pool can damage existing pool using same devices
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1175
diff changeset
     5
 * Common Development and Distribution License (the "License").
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1175
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1175
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#ifndef _SYS_VDEV_IMPL_H
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#define	_SYS_VDEV_IMPL_H
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/avl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/metaslab.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/nvpair.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/space_map.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/vdev.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/dkio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/uberblock_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#ifdef	__cplusplus
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
extern "C" {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
 * Virtual device descriptors.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
 * All storage pool operations go through the virtual device framework,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
 * which provides data replication and I/O scheduling.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
 * Forward declarations that lots of things need.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
typedef struct vdev_queue vdev_queue_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
typedef struct vdev_cache vdev_cache_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
typedef struct vdev_cache_entry vdev_cache_entry_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
 * Virtual device operations
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
typedef int	vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *ashift);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
typedef void	vdev_close_func_t(vdev_t *vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
typedef uint64_t vdev_asize_func_t(vdev_t *vd, uint64_t psize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
typedef void	vdev_io_start_func_t(zio_t *zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
typedef void	vdev_io_done_func_t(zio_t *zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
typedef void	vdev_state_change_func_t(vdev_t *vd, int, int);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
typedef struct vdev_ops {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
	vdev_open_func_t		*vdev_op_open;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
	vdev_close_func_t		*vdev_op_close;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
	vdev_asize_func_t		*vdev_op_asize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
	vdev_io_start_func_t		*vdev_op_io_start;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
	vdev_io_done_func_t		*vdev_op_io_done;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
	vdev_state_change_func_t	*vdev_op_state_change;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
	char				vdev_op_type[16];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
	boolean_t			vdev_op_leaf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
} vdev_ops_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
 * Virtual device properties
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
struct vdev_cache_entry {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
	char		*ve_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
	uint64_t	ve_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
	uint64_t	ve_lastused;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
	avl_node_t	ve_offset_node;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
	avl_node_t	ve_lastused_node;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
	uint32_t	ve_hits;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
	uint16_t	ve_missed_update;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
	zio_t		*ve_fill_io;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
struct vdev_cache {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
	uint64_t	vc_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
	uint64_t	vc_bshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
	uint64_t	vc_blocksize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
	uint64_t	vc_max;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
	avl_tree_t	vc_offset_tree;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
	avl_tree_t	vc_lastused_tree;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
	kmutex_t	vc_lock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
struct vdev_queue {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
	uint64_t	vq_min_pending;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
	uint64_t	vq_max_pending;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   106
	uint64_t	vq_scrub_limit;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
	uint64_t	vq_agg_limit;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
	uint64_t	vq_time_shift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
	uint64_t	vq_ramp_rate;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   110
	uint64_t	vq_scrub_count;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	avl_tree_t	vq_deadline_tree;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
	avl_tree_t	vq_read_tree;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
	avl_tree_t	vq_write_tree;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
	avl_tree_t	vq_pending_tree;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
	kmutex_t	vq_lock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
 * Virtual device descriptor
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
struct vdev {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
	 * Common to all vdev types.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
	uint64_t	vdev_id;	/* child number in vdev parent	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
	uint64_t	vdev_guid;	/* unique ID for this vdev	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
	uint64_t	vdev_guid_sum;	/* self guid + all child guids	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
	uint64_t	vdev_asize;	/* allocatable device capacity	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
	uint64_t	vdev_ashift;	/* block alignment shift	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
	uint64_t	vdev_state;	/* see VDEV_STATE_* #defines	*/
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1773
diff changeset
   131
	uint64_t	vdev_prevstate;	/* used when reopening a vdev	*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
	vdev_ops_t	*vdev_ops;	/* vdev operations		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
	spa_t		*vdev_spa;	/* spa for this vdev		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
	void		*vdev_tsd;	/* type-specific data		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	vdev_t		*vdev_top;	/* top-level vdev		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
	vdev_t		*vdev_parent;	/* parent vdev			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
	vdev_t		**vdev_child;	/* array of children		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
	uint64_t	vdev_children;	/* number of children		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
	space_map_t	vdev_dtl_map;	/* dirty time log in-core state	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
	space_map_t	vdev_dtl_scrub;	/* DTL for scrub repair writes	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
	vdev_stat_t	vdev_stat;	/* virtual device statistics	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
	 * Top-level vdev state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
	uint64_t	vdev_ms_array;	/* metaslab array object	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
	uint64_t	vdev_ms_shift;	/* metaslab size shift		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
	uint64_t	vdev_ms_count;	/* number of metaslabs		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
	metaslab_group_t *vdev_mg;	/* metaslab group		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
	metaslab_t	**vdev_ms;	/* metaslab array		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
	txg_list_t	vdev_ms_list;	/* per-txg dirty metaslab lists	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
	txg_list_t	vdev_dtl_list;	/* per-txg dirty DTL lists	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
	txg_node_t	vdev_txg_node;	/* per-txg dirty vdev linkage	*/
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   154
	uint8_t		vdev_reopen_wanted; /* async reopen wanted?	*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
	list_node_t	vdev_dirty_node; /* config dirty list		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
	 * Leaf vdev state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
	uint64_t	vdev_psize;	/* physical device capacity	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
	space_map_obj_t	vdev_dtl;	/* dirty time log on-disk state	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
	txg_node_t	vdev_dtl_node;	/* per-txg dirty DTL linkage	*/
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 1034
diff changeset
   163
	uint64_t	vdev_wholedisk;	/* true if this is a whole disk */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   164
	uint64_t	vdev_offline;	/* device taken offline?	*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
	char		*vdev_path;	/* vdev path (if any)		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
	char		*vdev_devid;	/* vdev devid (if any)		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
	uint64_t	vdev_fault_arg; /* fault injection paramater	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
	int		vdev_fault_mask; /* zio types to fault		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
	uint8_t		vdev_fault_mode; /* fault injection mode	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
	uint8_t		vdev_cache_active; /* vdev_cache and vdev_queue	*/
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1175
diff changeset
   171
	uint8_t		vdev_tmpoffline; /* device taken offline temporarily? */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
	uint8_t		vdev_detached;	/* device detached?		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
	vdev_queue_t	vdev_queue;	/* I/O deadline schedule queue	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	vdev_cache_t	vdev_cache;	/* physical block cache		*/
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   175
	uint64_t	vdev_not_present; /* not present during import	*/
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   176
	hrtime_t	vdev_last_try;	/* last reopen time		*/
1773
d6e4f2855c14 6407791 bringover into ZFS results in s. files newer than extracted source
eschrock
parents: 1732
diff changeset
   177
	boolean_t	vdev_nowritecache; /* true if flushwritecache failed */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
	 * For DTrace to work in userland (libzpool) context, these fields must
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
	 * remain at the end of the structure.  DTrace will use the kernel's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
	 * CTF definition for 'struct vdev', and since the size of a kmutex_t is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
	 * larger in userland, the offsets for the rest fields would be
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
	 * incorrect.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
	kmutex_t	vdev_dtl_lock;	/* vdev_dtl_{map,resilver}	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
	kmutex_t	vdev_stat_lock;	/* vdev_stat			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
#define	VDEV_SKIP_SIZE		(8 << 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
#define	VDEV_BOOT_HEADER_SIZE	(8 << 10)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
#define	VDEV_PHYS_SIZE		(112 << 10)
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   193
#define	VDEV_UBERBLOCK_RING	(128 << 10)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   194
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   195
#define	VDEV_UBERBLOCK_SHIFT(vd)	\
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   196
	MAX((vd)->vdev_top->vdev_ashift, UBERBLOCK_SHIFT)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   197
#define	VDEV_UBERBLOCK_COUNT(vd)	\
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   198
	(VDEV_UBERBLOCK_RING >> VDEV_UBERBLOCK_SHIFT(vd))
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   199
#define	VDEV_UBERBLOCK_OFFSET(vd, n)	\
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   200
	offsetof(vdev_label_t, vl_uberblock[(n) << VDEV_UBERBLOCK_SHIFT(vd)])
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   201
#define	VDEV_UBERBLOCK_SIZE(vd)		(1ULL << VDEV_UBERBLOCK_SHIFT(vd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
#define	VDEV_BOOT_MAGIC		0x2f5b007b10c	/* ZFS boot block	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
#define	VDEV_BOOT_VERSION	1		/* version number	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
typedef struct vdev_boot_header {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
	uint64_t	vb_magic;		/* VDEV_BOOT_MAGIC	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
	uint64_t	vb_version;		/* VDEV_BOOT_VERSION	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
	uint64_t	vb_offset;		/* start offset	(bytes) */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
	uint64_t	vb_size;		/* size (bytes)		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
	char		vb_pad[VDEV_BOOT_HEADER_SIZE - 4 * sizeof (uint64_t)];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
} vdev_boot_header_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
typedef struct vdev_phys {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
	char		vp_nvlist[VDEV_PHYS_SIZE - sizeof (zio_block_tail_t)];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
	zio_block_tail_t vp_zbt;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
} vdev_phys_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
typedef struct vdev_label {
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   220
	char		vl_pad[VDEV_SKIP_SIZE];			/*   8K	*/
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   221
	vdev_boot_header_t vl_boot_header;			/*   8K	*/
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   222
	vdev_phys_t	vl_vdev_phys;				/* 112K	*/
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   223
	char		vl_uberblock[VDEV_UBERBLOCK_RING];	/* 128K	*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
} vdev_label_t;							/* 256K total */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
/*
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   227
 * vdev_dirty() flags
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   228
 */
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   229
#define	VDD_METASLAB	0x01
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   230
#define	VDD_DTL		0x02
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   231
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   232
/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
 * Size and offset of embedded boot loader region on each label.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
 * The total size of the first two labels plus the boot area is 4MB.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
#define	VDEV_BOOT_OFFSET	(2 * sizeof (vdev_label_t))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
#define	VDEV_BOOT_SIZE		(7ULL << 19)			/* 3.5M	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
 * Size of label regions at the start and end of each leaf device.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
#define	VDEV_LABEL_START_SIZE	(2 * sizeof (vdev_label_t) + VDEV_BOOT_SIZE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
#define	VDEV_LABEL_END_SIZE	(2 * sizeof (vdev_label_t))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
#define	VDEV_LABELS		4
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
#define	VDEV_ALLOC_LOAD		0
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
#define	VDEV_ALLOC_ADD		1
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
 * Allocate or free a vdev
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
extern vdev_t *vdev_alloc(spa_t *spa, nvlist_t *config, vdev_t *parent,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
    uint_t id, int alloctype);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
extern void vdev_free(vdev_t *vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
 * Add or remove children and parents
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
extern void vdev_add_child(vdev_t *pvd, vdev_t *cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
extern void vdev_remove_child(vdev_t *pvd, vdev_t *cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
extern void vdev_compact_children(vdev_t *pvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
extern vdev_t *vdev_add_parent(vdev_t *cvd, vdev_ops_t *ops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
extern void vdev_remove_parent(vdev_t *cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
 * vdev sync load and sync
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
 */
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1773
diff changeset
   268
extern void vdev_load(vdev_t *vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
extern void vdev_sync(vdev_t *vd, uint64_t txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
extern void vdev_sync_done(vdev_t *vd, uint64_t txg);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   271
extern void vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
 * Available vdev types.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
extern vdev_ops_t vdev_root_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
extern vdev_ops_t vdev_mirror_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
extern vdev_ops_t vdev_replacing_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
extern vdev_ops_t vdev_raidz_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
extern vdev_ops_t vdev_disk_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
extern vdev_ops_t vdev_file_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
extern vdev_ops_t vdev_missing_ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
/*
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   285
 * Common size functions
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
extern uint64_t vdev_default_asize(vdev_t *vd, uint64_t psize);
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   288
extern uint64_t vdev_get_rsize(vdev_t *vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
#ifdef	__cplusplus
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
#endif	/* _SYS_VDEV_IMPL_H */