usr/src/uts/common/fs/zfs/vdev_label.c
author Christopher Siden <chris.siden@delphix.com>
Mon, 21 May 2012 12:11:39 -0700
changeset 13700 2889e2596bd6
parent 13061 bda0decf867b
child 13777 b1e53580146d
permissions -rw-r--r--
2619 asynchronous destruction of ZFS file systems 2747 SPA versioning with zfs feature flags Reviewed by: Matt Ahrens <[email protected]> Reviewed by: George Wilson <[email protected]> Reviewed by: Richard Lowe <[email protected]> Reviewed by: Dan Kruchinin <[email protected]> Approved by: Eric Schrock <[email protected]>
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: 1171
diff changeset
     5
 * Common Development and Distribution License (the "License").
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1171
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
 */
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
    21
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    22
/*
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
    23
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
    24
 * Copyright (c) 2012 by Delphix. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
 * Virtual Device Labels
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
 * ---------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
 * The vdev label serves several distinct purposes:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
 *	1. Uniquely identify this device as part of a ZFS pool and confirm its
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
 *	   identity within the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
 * 	2. Verify that all the devices given in a configuration are present
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
 *         within the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
 * 	3. Determine the uberblock for the pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
 * 	4. In case of an import operation, determine the configuration of the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
 *         toplevel vdev of which it is a part.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
 * 	5. If an import operation cannot find all the devices in the pool,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
 *         provide enough information to the administrator to determine which
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
 *         devices are missing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
 * It is important to note that while the kernel is responsible for writing the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
 * label, it only consumes the information in the first three cases.  The
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
 * latter information is only consumed in userland when determining the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
 * configuration to import a pool.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
 * Label Organization
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
 * ------------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
 * Before describing the contents of the label, it's important to understand how
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
 * the labels are written and updated with respect to the uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
 * When the pool configuration is altered, either because it was newly created
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
 * or a device was added, we want to update all the labels such that we can deal
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
 * with fatal failure at any point.  To this end, each disk has two labels which
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
 * are updated before and after the uberblock is synced.  Assuming we have
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
    64
 * labels and an uberblock with the following transaction groups:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
 *              L1          UB          L2
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
 *           +------+    +------+    +------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
 *           |      |    |      |    |      |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
 *           | t10  |    | t10  |    | t10  |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
 *           |      |    |      |    |      |
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
 *           +------+    +------+    +------+
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
 * In this stable state, the labels and the uberblock were all updated within
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
 * the same transaction group (10).  Each label is mirrored and checksummed, so
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
 * that we can detect when we fail partway through writing the label.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
 * In order to identify which labels are valid, the labels are written in the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
 * following manner:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
 * 	1. For each vdev, update 'L1' to the new label
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
 * 	2. Update the uberblock
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
 * 	3. For each vdev, update 'L2' to the new label
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
 * Given arbitrary failure, we can determine the correct label to use based on
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
 * the transaction group.  If we fail after updating L1 but before updating the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
 * UB, we will notice that L1's transaction group is greater than the uberblock,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
 * so L2 must be valid.  If we fail after writing the uberblock but before
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
 * writing L2, we will notice that L2's transaction group is less than L1, and
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
 * therefore L1 is valid.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
 * Another added complexity is that not every label is updated when the config
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
 * is synced.  If we add a single device, we do not want to have to re-write
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
 * every label for every device in the pool.  This means that both L1 and L2 may
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
 * be older than the pool uberblock, because the necessary information is stored
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
 * on another vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
 * On-disk Format
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
 * --------------
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
 * The vdev label consists of two distinct parts, and is wrapped within the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
 * vdev_label_t structure.  The label includes 8k of padding to permit legacy
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
 * VTOC disk labels, but is otherwise ignored.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
 * The first half of the label is a packed nvlist which contains pool wide
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
 * properties, per-vdev properties, and configuration information.  It is
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
 * described in more detail below.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
 * The latter half of the label consists of a redundant array of uberblocks.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
 * These uberblocks are updated whenever a transaction group is committed,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
 * or when the configuration is updated.  When a pool is loaded, we scan each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
 * vdev for the 'best' uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
 * Configuration Information
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
 * The nvlist describing the pool and vdev contains the following elements:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
 * 	version		ZFS on-disk version
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
 * 	name		Pool name
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
 * 	state		Pool state
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
 * 	txg		Transaction group in which this label was written
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
 * 	pool_guid	Unique identifier for this pool
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
 * 	vdev_tree	An nvlist describing vdev tree.
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   126
 *	features_for_read
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   127
 *			An nvlist of the features necessary for reading the MOS.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
 * Each leaf device label also contains the following:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
 * 	top_guid	Unique ID for top-level vdev in which this is contained
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
 * 	guid		Unique ID for the leaf vdev
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
 * The 'vs' configuration follows the format described in 'spa_config.c'.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
#include <sys/spa_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
#include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
#include <sys/vdev.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
#include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
#include <sys/uberblock_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
#include <sys/metaslab.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
#include <sys/zio.h>
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   147
#include <sys/dsl_scan.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
 * Basic routines to read and write from a vdev label.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
 * Used throughout the rest of this file.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
uint64_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
vdev_label_offset(uint64_t psize, int l, uint64_t offset)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
{
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   157
	ASSERT(offset < sizeof (vdev_label_t));
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4527
diff changeset
   158
	ASSERT(P2PHASE_TYPED(psize, sizeof (vdev_label_t), uint64_t) == 0);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   159
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
	return (offset + l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ?
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
	    0 : psize - VDEV_LABELS * sizeof (vdev_label_t)));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
6615
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   164
/*
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   165
 * Returns back the vdev label associated with the passed in offset.
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   166
 */
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   167
int
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   168
vdev_label_number(uint64_t psize, uint64_t offset)
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   169
{
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   170
	int l;
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   171
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   172
	if (offset >= psize - VDEV_LABEL_END_SIZE) {
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   173
		offset -= psize - VDEV_LABEL_END_SIZE;
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   174
		offset += (VDEV_LABELS / 2) * sizeof (vdev_label_t);
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   175
	}
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   176
	l = offset / sizeof (vdev_label_t);
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   177
	return (l < VDEV_LABELS ? l : -1);
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   178
}
333cfc13ec55 6616599 vdev_config_sync(rvd, txg) == 0, file: ../../common/fs/zfs/spa .c, line: 3537
gw25295
parents: 5688
diff changeset
   179
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
vdev_label_read(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   182
	uint64_t size, zio_done_func_t *done, void *private, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   184
	ASSERT(spa_config_held(zio->io_spa, SCL_STATE_ALL, RW_WRITER) ==
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   185
	    SCL_STATE_ALL);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   186
	ASSERT(flags & ZIO_FLAG_CONFIG_WRITER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
	zio_nowait(zio_read_phys(zio, vd,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	    vdev_label_offset(vd->vdev_psize, l, offset),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
	    size, buf, ZIO_CHECKSUM_LABEL, done, private,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   191
	    ZIO_PRIORITY_SYNC_READ, flags, B_TRUE));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
vdev_label_write(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   196
	uint64_t size, zio_done_func_t *done, void *private, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   198
	ASSERT(spa_config_held(zio->io_spa, SCL_ALL, RW_WRITER) == SCL_ALL ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   199
	    (spa_config_held(zio->io_spa, SCL_CONFIG | SCL_STATE, RW_READER) ==
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   200
	    (SCL_CONFIG | SCL_STATE) &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   201
	    dsl_pool_sync_context(spa_get_dsl(zio->io_spa))));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   202
	ASSERT(flags & ZIO_FLAG_CONFIG_WRITER);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
	zio_nowait(zio_write_phys(zio, vd,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
	    vdev_label_offset(vd->vdev_psize, l, offset),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
	    size, buf, ZIO_CHECKSUM_LABEL, done, private,
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   207
	    ZIO_PRIORITY_SYNC_WRITE, flags, B_TRUE));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
 * Generate the nvlist representing this vdev's config.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
nvlist_t *
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   214
vdev_config_generate(spa_t *spa, vdev_t *vd, boolean_t getstats,
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   215
    vdev_config_flag_t flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
	nvlist_t *nv = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   219
	VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
	VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_TYPE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
	    vd->vdev_ops->vdev_op_type) == 0);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   223
	if (!(flags & (VDEV_CONFIG_SPARE | VDEV_CONFIG_L2CACHE)))
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   224
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ID, vd->vdev_id)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   225
		    == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
	VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_GUID, vd->vdev_guid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
	if (vd->vdev_path != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
		VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_PATH,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
		    vd->vdev_path) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
	if (vd->vdev_devid != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
		VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_DEVID,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
		    vd->vdev_devid) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   236
	if (vd->vdev_physpath != NULL)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   237
		VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_PHYS_PATH,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   238
		    vd->vdev_physpath) == 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   239
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9056
diff changeset
   240
	if (vd->vdev_fru != NULL)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9056
diff changeset
   241
		VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_FRU,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9056
diff changeset
   242
		    vd->vdev_fru) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9056
diff changeset
   243
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   244
	if (vd->vdev_nparity != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   245
		ASSERT(strcmp(vd->vdev_ops->vdev_op_type,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   246
		    VDEV_TYPE_RAIDZ) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   247
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   248
		/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   249
		 * Make sure someone hasn't managed to sneak a fancy new vdev
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   250
		 * into a crufty old storage pool.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   251
		 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   252
		ASSERT(vd->vdev_nparity == 1 ||
10105
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 9846
diff changeset
   253
		    (vd->vdev_nparity <= 2 &&
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 9846
diff changeset
   254
		    spa_version(spa) >= SPA_VERSION_RAIDZ2) ||
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 9846
diff changeset
   255
		    (vd->vdev_nparity <= 3 &&
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 9846
diff changeset
   256
		    spa_version(spa) >= SPA_VERSION_RAIDZ3));
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   257
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   258
		/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   259
		 * Note that we'll add the nparity tag even on storage pools
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   260
		 * that only support a single parity device -- older software
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   261
		 * will just ignore it.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   262
		 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   263
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_NPARITY,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   264
		    vd->vdev_nparity) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   265
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   266
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   267
	if (vd->vdev_wholedisk != -1ULL)
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   268
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   269
		    vd->vdev_wholedisk) == 0);
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   270
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   271
	if (vd->vdev_not_present)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   272
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, 1) == 0);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   273
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   274
	if (vd->vdev_isspare)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   275
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_IS_SPARE, 1) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   276
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   277
	if (!(flags & (VDEV_CONFIG_SPARE | VDEV_CONFIG_L2CACHE)) &&
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   278
	    vd == vd->vdev_top) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_METASLAB_ARRAY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
		    vd->vdev_ms_array) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_METASLAB_SHIFT,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
		    vd->vdev_ms_shift) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ASHIFT,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
		    vd->vdev_ashift) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ASIZE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
		    vd->vdev_asize) == 0);
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   287
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_IS_LOG,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   288
		    vd->vdev_islog) == 0);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   289
		if (vd->vdev_removing)
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   290
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_REMOVING,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   291
			    vd->vdev_removing) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8188
diff changeset
   294
	if (vd->vdev_dtl_smo.smo_object != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_DTL,
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8188
diff changeset
   296
		    vd->vdev_dtl_smo.smo_object) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   298
	if (vd->vdev_crtxg)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   299
		VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_CREATE_TXG,
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   300
		    vd->vdev_crtxg) == 0);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   301
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
	if (getstats) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
		vdev_stat_t vs;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   304
		pool_scan_stat_t ps;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   305
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
		vdev_get_stats(vd, &vs);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   307
		VERIFY(nvlist_add_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
		    (uint64_t *)&vs, sizeof (vs) / sizeof (uint64_t)) == 0);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   309
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   310
		/* provide either current or previous scan information */
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   311
		if (spa_scan_get_stats(spa, &ps) == 0) {
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   312
			VERIFY(nvlist_add_uint64_array(nv,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   313
			    ZPOOL_CONFIG_SCAN_STATS, (uint64_t *)&ps,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   314
			    sizeof (pool_scan_stat_t) / sizeof (uint64_t))
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   315
			    == 0);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   316
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
	if (!vd->vdev_ops->vdev_op_leaf) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
		nvlist_t **child;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   321
		int c, idx;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   323
		ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   324
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
		child = kmem_alloc(vd->vdev_children * sizeof (nvlist_t *),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
		    KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   328
		for (c = 0, idx = 0; c < vd->vdev_children; c++) {
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   329
			vdev_t *cvd = vd->vdev_child[c];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   331
			/*
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   332
			 * If we're generating an nvlist of removing
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   333
			 * vdevs then skip over any device which is
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   334
			 * not being removed.
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   335
			 */
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   336
			if ((flags & VDEV_CONFIG_REMOVING) &&
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   337
			    !cvd->vdev_removing)
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   338
				continue;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   340
			child[idx++] = vdev_config_generate(spa, cvd,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   341
			    getstats, flags);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   342
		}
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   343
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   344
		if (idx) {
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   345
			VERIFY(nvlist_add_nvlist_array(nv,
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   346
			    ZPOOL_CONFIG_CHILDREN, child, idx) == 0);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   347
		}
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   348
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   349
		for (c = 0; c < idx; c++)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
			nvlist_free(child[c]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
		kmem_free(child, vd->vdev_children * sizeof (nvlist_t *));
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1171
diff changeset
   353
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1171
diff changeset
   354
	} else {
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   355
		const char *aux = NULL;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   356
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   357
		if (vd->vdev_offline && !vd->vdev_tmpoffline)
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1171
diff changeset
   358
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_OFFLINE,
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   359
			    B_TRUE) == 0);
13049
2511753a6599 6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents: 12296
diff changeset
   360
		if (vd->vdev_resilvering)
2511753a6599 6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents: 12296
diff changeset
   361
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_RESILVERING,
2511753a6599 6782540 zpool cannot replace a replacing device
Mark J Musante <Mark.Musante@Sun.COM>
parents: 12296
diff changeset
   362
			    B_TRUE) == 0);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   363
		if (vd->vdev_faulted)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   364
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_FAULTED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   365
			    B_TRUE) == 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   366
		if (vd->vdev_degraded)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   367
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_DEGRADED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   368
			    B_TRUE) == 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   369
		if (vd->vdev_removed)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   370
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_REMOVED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   371
			    B_TRUE) == 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   372
		if (vd->vdev_unspare)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   373
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_UNSPARE,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   374
			    B_TRUE) == 0);
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   375
		if (vd->vdev_ishole)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   376
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_IS_HOLE,
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   377
			    B_TRUE) == 0);
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   378
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   379
		switch (vd->vdev_stat.vs_aux) {
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   380
		case VDEV_AUX_ERR_EXCEEDED:
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   381
			aux = "err_exceeded";
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   382
			break;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   383
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   384
		case VDEV_AUX_EXTERNAL:
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   385
			aux = "external";
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   386
			break;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   387
		}
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   388
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   389
		if (aux != NULL)
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   390
			VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_AUX_STATE,
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10666
diff changeset
   391
			    aux) == 0);
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   392
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   393
		if (vd->vdev_splitting && vd->vdev_orig_guid != 0LL) {
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   394
			VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ORIG_GUID,
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   395
			    vd->vdev_orig_guid) == 0);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   396
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
	return (nv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   400
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   401
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   402
/*
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   403
 * Generate a view of the top-level vdevs.  If we currently have holes
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   404
 * in the namespace, then generate an array which contains a list of holey
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   405
 * vdevs.  Additionally, add the number of top-level children that currently
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   406
 * exist.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   407
 */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   408
void
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   409
vdev_top_config_generate(spa_t *spa, nvlist_t *config)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   410
{
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   411
	vdev_t *rvd = spa->spa_root_vdev;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   412
	uint64_t *array;
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   413
	uint_t c, idx;
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   414
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   415
	array = kmem_alloc(rvd->vdev_children * sizeof (uint64_t), KM_SLEEP);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   416
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 11422
diff changeset
   417
	for (c = 0, idx = 0; c < rvd->vdev_children; c++) {
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   418
		vdev_t *tvd = rvd->vdev_child[c];
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   419
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   420
		if (tvd->vdev_ishole)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   421
			array[idx++] = c;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   422
	}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   423
10666
48f9827bb5cf 6886074 zfs shouldn't add zero length arrays since nvlists apparently can't handle them
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
   424
	if (idx) {
48f9827bb5cf 6886074 zfs shouldn't add zero length arrays since nvlists apparently can't handle them
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
   425
		VERIFY(nvlist_add_uint64_array(config, ZPOOL_CONFIG_HOLE_ARRAY,
48f9827bb5cf 6886074 zfs shouldn't add zero length arrays since nvlists apparently can't handle them
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
   426
		    array, idx) == 0);
48f9827bb5cf 6886074 zfs shouldn't add zero length arrays since nvlists apparently can't handle them
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
   427
	}
48f9827bb5cf 6886074 zfs shouldn't add zero length arrays since nvlists apparently can't handle them
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
   428
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   429
	VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_VDEV_CHILDREN,
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   430
	    rvd->vdev_children) == 0);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   431
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   432
	kmem_free(array, rvd->vdev_children * sizeof (uint64_t));
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   433
}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   434
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   435
/*
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   436
 * Returns the configuration from the label of the given vdev. If 'label' is
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   437
 * VDEV_BEST_LABEL, each label of the vdev will be read until a valid
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   438
 * configuration is found; otherwise, only the specified label will be read.
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   439
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
nvlist_t *
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   441
vdev_label_read_config(vdev_t *vd, int label)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   442
{
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
   443
	spa_t *spa = vd->vdev_spa;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   444
	nvlist_t *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   445
	vdev_phys_t *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   446
	zio_t *zio;
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   447
	int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL |
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   448
	    ZIO_FLAG_SPECULATIVE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   450
	ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
   451
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 4787
diff changeset
   452
	if (!vdev_readable(vd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
		return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   455
	vp = zio_buf_alloc(sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   457
retry:
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   458
	for (int l = 0; l < VDEV_LABELS; l++) {
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   459
		if (label >= 0 && label < VDEV_LABELS && label != l)
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   460
			continue;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   461
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   462
		zio = zio_root(spa, NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   463
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   464
		vdev_label_read(zio, vd, l, vp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   465
		    offsetof(vdev_label_t, vl_vdev_phys),
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   466
		    sizeof (vdev_phys_t), NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   467
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
		if (zio_wait(zio) == 0 &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
		    nvlist_unpack(vp->vp_nvlist, sizeof (vp->vp_nvlist),
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   470
		    &config, 0) == 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
		if (config != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
			nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
			config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   477
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   479
	if (config == NULL && !(flags & ZIO_FLAG_TRYHARD)) {
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   480
		flags |= ZIO_FLAG_TRYHARD;
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   481
		goto retry;
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   482
	}
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   483
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
	zio_buf_free(vp, sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
	return (config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   488
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   489
/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   490
 * Determine if a device is in use.  The 'spare_guid' parameter will be filled
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   491
 * in with the device guid if this spare is active elsewhere on the system.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   492
 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   493
static boolean_t
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   494
vdev_inuse(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason,
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   495
    uint64_t *spare_guid, uint64_t *l2cache_guid)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   496
{
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   497
	spa_t *spa = vd->vdev_spa;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   498
	uint64_t state, pool_guid, device_guid, txg, spare_pool;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   499
	uint64_t vdtxg = 0;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   500
	nvlist_t *label;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   501
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   502
	if (spare_guid)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   503
		*spare_guid = 0ULL;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   504
	if (l2cache_guid)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   505
		*l2cache_guid = 0ULL;
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   506
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   507
	/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   508
	 * Read the label, if any, and perform some basic sanity checks.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   509
	 */
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   510
	if ((label = vdev_label_read_config(vd, VDEV_BEST_LABEL)) == NULL)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   511
		return (B_FALSE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   512
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   513
	(void) nvlist_lookup_uint64(label, ZPOOL_CONFIG_CREATE_TXG,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   514
	    &vdtxg);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   515
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   516
	if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   517
	    &state) != 0 ||
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   518
	    nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   519
	    &device_guid) != 0) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   520
		nvlist_free(label);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   521
		return (B_FALSE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   522
	}
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   523
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   524
	if (state != POOL_STATE_SPARE && state != POOL_STATE_L2CACHE &&
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   525
	    (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   526
	    &pool_guid) != 0 ||
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   527
	    nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_TXG,
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   528
	    &txg) != 0)) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   529
		nvlist_free(label);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   530
		return (B_FALSE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   531
	}
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   532
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   533
	nvlist_free(label);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   534
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   535
	/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   536
	 * Check to see if this device indeed belongs to the pool it claims to
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   537
	 * be a part of.  The only way this is allowed is if the device is a hot
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   538
	 * spare (which we check for later on).
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   539
	 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   540
	if (state != POOL_STATE_SPARE && state != POOL_STATE_L2CACHE &&
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   541
	    !spa_guid_exists(pool_guid, device_guid) &&
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7041
diff changeset
   542
	    !spa_spare_exists(device_guid, NULL, NULL) &&
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   543
	    !spa_l2cache_exists(device_guid, NULL))
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   544
		return (B_FALSE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   545
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   546
	/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   547
	 * If the transaction group is zero, then this an initialized (but
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   548
	 * unused) label.  This is only an error if the create transaction
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   549
	 * on-disk is the same as the one we're using now, in which case the
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   550
	 * user has attempted to add the same vdev multiple times in the same
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   551
	 * transaction.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   552
	 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   553
	if (state != POOL_STATE_SPARE && state != POOL_STATE_L2CACHE &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   554
	    txg == 0 && vdtxg == crtxg)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   555
		return (B_TRUE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   556
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   557
	/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   558
	 * Check to see if this is a spare device.  We do an explicit check for
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   559
	 * spa_has_spare() here because it may be on our pending list of spares
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   560
	 * to add.  We also check if it is an l2cache device.
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   561
	 */
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7041
diff changeset
   562
	if (spa_spare_exists(device_guid, &spare_pool, NULL) ||
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   563
	    spa_has_spare(spa, device_guid)) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   564
		if (spare_guid)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   565
			*spare_guid = device_guid;
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   566
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   567
		switch (reason) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   568
		case VDEV_LABEL_CREATE:
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   569
		case VDEV_LABEL_L2CACHE:
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   570
			return (B_TRUE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   571
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   572
		case VDEV_LABEL_REPLACE:
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   573
			return (!spa_has_spare(spa, device_guid) ||
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   574
			    spare_pool != 0ULL);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   575
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   576
		case VDEV_LABEL_SPARE:
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   577
			return (spa_has_spare(spa, device_guid));
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   578
		}
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   579
	}
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   580
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   581
	/*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   582
	 * Check to see if this is an l2cache device.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   583
	 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   584
	if (spa_l2cache_exists(device_guid, NULL))
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   585
		return (B_TRUE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   586
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   587
	/*
13061
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   588
	 * We can't rely on a pool's state if it's been imported
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   589
	 * read-only.  Instead we look to see if the pools is marked
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   590
	 * read-only in the namespace and set the state to active.
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   591
	 */
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   592
	if ((spa = spa_by_guid(pool_guid, device_guid)) != NULL &&
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   593
	    spa_mode(spa) == FREAD)
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   594
		state = POOL_STATE_ACTIVE;
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   595
bda0decf867b PSARC 2010/306 Read-only ZFS pools
George Wilson <George.Wilson@Sun.COM>
parents: 13049
diff changeset
   596
	/*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   597
	 * If the device is marked ACTIVE, then this device is in use by another
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   598
	 * pool on the system.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   599
	 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   600
	return (state == POOL_STATE_ACTIVE);
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   601
}
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   602
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   603
/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   604
 * Initialize a vdev label.  We check to make sure each leaf device is not in
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   605
 * use, and writable.  We put down an initial label which we will later
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   606
 * overwrite with a complete label.  Note that it's important to do this
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   607
 * sequentially, not in parallel, so that we catch cases of multiple use of the
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   608
 * same leaf vdev in the vdev we're creating -- e.g. mirroring a disk with
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   609
 * itself.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   610
 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   611
int
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   612
vdev_label_init(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   613
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   614
	spa_t *spa = vd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   615
	nvlist_t *label;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   616
	vdev_phys_t *vp;
9056
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   617
	char *pad2;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   618
	uberblock_t *ub;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   619
	zio_t *zio;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   620
	char *buf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   621
	size_t buflen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   622
	int error;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   623
	uint64_t spare_guid, l2cache_guid;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   624
	int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   625
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   626
	ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
   627
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   628
	for (int c = 0; c < vd->vdev_children; c++)
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   629
		if ((error = vdev_label_init(vd->vdev_child[c],
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   630
		    crtxg, reason)) != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   631
			return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   632
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   633
	/* Track the creation time for this vdev */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   634
	vd->vdev_crtxg = crtxg;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
   635
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   636
	if (!vd->vdev_ops->vdev_op_leaf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   637
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   638
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   639
	/*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   640
	 * Dead vdevs cannot be initialized.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   641
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   642
	if (vdev_is_dead(vd))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   643
		return (EIO);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
	/*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   646
	 * Determine if the vdev is in use.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
	 */
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   648
	if (reason != VDEV_LABEL_REMOVE && reason != VDEV_LABEL_SPLIT &&
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   649
	    vdev_inuse(vd, crtxg, reason, &spare_guid, &l2cache_guid))
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   650
		return (EBUSY);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   652
	/*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   653
	 * If this is a request to add or replace a spare or l2cache device
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   654
	 * that is in use elsewhere on the system, then we must update the
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   655
	 * guid (which was initialized to a random value) to reflect the
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   656
	 * actual GUID (which is shared between multiple pools).
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   657
	 */
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   658
	if (reason != VDEV_LABEL_REMOVE && reason != VDEV_LABEL_L2CACHE &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   659
	    spare_guid != 0ULL) {
7768
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   660
		uint64_t guid_delta = spare_guid - vd->vdev_guid;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   661
7768
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   662
		vd->vdev_guid += guid_delta;
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   663
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   664
		for (vdev_t *pvd = vd; pvd != NULL; pvd = pvd->vdev_parent)
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   665
			pvd->vdev_guid_sum += guid_delta;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   666
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   667
		/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   668
		 * If this is a replacement, then we want to fallthrough to the
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   669
		 * rest of the code.  If we're adding a spare, then it's already
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   670
		 * labeled appropriately and we can just return.
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   671
		 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   672
		if (reason == VDEV_LABEL_SPARE)
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   673
			return (0);
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   674
		ASSERT(reason == VDEV_LABEL_REPLACE ||
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   675
		    reason == VDEV_LABEL_SPLIT);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   676
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   677
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   678
	if (reason != VDEV_LABEL_REMOVE && reason != VDEV_LABEL_SPARE &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   679
	    l2cache_guid != 0ULL) {
7768
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   680
		uint64_t guid_delta = l2cache_guid - vd->vdev_guid;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   681
7768
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   682
		vd->vdev_guid += guid_delta;
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   683
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   684
		for (vdev_t *pvd = vd; pvd != NULL; pvd = pvd->vdev_parent)
7d2fd61355d7 6754946 assertion failure in vdev_label_init() under zpool_remove_003_pos test
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7754
diff changeset
   685
			pvd->vdev_guid_sum += guid_delta;
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   686
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   687
		/*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   688
		 * If this is a replacement, then we want to fallthrough to the
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   689
		 * rest of the code.  If we're adding an l2cache, then it's
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   690
		 * already labeled appropriately and we can just return.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   691
		 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   692
		if (reason == VDEV_LABEL_L2CACHE)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   693
			return (0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   694
		ASSERT(reason == VDEV_LABEL_REPLACE);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   695
	}
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   696
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   697
	/*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   698
	 * Initialize its label.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   699
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   700
	vp = zio_buf_alloc(sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   701
	bzero(vp, sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   702
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
	 * Generate a label describing the pool and our top-level vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
	 * We mark it as being from txg 0 to indicate that it's not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
	 * really part of an active pool just yet.  The labels will
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
	 * be written again with a meaningful txg by spa_sync().
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
	 */
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   709
	if (reason == VDEV_LABEL_SPARE ||
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   710
	    (reason == VDEV_LABEL_REMOVE && vd->vdev_isspare)) {
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   711
		/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   712
		 * For inactive hot spares, we generate a special label that
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   713
		 * identifies as a mutually shared hot spare.  We write the
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   714
		 * label if we are adding a hot spare, or if we are removing an
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   715
		 * active hot spare (in which case we want to revert the
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   716
		 * labels).
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   717
		 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   718
		VERIFY(nvlist_alloc(&label, NV_UNIQUE_NAME, KM_SLEEP) == 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   720
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_VERSION,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   721
		    spa_version(spa)) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   722
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_POOL_STATE,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   723
		    POOL_STATE_SPARE) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   724
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_GUID,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   725
		    vd->vdev_guid) == 0);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   726
	} else if (reason == VDEV_LABEL_L2CACHE ||
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   727
	    (reason == VDEV_LABEL_REMOVE && vd->vdev_isl2cache)) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   728
		/*
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   729
		 * For level 2 ARC devices, add a special label.
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   730
		 */
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   731
		VERIFY(nvlist_alloc(&label, NV_UNIQUE_NAME, KM_SLEEP) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   732
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   733
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_VERSION,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   734
		    spa_version(spa)) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   735
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_POOL_STATE,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   736
		    POOL_STATE_L2CACHE) == 0);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   737
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_GUID,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   738
		    vd->vdev_guid) == 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   739
	} else {
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   740
		uint64_t txg = 0ULL;
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   741
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   742
		if (reason == VDEV_LABEL_SPLIT)
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   743
			txg = spa->spa_uberblock.ub_txg;
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 10921
diff changeset
   744
		label = spa_config_generate(spa, vd, txg, B_FALSE);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   745
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   746
		/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   747
		 * Add our creation time.  This allows us to detect multiple
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   748
		 * vdev uses as described above, and automatically expires if we
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   749
		 * fail.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   750
		 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   751
		VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_CREATE_TXG,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   752
		    crtxg) == 0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   753
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
	buf = vp->vp_nvlist;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
	buflen = sizeof (vp->vp_nvlist);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
3460
e7801868c7bc 6497211 Creating a zpool mirror with a large number of devices will core dump
mmusante
parents: 3377
diff changeset
   758
	error = nvlist_pack(label, &buf, &buflen, NV_ENCODE_XDR, KM_SLEEP);
e7801868c7bc 6497211 Creating a zpool mirror with a large number of devices will core dump
mmusante
parents: 3377
diff changeset
   759
	if (error != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
		nvlist_free(label);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
		zio_buf_free(vp, sizeof (vdev_phys_t));
3460
e7801868c7bc 6497211 Creating a zpool mirror with a large number of devices will core dump
mmusante
parents: 3377
diff changeset
   762
		/* EFAULT means nvlist_pack ran out of room */
e7801868c7bc 6497211 Creating a zpool mirror with a large number of devices will core dump
mmusante
parents: 3377
diff changeset
   763
		return (error == EFAULT ? ENAMETOOLONG : EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
	 * Initialize uberblock template.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
	 */
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9725
diff changeset
   769
	ub = zio_buf_alloc(VDEV_UBERBLOCK_RING);
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9725
diff changeset
   770
	bzero(ub, VDEV_UBERBLOCK_RING);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   771
	*ub = spa->spa_uberblock;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   772
	ub->ub_txg = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
9056
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   774
	/* Initialize the 2nd padding area. */
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   775
	pad2 = zio_buf_alloc(VDEV_PAD_SIZE);
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   776
	bzero(pad2, VDEV_PAD_SIZE);
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   777
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   778
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   779
	 * Write everything in parallel.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
	 */
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   781
retry:
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   782
	zio = zio_root(spa, NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   783
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   784
	for (int l = 0; l < VDEV_LABELS; l++) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   785
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   786
		vdev_label_write(zio, vd, l, vp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   787
		    offsetof(vdev_label_t, vl_vdev_phys),
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   788
		    sizeof (vdev_phys_t), NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   789
9056
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   790
		/*
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   791
		 * Skip the 1st padding area.
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   792
		 * Zero out the 2nd padding area where it might have
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   793
		 * left over data from previous filesystem format.
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   794
		 */
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   795
		vdev_label_write(zio, vd, l, pad2,
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   796
		    offsetof(vdev_label_t, vl_pad2),
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   797
		    VDEV_PAD_SIZE, NULL, NULL, flags);
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   798
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9725
diff changeset
   799
		vdev_label_write(zio, vd, l, ub,
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9725
diff changeset
   800
		    offsetof(vdev_label_t, vl_uberblock),
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9725
diff changeset
   801
		    VDEV_UBERBLOCK_RING, NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   804
	error = zio_wait(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   806
	if (error != 0 && !(flags & ZIO_FLAG_TRYHARD)) {
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   807
		flags |= ZIO_FLAG_TRYHARD;
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   808
		goto retry;
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   809
	}
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
   810
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   811
	nvlist_free(label);
9056
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8876
diff changeset
   812
	zio_buf_free(pad2, VDEV_PAD_SIZE);
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9725
diff changeset
   813
	zio_buf_free(ub, VDEV_UBERBLOCK_RING);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   814
	zio_buf_free(vp, sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   815
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   816
	/*
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   817
	 * If this vdev hasn't been previously identified as a spare, then we
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 3460
diff changeset
   818
	 * mark it as such only if a) we are labeling it as a spare, or b) it
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   819
	 * exists as a spare elsewhere in the system.  Do the same for
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   820
	 * level 2 ARC devices.
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   821
	 */
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   822
	if (error == 0 && !vd->vdev_isspare &&
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   823
	    (reason == VDEV_LABEL_SPARE ||
7214
04c540040a32 6721908 A hot spare "in use" in an exported zpool, is stolen when a disk fails in an imported pool.
lling
parents: 7041
diff changeset
   824
	    spa_spare_exists(vd->vdev_guid, NULL, NULL)))
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   825
		spa_spare_add(vd);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   826
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   827
	if (error == 0 && !vd->vdev_isl2cache &&
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   828
	    (reason == VDEV_LABEL_L2CACHE ||
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   829
	    spa_l2cache_exists(vd->vdev_guid, NULL)))
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   830
		spa_l2cache_add(vd);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5329
diff changeset
   831
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 2082
diff changeset
   832
	return (error);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   833
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1732
diff changeset
   834
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   835
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   836
 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   837
 * uberblock load/sync
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   838
 * ==========================================================================
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   839
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   840
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   841
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   842
 * Consider the following situation: txg is safely synced to disk.  We've
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   843
 * written the first uberblock for txg + 1, and then we lose power.  When we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   844
 * come back up, we fail to see the uberblock for txg + 1 because, say,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   845
 * it was on a mirrored device and the replica to which we wrote txg + 1
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   846
 * is now offline.  If we then make some changes and sync txg + 1, and then
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   847
 * the missing replica comes back, then for a few seconds we'll have two
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   848
 * conflicting uberblocks on disk with the same txg.  The solution is simple:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   849
 * among uberblocks with equal txg, choose the one with the latest timestamp.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   850
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   851
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   852
vdev_uberblock_compare(uberblock_t *ub1, uberblock_t *ub2)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   853
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   854
	if (ub1->ub_txg < ub2->ub_txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
		return (-1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   856
	if (ub1->ub_txg > ub2->ub_txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   857
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   858
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   859
	if (ub1->ub_timestamp < ub2->ub_timestamp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   860
		return (-1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   861
	if (ub1->ub_timestamp > ub2->ub_timestamp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   862
		return (1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   863
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   864
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   865
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   866
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   867
struct ubl_cbdata {
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   868
	uberblock_t	*ubl_ubbest;	/* Best uberblock */
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   869
	vdev_t		*ubl_vd;	/* vdev associated with the above */
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   870
	int		ubl_label;	/* Label associated with the above */
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   871
};
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   872
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
vdev_uberblock_load_done(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
{
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   876
	vdev_t *vd = zio->io_vd;
10921
8aac17999e4d PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents: 10817
diff changeset
   877
	spa_t *spa = zio->io_spa;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   878
	zio_t *rio = zio->io_private;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   879
	uberblock_t *ub = zio->io_data;
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   880
	struct ubl_cbdata *cbp = rio->io_private;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   881
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   882
	ASSERT3U(zio->io_size, ==, VDEV_UBERBLOCK_SIZE(vd));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   883
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   884
	if (zio->io_error == 0 && uberblock_verify(ub) == 0) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   885
		mutex_enter(&rio->io_lock);
10921
8aac17999e4d PSARC 2009/479 zpool recovery support
Tim Haley <Tim.Haley@Sun.COM>
parents: 10817
diff changeset
   886
		if (ub->ub_txg <= spa->spa_load_max_txg &&
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   887
		    vdev_uberblock_compare(ub, cbp->ubl_ubbest) > 0) {
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   888
			/*
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   889
			 * Keep track of the vdev and label in which this
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   890
			 * uberblock was found. We will use this information
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   891
			 * later to obtain the config nvlist associated with
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   892
			 * this uberblock.
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   893
			 */
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   894
			*cbp->ubl_ubbest = *ub;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   895
			cbp->ubl_vd = vd;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   896
			cbp->ubl_label = vdev_label_number(vd->vdev_psize,
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   897
			    zio->io_offset);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   898
		}
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   899
		mutex_exit(&rio->io_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   900
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   901
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   902
	zio_buf_free(zio->io_data, zio->io_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   903
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   904
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   905
static void
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   906
vdev_uberblock_load_impl(zio_t *zio, vdev_t *vd, int flags,
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   907
    struct ubl_cbdata *cbp)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   908
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   909
	for (int c = 0; c < vd->vdev_children; c++)
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   910
		vdev_uberblock_load_impl(zio, vd->vdev_child[c], flags, cbp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   911
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   912
	if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   913
		for (int l = 0; l < VDEV_LABELS; l++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   914
			for (int n = 0; n < VDEV_UBERBLOCK_COUNT(vd); n++) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   915
				vdev_label_read(zio, vd, l,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   916
				    zio_buf_alloc(VDEV_UBERBLOCK_SIZE(vd)),
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   917
				    VDEV_UBERBLOCK_OFFSET(vd, n),
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   918
				    VDEV_UBERBLOCK_SIZE(vd),
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   919
				    vdev_uberblock_load_done, zio, flags);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   920
			}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   921
		}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   922
	}
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   923
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   924
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   925
/*
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   926
 * Reads the 'best' uberblock from disk along with its associated
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   927
 * configuration. First, we read the uberblock array of each label of each
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   928
 * vdev, keeping track of the uberblock with the highest txg in each array.
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   929
 * Then, we read the configuration from the same label as the best uberblock.
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   930
 */
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   931
void
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   932
vdev_uberblock_load(vdev_t *rvd, uberblock_t *ub, nvlist_t **config)
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   933
{
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   934
	int i;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   935
	zio_t *zio;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   936
	spa_t *spa = rvd->vdev_spa;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   937
	struct ubl_cbdata cb;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   938
	int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL |
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   939
	    ZIO_FLAG_SPECULATIVE | ZIO_FLAG_TRYHARD;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   940
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   941
	ASSERT(ub);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   942
	ASSERT(config);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   943
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   944
	bzero(ub, sizeof (uberblock_t));
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   945
	*config = NULL;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   946
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   947
	cb.ubl_ubbest = ub;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   948
	cb.ubl_vd = NULL;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   949
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   950
	spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   951
	zio = zio_root(spa, NULL, &cb, flags);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   952
	vdev_uberblock_load_impl(zio, rvd, flags, &cb);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   953
	(void) zio_wait(zio);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   954
	if (cb.ubl_vd != NULL) {
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   955
		for (i = cb.ubl_label % 2; i < VDEV_LABELS; i += 2) {
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   956
			*config = vdev_label_read_config(cb.ubl_vd, i);
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   957
			if (*config != NULL)
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   958
				break;
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   959
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   960
	}
13700
2889e2596bd6 2619 asynchronous destruction of ZFS file systems
Christopher Siden <chris.siden@delphix.com>
parents: 13061
diff changeset
   961
	spa_config_exit(spa, SCL_ALL, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   963
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   964
/*
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   965
 * On success, increment root zio's count of good writes.
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
   966
 * We only get credit for writes to known-visible vdevs; see spa_vdev_add().
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   968
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   969
vdev_uberblock_sync_done(zio_t *zio)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   970
{
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   971
	uint64_t *good_writes = zio->io_private;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   972
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
   973
	if (zio->io_error == 0 && zio->io_vd->vdev_top->vdev_ms_array != 0)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   974
		atomic_add_64(good_writes, 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   975
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   976
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   977
/*
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   978
 * Write the uberblock to all labels of all leaves of the specified vdev.
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   979
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   980
static void
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   981
vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   982
{
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   983
	uberblock_t *ubbuf;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   984
	int n;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   985
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   986
	for (int c = 0; c < vd->vdev_children; c++)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   987
		vdev_uberblock_sync(zio, ub, vd->vdev_child[c], flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   988
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   989
	if (!vd->vdev_ops->vdev_op_leaf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   990
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   991
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
   992
	if (!vdev_writeable(vd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   993
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   994
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   995
	n = ub->ub_txg & (VDEV_UBERBLOCK_COUNT(vd) - 1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   996
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   997
	ubbuf = zio_buf_alloc(VDEV_UBERBLOCK_SIZE(vd));
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
   998
	bzero(ubbuf, VDEV_UBERBLOCK_SIZE(vd));
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1637
diff changeset
   999
	*ubbuf = *ub;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1000
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1001
	for (int l = 0; l < VDEV_LABELS; l++)
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1002
		vdev_label_write(zio, vd, l, ubbuf,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1003
		    VDEV_UBERBLOCK_OFFSET(vd, n), VDEV_UBERBLOCK_SIZE(vd),
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1004
		    vdev_uberblock_sync_done, zio->io_private,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1005
		    flags | ZIO_FLAG_DONT_PROPAGATE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1006
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1007
	zio_buf_free(ubbuf, VDEV_UBERBLOCK_SIZE(vd));
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1008
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1009
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1010
int
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1011
vdev_uberblock_sync_list(vdev_t **svd, int svdcount, uberblock_t *ub, int flags)
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1012
{
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1013
	spa_t *spa = svd[0]->vdev_spa;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1014
	zio_t *zio;
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1015
	uint64_t good_writes = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1016
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1017
	zio = zio_root(spa, NULL, &good_writes, flags);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1018
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1019
	for (int v = 0; v < svdcount; v++)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1020
		vdev_uberblock_sync(zio, ub, svd[v], flags);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1021
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1022
	(void) zio_wait(zio);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1023
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1024
	/*
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1025
	 * Flush the uberblocks to disk.  This ensures that the odd labels
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1026
	 * are no longer needed (because the new uberblocks and the even
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1027
	 * labels are safely on disk), so it is safe to overwrite them.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1028
	 */
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1029
	zio = zio_root(spa, NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1030
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1031
	for (int v = 0; v < svdcount; v++)
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1032
		zio_flush(zio, svd[v]);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1033
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1034
	(void) zio_wait(zio);
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1035
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1036
	return (good_writes >= 1 ? 0 : EIO);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1037
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1038
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1039
/*
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1040
 * On success, increment the count of good writes for our top-level vdev.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1041
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1042
static void
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1043
vdev_label_sync_done(zio_t *zio)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1044
{
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1045
	uint64_t *good_writes = zio->io_private;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1046
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
	if (zio->io_error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
		atomic_add_64(good_writes, 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1051
/*
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1052
 * If there weren't enough good writes, indicate failure to the parent.
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1053
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
static void
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1055
vdev_label_sync_top_done(zio_t *zio)
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1056
{
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1057
	uint64_t *good_writes = zio->io_private;
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1058
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1059
	if (*good_writes == 0)
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1060
		zio->io_error = EIO;
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1061
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1062
	kmem_free(good_writes, sizeof (uint64_t));
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1063
}
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1064
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1065
/*
7041
b4c5fe87fad8 6721901 uninitialized variable in zfs_fm_recv() can confuse diagnosis
eschrock
parents: 6976
diff changeset
  1066
 * We ignore errors for log and cache devices, simply free the private data.
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1067
 */
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1068
static void
7041
b4c5fe87fad8 6721901 uninitialized variable in zfs_fm_recv() can confuse diagnosis
eschrock
parents: 6976
diff changeset
  1069
vdev_label_sync_ignore_done(zio_t *zio)
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1070
{
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1071
	kmem_free(zio->io_private, sizeof (uint64_t));
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1072
}
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1073
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6615
diff changeset
  1074
/*
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1075
 * Write all even or odd labels to all leaves of the specified vdev.
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1076
 */
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1077
static void
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1078
vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1079
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1080
	nvlist_t *label;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1081
	vdev_phys_t *vp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1082
	char *buf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1083
	size_t buflen;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1084
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1085
	for (int c = 0; c < vd->vdev_children; c++)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1086
		vdev_label_sync(zio, vd->vdev_child[c], l, txg, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1087
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1088
	if (!vd->vdev_ops->vdev_op_leaf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1089
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1090
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1091
	if (!vdev_writeable(vd))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1092
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1093
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1094
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1095
	 * Generate a label describing the top-level config to which we belong.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1096
	 */
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1097
	label = spa_config_generate(vd->vdev_spa, vd, txg, B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1098
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1099
	vp = zio_buf_alloc(sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1100
	bzero(vp, sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1102
	buf = vp->vp_nvlist;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1103
	buflen = sizeof (vp->vp_nvlist);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1104
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1105
	if (nvlist_pack(label, &buf, &buflen, NV_ENCODE_XDR, KM_SLEEP) == 0) {
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1106
		for (; l < VDEV_LABELS; l += 2) {
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1107
			vdev_label_write(zio, vd, l, vp,
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1108
			    offsetof(vdev_label_t, vl_vdev_phys),
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1109
			    sizeof (vdev_phys_t),
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1110
			    vdev_label_sync_done, zio->io_private,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1111
			    flags | ZIO_FLAG_DONT_PROPAGATE);
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1112
		}
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1113
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1114
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1115
	zio_buf_free(vp, sizeof (vdev_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
	nvlist_free(label);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1117
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1118
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1119
int
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1120
vdev_label_sync_list(spa_t *spa, int l, uint64_t txg, int flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1121
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1122
	list_t *dl = &spa->spa_config_dirty_list;
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1123
	vdev_t *vd;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1124
	zio_t *zio;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1125
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1126
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1127
	/*
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1128
	 * Write the new labels to disk.
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1129
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1130
	zio = zio_root(spa, NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1131
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1132
	for (vd = list_head(dl); vd != NULL; vd = list_next(dl, vd)) {
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1133
		uint64_t *good_writes = kmem_zalloc(sizeof (uint64_t),
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1134
		    KM_SLEEP);
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
  1135
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
  1136
		ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10105
diff changeset
  1137
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1138
		zio_t *vio = zio_null(zio, spa, NULL,
7041
b4c5fe87fad8 6721901 uninitialized variable in zfs_fm_recv() can confuse diagnosis
eschrock
parents: 6976
diff changeset
  1139
		    (vd->vdev_islog || vd->vdev_aux != NULL) ?
b4c5fe87fad8 6721901 uninitialized variable in zfs_fm_recv() can confuse diagnosis
eschrock
parents: 6976
diff changeset
  1140
		    vdev_label_sync_ignore_done : vdev_label_sync_top_done,
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1141
		    good_writes, flags);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1142
		vdev_label_sync(vio, vd, l, txg, flags);
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1143
		zio_nowait(vio);
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1144
	}
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1145
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1146
	error = zio_wait(zio);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1147
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1148
	/*
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1149
	 * Flush the new labels to disk.
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1150
	 */
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1151
	zio = zio_root(spa, NULL, NULL, flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1152
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1153
	for (vd = list_head(dl); vd != NULL; vd = list_next(dl, vd))
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1154
		zio_flush(zio, vd);
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  1155
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1156
	(void) zio_wait(zio);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1157
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1158
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1159
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1160
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1161
/*
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1162
 * Sync the uberblock and any changes to the vdev configuration.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1163
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1164
 * The order of operations is carefully crafted to ensure that
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1165
 * if the system panics or loses power at any time, the state on disk
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1166
 * is still transactionally consistent.  The in-line comments below
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1167
 * describe the failure semantics at each stage.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1168
 *
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1169
 * Moreover, vdev_config_sync() is designed to be idempotent: if it fails
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1170
 * at any time, you can just call it again, and it will resume its work.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1171
 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1172
int
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1173
vdev_config_sync(vdev_t **svd, int svdcount, uint64_t txg, boolean_t tryhard)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1174
{
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1175
	spa_t *spa = svd[0]->vdev_spa;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1176
	uberblock_t *ub = &spa->spa_uberblock;
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1177
	vdev_t *vd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1178
	zio_t *zio;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1179
	int error;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1180
	int flags = ZIO_FLAG_CONFIG_WRITER | ZIO_FLAG_CANFAIL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1181
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1182
	/*
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1183
	 * Normally, we don't want to try too hard to write every label and
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1184
	 * uberblock.  If there is a flaky disk, we don't want the rest of the
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1185
	 * sync process to block while we retry.  But if we can't write a
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1186
	 * single label out, we should retry with ZIO_FLAG_TRYHARD before
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1187
	 * bailing out and declaring the pool faulted.
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1188
	 */
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1189
	if (tryhard)
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1190
		flags |= ZIO_FLAG_TRYHARD;
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9425
diff changeset
  1191
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1192
	ASSERT(ub->ub_txg <= txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1193
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1194
	/*
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1195
	 * If this isn't a resync due to I/O errors,
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1196
	 * and nothing changed in this transaction group,
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1197
	 * and the vdev configuration hasn't changed,
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1198
	 * then there's nothing to do.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
	 */
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1200
	if (ub->ub_txg < txg &&
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1201
	    uberblock_update(ub, spa->spa_root_vdev, txg) == B_FALSE &&
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1202
	    list_is_empty(&spa->spa_config_dirty_list))
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1203
		return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1205
	if (txg > spa_freeze_txg(spa))
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1206
		return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1208
	ASSERT(txg <= spa->spa_final_txg);
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1209
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1211
	 * Flush the write cache of every disk that's been written to
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
	 * in this transaction group.  This ensures that all blocks
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1213
	 * written in this txg will be committed to stable storage
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1214
	 * before any uberblock that references them.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1215
	 */
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1216
	zio = zio_root(spa, NULL, NULL, flags);
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1217
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1218
	for (vd = txg_list_head(&spa->spa_vdev_txg_list, TXG_CLEAN(txg)); vd;
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1219
	    vd = txg_list_next(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg)))
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1220
		zio_flush(zio, vd);
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1221
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1222
	(void) zio_wait(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1223
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1224
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1225
	 * Sync out the even labels (L0, L2) for every dirty vdev.  If the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1226
	 * system dies in the middle of this process, that's OK: all of the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1227
	 * even labels that made it to disk will be newer than any uberblock,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1228
	 * and will therefore be considered invalid.  The odd labels (L1, L3),
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1229
	 * which have not yet been touched, will still be valid.  We flush
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1230
	 * the new labels to disk to ensure that all even-label updates
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1231
	 * are committed to stable storage before the uberblock update.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1232
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1233
	if ((error = vdev_label_sync_list(spa, 0, txg, flags)) != 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1234
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1235
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1236
	/*
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1237
	 * Sync the uberblocks to all vdevs in svd[].
1635
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1238
	 * If the system dies in the middle of this step, there are two cases
0ab1193d47cb 6398664 zpool detach: missing argument to error message causes core dump
bonwick
parents: 1601
diff changeset
  1239
	 * to consider, and the on-disk state is consistent either way:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1240
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1241
	 * (1)	If none of the new uberblocks made it to disk, then the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1242
	 *	previous uberblock will be the newest, and the odd labels
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1243
	 *	(which had not yet been touched) will be valid with respect
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1244
	 *	to that uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1245
	 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1246
	 * (2)	If one or more new uberblocks made it to disk, then they
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1247
	 *	will be the newest, and the even labels (which had all
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1248
	 *	been successfully committed) will be valid with respect
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1249
	 *	to the new uberblocks.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1250
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1251
	if ((error = vdev_uberblock_sync_list(svd, svdcount, ub, flags)) != 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1252
		return (error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1253
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1254
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1255
	 * Sync out odd labels for every dirty vdev.  If the system dies
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1256
	 * in the middle of this process, the even labels and the new
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1257
	 * uberblocks will suffice to open the pool.  The next time
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1258
	 * the pool is opened, the first thing we'll do -- before any
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1259
	 * user data is modified -- is mark every vdev dirty so that
5688
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1260
	 * all labels will be brought up to date.  We flush the new labels
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1261
	 * to disk to ensure that all odd-label updates are committed to
c0b02c8fd2c0 6640580 spa_get_random() is insanely slow in userland
bonwick
parents: 5450
diff changeset
  1262
	 * stable storage before the next transaction group begins.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1263
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7214
diff changeset
  1264
	return (vdev_label_sync_list(spa, 1, txg, flags));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1265
}