usr/src/uts/common/fs/zfs/vdev.c
author George Wilson <George.Wilson@Sun.COM>
Wed, 28 Jul 2010 16:57:31 -0700
changeset 12961 b521d551715f
parent 12586 b118bbd65be9
child 13049 2511753a6599
permissions -rw-r--r--
6733267 Allow a pool to be imported with a missing slog 6950437 missing logzillas should not fault pool when they contain no ZIL data
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: 1199
diff changeset
     5
 * Common Development and Distribution License (the "License").
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1199
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
 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
    21
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    22
/*
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
    23
 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#include <sys/zfs_context.h>
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
    27
#include <sys/fm/fs/zfs.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/spa_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/dmu_tx.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/uberblock_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/metaslab.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/metaslab_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/space_map.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/zio.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <sys/fs/zfs.h>
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
    40
#include <sys/arc.h>
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
    41
#include <sys/zil.h>
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
    42
#include <sys/dsl_scan.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
 * Virtual device management.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
static vdev_ops_t *vdev_ops_table[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
	&vdev_root_ops,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
	&vdev_raidz_ops,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
	&vdev_mirror_ops,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
	&vdev_replacing_ops,
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
    53
	&vdev_spare_ops,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
	&vdev_disk_ops,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
	&vdev_file_ops,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
	&vdev_missing_ops,
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
    57
	&vdev_hole_ops,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
	NULL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
    61
/* maximum scrub/resilver I/O queue per leaf vdev */
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
    62
int zfs_scrub_limit = 10;
3697
5340a4d98e0b 6456888 zpool scrubbing leads to memory exhaustion and system hang
mishra
parents: 3377
diff changeset
    63
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
 * Given a vdev type, return the appropriate ops vector.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
static vdev_ops_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
vdev_getops(const char *type)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
	vdev_ops_t *ops, **opspp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
	for (opspp = vdev_ops_table; (ops = *opspp) != NULL; opspp++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
		if (strcmp(ops->vdev_op_type, type) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
	return (ops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
 * Default asize function: return the MAX of psize with the asize of
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
 * all children.  This is what's used by anything other than RAID-Z.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
uint64_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
vdev_default_asize(vdev_t *vd, uint64_t psize)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
{
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
    86
	uint64_t asize = P2ROUNDUP(psize, 1ULL << vd->vdev_top->vdev_ashift);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
	uint64_t csize;
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
    88
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
    89
	for (int c = 0; c < vd->vdev_children; c++) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
		csize = vdev_psize_to_asize(vd->vdev_child[c], psize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
		asize = MAX(asize, csize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
	return (asize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
    97
/*
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
    98
 * Get the minimum allocatable size. We define the allocatable size as
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
    99
 * the vdev's asize rounded to the nearest metaslab. This allows us to
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   100
 * replace or attach devices which don't have the same physical size but
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   101
 * can still satisfy the same number of allocations.
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   102
 */
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   103
uint64_t
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   104
vdev_get_min_asize(vdev_t *vd)
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   105
{
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   106
	vdev_t *pvd = vd->vdev_parent;
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   107
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   108
	/*
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   109
	 * The our parent is NULL (inactive spare or cache) or is the root,
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   110
	 * just return our own asize.
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   111
	 */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   112
	if (pvd == NULL)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   113
		return (vd->vdev_asize);
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   114
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   115
	/*
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   116
	 * The top-level vdev just returns the allocatable size rounded
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   117
	 * to the nearest metaslab.
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   118
	 */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   119
	if (vd == vd->vdev_top)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   120
		return (P2ALIGN(vd->vdev_asize, 1ULL << vd->vdev_ms_shift));
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   121
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   122
	/*
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   123
	 * The allocatable space for a raidz vdev is N * sizeof(smallest child),
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   124
	 * so each child must provide at least 1/Nth of its asize.
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   125
	 */
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   126
	if (pvd->vdev_ops == &vdev_raidz_ops)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   127
		return (pvd->vdev_min_asize / pvd->vdev_children);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   128
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   129
	return (pvd->vdev_min_asize);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   130
}
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   131
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   132
void
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   133
vdev_set_min_asize(vdev_t *vd)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   134
{
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   135
	vd->vdev_min_asize = vdev_get_min_asize(vd);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   136
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   137
	for (int c = 0; c < vd->vdev_children; c++)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   138
		vdev_set_min_asize(vd->vdev_child[c]);
1175
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   139
}
759d20c7e57b 6366265 attach/replace should allow a new device size at least the min of all devs in a mirror/raidz
lling
parents: 1171
diff changeset
   140
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
vdev_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
vdev_lookup_top(spa_t *spa, uint64_t vdev)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
	vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   146
	ASSERT(spa_config_held(spa, SCL_ALL, RW_READER) != 0);
5530
4ed96167d864 6354519 stack overflow in zfs due to zio pipeline
bonwick
parents: 5450
diff changeset
   147
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
   148
	if (vdev < rvd->vdev_children) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
   149
		ASSERT(rvd->vdev_child[vdev] != NULL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
		return (rvd->vdev_child[vdev]);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
   151
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
	return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
vdev_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
vdev_lookup_by_guid(vdev_t *vd, uint64_t guid)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
	vdev_t *mvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   161
	if (vd->vdev_guid == guid)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
		return (vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   164
	for (int c = 0; c < vd->vdev_children; c++)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
		if ((mvd = vdev_lookup_by_guid(vd->vdev_child[c], guid)) !=
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
		    NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
			return (mvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
	return (NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
vdev_add_child(vdev_t *pvd, vdev_t *cvd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
	size_t oldsize, newsize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
	uint64_t id = cvd->vdev_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
	vdev_t **newchild;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   179
	ASSERT(spa_config_held(cvd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
	ASSERT(cvd->vdev_parent == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
	cvd->vdev_parent = pvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
	if (pvd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
	ASSERT(id >= pvd->vdev_children || pvd->vdev_child[id] == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	oldsize = pvd->vdev_children * sizeof (vdev_t *);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
	pvd->vdev_children = MAX(pvd->vdev_children, id + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
	newsize = pvd->vdev_children * sizeof (vdev_t *);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
	newchild = kmem_zalloc(newsize, KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
	if (pvd->vdev_child != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
		bcopy(pvd->vdev_child, newchild, oldsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
		kmem_free(pvd->vdev_child, oldsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
	pvd->vdev_child = newchild;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
	pvd->vdev_child[id] = cvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
	cvd->vdev_top = (pvd->vdev_top ? pvd->vdev_top: cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
	ASSERT(cvd->vdev_top->vdev_parent->vdev_parent == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
	 * Walk up all ancestors to update guid sum.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
	for (; pvd != NULL; pvd = pvd->vdev_parent)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
		pvd->vdev_guid_sum += cvd->vdev_guid_sum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
vdev_remove_child(vdev_t *pvd, vdev_t *cvd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
	uint_t id = cvd->vdev_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
	ASSERT(cvd->vdev_parent == pvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	if (pvd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
	ASSERT(id < pvd->vdev_children);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
	ASSERT(pvd->vdev_child[id] == cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
	pvd->vdev_child[id] = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
	cvd->vdev_parent = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
	for (c = 0; c < pvd->vdev_children; c++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
		if (pvd->vdev_child[c])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
	if (c == pvd->vdev_children) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
		kmem_free(pvd->vdev_child, c * sizeof (vdev_t *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
		pvd->vdev_child = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
		pvd->vdev_children = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
	 * Walk up all ancestors to update guid sum.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
	for (; pvd != NULL; pvd = pvd->vdev_parent)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
		pvd->vdev_guid_sum -= cvd->vdev_guid_sum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
 * Remove any holes in the child array.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
vdev_compact_children(vdev_t *pvd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
	vdev_t **newchild, *cvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
	int oldc = pvd->vdev_children;
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   254
	int newc;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   256
	ASSERT(spa_config_held(pvd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   258
	for (int c = newc = 0; c < oldc; c++)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
		if (pvd->vdev_child[c])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
			newc++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
	newchild = kmem_alloc(newc * sizeof (vdev_t *), KM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   264
	for (int c = newc = 0; c < oldc; c++) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
		if ((cvd = pvd->vdev_child[c]) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
			newchild[newc] = cvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
			cvd->vdev_id = newc++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
	kmem_free(pvd->vdev_child, oldc * sizeof (vdev_t *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
	pvd->vdev_child = newchild;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
	pvd->vdev_children = newc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
 * Allocate and minimally initialize a vdev_t.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
 */
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   279
vdev_t *
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   284
	vd = kmem_zalloc(sizeof (vdev_t), KM_SLEEP);
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   285
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   286
	if (spa->spa_root_vdev == NULL) {
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   287
		ASSERT(ops == &vdev_root_ops);
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   288
		spa->spa_root_vdev = vd;
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   289
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   291
	if (guid == 0 && ops != &vdev_hole_ops) {
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   292
		if (spa->spa_root_vdev == vd) {
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   293
			/*
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   294
			 * The root vdev's guid will also be the pool guid,
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   295
			 * which must be unique among all pools.
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   296
			 */
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
   297
			guid = spa_generate_guid(NULL);
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   298
		} else {
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   299
			/*
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   300
			 * Any other vdev's guid must be unique within the pool.
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   301
			 */
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
   302
			guid = spa_generate_guid(spa);
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   303
		}
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   304
		ASSERT(!spa_guid_exists(spa_guid(spa), guid));
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   305
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
	vd->vdev_spa = spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
	vd->vdev_id = id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
	vd->vdev_guid = guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
	vd->vdev_guid_sum = guid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
	vd->vdev_ops = ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
	vd->vdev_state = VDEV_STATE_CLOSED;
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   313
	vd->vdev_ishole = (ops == &vdev_hole_ops);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
	mutex_init(&vd->vdev_dtl_lock, NULL, MUTEX_DEFAULT, NULL);
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2391
diff changeset
   316
	mutex_init(&vd->vdev_stat_lock, NULL, MUTEX_DEFAULT, NULL);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   317
	mutex_init(&vd->vdev_probe_lock, NULL, MUTEX_DEFAULT, NULL);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   318
	for (int t = 0; t < DTL_TYPES; t++) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   319
		space_map_create(&vd->vdev_dtl[t], 0, -1ULL, 0,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   320
		    &vd->vdev_dtl_lock);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   321
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
	txg_list_create(&vd->vdev_ms_list,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
	    offsetof(struct metaslab, ms_txg_node));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
	txg_list_create(&vd->vdev_dtl_list,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
	    offsetof(struct vdev, vdev_dtl_node));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
	vd->vdev_stat.vs_timestamp = gethrtime();
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   327
	vdev_queue_init(vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   328
	vdev_cache_init(vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
	return (vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
 * Allocate a new vdev.  The 'alloctype' is used to control whether we are
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
 * creating a new vdev or loading an existing one - the behavior is slightly
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
 * different for each case.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
 */
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   338
int
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   339
vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, uint_t id,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   340
    int alloctype)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
	vdev_ops_t *ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
	char *type;
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   344
	uint64_t guid = 0, islog, nparity;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   347
	ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
	if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   350
		return (EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
	if ((ops = vdev_getops(type)) == NULL)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   353
		return (EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
	 * If this is a load, get the vdev guid from the nvlist.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
	 * Otherwise, vdev_alloc_common() will generate one for us.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
	if (alloctype == VDEV_ALLOC_LOAD) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
		uint64_t label_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID, &label_id) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   363
		    label_id != id)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   364
			return (EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   366
		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) != 0)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   367
			return (EINVAL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   368
	} else if (alloctype == VDEV_ALLOC_SPARE) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   369
		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) != 0)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   370
			return (EINVAL);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
   371
	} else if (alloctype == VDEV_ALLOC_L2CACHE) {
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
   372
		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) != 0)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
   373
			return (EINVAL);
9790
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   374
	} else if (alloctype == VDEV_ALLOC_ROOTPOOL) {
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   375
		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) != 0)
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   376
			return (EINVAL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   377
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   379
	/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   380
	 * The first allocated vdev must be of type 'root'.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   381
	 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   382
	if (ops != &vdev_root_ops && spa->spa_root_vdev == NULL)
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   383
		return (EINVAL);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   384
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   385
	/*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   386
	 * Determine whether we're a log vdev.
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   387
	 */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   388
	islog = 0;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   389
	(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_IS_LOG, &islog);
5094
71a3e95fb9e2 PSARC 2007/342 Enhanced ZFS Pool Properties
lling
parents: 4944
diff changeset
   390
	if (islog && spa_version(spa) < SPA_VERSION_SLOGS)
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   391
		return (ENOTSUP);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   392
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   393
	if (ops == &vdev_hole_ops && spa_version(spa) < SPA_VERSION_HOLES)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   394
		return (ENOTSUP);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   395
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   396
	/*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   397
	 * Set the nparity property for RAID-Z vdevs.
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   398
	 */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   399
	nparity = -1ULL;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   400
	if (ops == &vdev_raidz_ops) {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   401
		if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY,
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   402
		    &nparity) == 0) {
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
   403
			if (nparity == 0 || nparity > VDEV_RAIDZ_MAXPARITY)
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   404
				return (EINVAL);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   405
			/*
10105
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   406
			 * Previous versions could only support 1 or 2 parity
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   407
			 * device.
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   408
			 */
10105
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   409
			if (nparity > 1 &&
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   410
			    spa_version(spa) < SPA_VERSION_RAIDZ2)
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   411
				return (ENOTSUP);
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   412
			if (nparity > 2 &&
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   413
			    spa_version(spa) < SPA_VERSION_RAIDZ3)
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   414
				return (ENOTSUP);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   415
		} else {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   416
			/*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   417
			 * We require the parity to be specified for SPAs that
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   418
			 * support multiple parity levels.
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   419
			 */
10105
17811c723fb4 6854612 triple-parity RAID-Z
Adam Leventhal <adam.leventhal@sun.com>
parents: 10100
diff changeset
   420
			if (spa_version(spa) >= SPA_VERSION_RAIDZ2)
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   421
				return (EINVAL);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   422
			/*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   423
			 * Otherwise, we default to 1 parity device for RAID-Z.
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   424
			 */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   425
			nparity = 1;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   426
		}
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   427
	} else {
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   428
		nparity = 0;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   429
	}
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   430
	ASSERT(nparity != -1ULL);
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   431
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
	vd = vdev_alloc_common(spa, id, guid, ops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   434
	vd->vdev_islog = islog;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   435
	vd->vdev_nparity = nparity;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   436
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
	if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &vd->vdev_path) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
		vd->vdev_path = spa_strdup(vd->vdev_path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
	if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &vd->vdev_devid) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
		vd->vdev_devid = spa_strdup(vd->vdev_devid);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   441
	if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PHYS_PATH,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   442
	    &vd->vdev_physpath) == 0)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   443
		vd->vdev_physpath = spa_strdup(vd->vdev_physpath);
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
   444
	if (nvlist_lookup_string(nv, ZPOOL_CONFIG_FRU, &vd->vdev_fru) == 0)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
   445
		vd->vdev_fru = spa_strdup(vd->vdev_fru);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   446
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   447
	/*
1171
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   448
	 * Set the whole_disk property.  If it's not specified, leave the value
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   449
	 * as -1.
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   450
	 */
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   451
	if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   452
	    &vd->vdev_wholedisk) != 0)
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   453
		vd->vdev_wholedisk = -1ULL;
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   454
b501e9f31cab 6344272 re-think how whole disks are stored
eschrock
parents: 789
diff changeset
   455
	/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   456
	 * Look for the 'not present' flag.  This will only be set if the device
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   457
	 * was not present at the time of import.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   458
	 */
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
   459
	(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
   460
	    &vd->vdev_not_present);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   461
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   462
	/*
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   463
	 * Get the alignment requirement.
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   464
	 */
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   465
	(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASHIFT, &vd->vdev_ashift);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   466
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   467
	/*
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   468
	 * Retrieve the vdev creation time.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   469
	 */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   470
	(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_CREATE_TXG,
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   471
	    &vd->vdev_crtxg);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   472
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   473
	/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
	 * If we're a top-level vdev, try to load the allocation parameters.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
	 */
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
   476
	if (parent && !parent->vdev_parent &&
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
   477
	    (alloctype == VDEV_ALLOC_LOAD || alloctype == VDEV_ALLOC_SPLIT)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_METASLAB_ARRAY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
		    &vd->vdev_ms_array);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_METASLAB_SHIFT,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   481
		    &vd->vdev_ms_shift);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   482
		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASIZE,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
		    &vd->vdev_asize);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   484
		(void) nvlist_lookup_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: 12247
diff changeset
   485
		    &vd->vdev_removing);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   488
	if (parent && !parent->vdev_parent) {
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   489
		ASSERT(alloctype == VDEV_ALLOC_LOAD ||
10982
34d62707fe9d 6898790 assertion failed: alloctype == VDEV_ALLOC_LOAD||alloctype == VDEV_ALLOC_ADD
George Wilson <George.Wilson@Sun.COM>
parents: 10974
diff changeset
   490
		    alloctype == VDEV_ALLOC_ADD ||
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
   491
		    alloctype == VDEV_ALLOC_SPLIT ||
10982
34d62707fe9d 6898790 assertion failed: alloctype == VDEV_ALLOC_LOAD||alloctype == VDEV_ALLOC_ADD
George Wilson <George.Wilson@Sun.COM>
parents: 10974
diff changeset
   492
		    alloctype == VDEV_ALLOC_ROOTPOOL);
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   493
		vd->vdev_mg = metaslab_group_create(islog ?
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   494
		    spa_log_class(spa) : spa_normal_class(spa), vd);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   495
	}
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   496
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
	/*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   498
	 * If we're a leaf vdev, try to load the DTL object and other state.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   499
	 */
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   500
	if (vd->vdev_ops->vdev_op_leaf &&
9790
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   501
	    (alloctype == VDEV_ALLOC_LOAD || alloctype == VDEV_ALLOC_L2CACHE ||
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   502
	    alloctype == VDEV_ALLOC_ROOTPOOL)) {
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   503
		if (alloctype == VDEV_ALLOC_LOAD) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   504
			(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_DTL,
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   505
			    &vd->vdev_dtl_smo.smo_object);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   506
			(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_UNSPARE,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   507
			    &vd->vdev_unspare);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   508
		}
9790
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   509
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   510
		if (alloctype == VDEV_ALLOC_ROOTPOOL) {
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   511
			uint64_t spare = 0;
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   512
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   513
			if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_IS_SPARE,
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   514
			    &spare) == 0 && spare)
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   515
				spa_spare_add(vd);
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   516
		}
e276ee006ff6 6747441 GRUB/vdev_get_bootpath, spa_get_rootconf, zpool_get_physpath should take care of spare vdev
Lin Ling <Lin.Ling@Sun.COM>
parents: 9725
diff changeset
   517
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   518
		(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_OFFLINE,
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   519
		    &vd->vdev_offline);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
   520
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   521
		/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   522
		 * When importing a pool, we want to ignore the persistent fault
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   523
		 * state, as the diagnosis made on another system may not be
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   524
		 * valid in the current context.  Local vdevs will
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   525
		 * remain in the faulted state.
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   526
		 */
11147
74e8c05021f1 6678033 resilver code should prefetch
George Wilson <George.Wilson@Sun.COM>
parents: 11146
diff changeset
   527
		if (spa_load_state(spa) == SPA_LOAD_OPEN) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   528
			(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_FAULTED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   529
			    &vd->vdev_faulted);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   530
			(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_DEGRADED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   531
			    &vd->vdev_degraded);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   532
			(void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_REMOVED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   533
			    &vd->vdev_removed);
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   534
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   535
			if (vd->vdev_faulted || vd->vdev_degraded) {
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   536
				char *aux;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   537
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   538
				vd->vdev_label_aux =
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   539
				    VDEV_AUX_ERR_EXCEEDED;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   540
				if (nvlist_lookup_string(nv,
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   541
				    ZPOOL_CONFIG_AUX_STATE, &aux) == 0 &&
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   542
				    strcmp(aux, "external") == 0)
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   543
					vd->vdev_label_aux = VDEV_AUX_EXTERNAL;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
   544
			}
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   545
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
	 * Add ourselves to the parent's list of children.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
	vdev_add_child(parent, vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   553
	*vdp = vd;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   554
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   555
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
vdev_free(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
{
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   561
	spa_t *spa = vd->vdev_spa;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   564
	 * vdev_free() implies closing the vdev first.  This is simpler than
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
	 * trying to ensure complicated semantics for all callers.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   567
	vdev_close(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   568
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   569
	ASSERT(!list_link_active(&vd->vdev_config_dirty_node));
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
   570
	ASSERT(!list_link_active(&vd->vdev_state_dirty_node));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   571
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   572
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   573
	 * Free all children.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
	 */
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   575
	for (int c = 0; c < vd->vdev_children; c++)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
		vdev_free(vd->vdev_child[c]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   577
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   578
	ASSERT(vd->vdev_child == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
	ASSERT(vd->vdev_guid_sum == vd->vdev_guid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   580
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   581
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   582
	 * Discard allocation state.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   583
	 */
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   584
	if (vd->vdev_mg != NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   585
		vdev_metaslab_fini(vd);
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   586
		metaslab_group_destroy(vd->vdev_mg);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   587
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   588
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   589
	ASSERT3U(vd->vdev_stat.vs_space, ==, 0);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   590
	ASSERT3U(vd->vdev_stat.vs_dspace, ==, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
	ASSERT3U(vd->vdev_stat.vs_alloc, ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   594
	 * Remove this vdev from its parent's child list.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   596
	vdev_remove_child(vd->vdev_parent, vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   597
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   598
	ASSERT(vd->vdev_parent == NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   599
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   600
	/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   601
	 * Clean up vdev structure.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   602
	 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   603
	vdev_queue_fini(vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   604
	vdev_cache_fini(vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   605
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   606
	if (vd->vdev_path)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   607
		spa_strfree(vd->vdev_path);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   608
	if (vd->vdev_devid)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   609
		spa_strfree(vd->vdev_devid);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   610
	if (vd->vdev_physpath)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   611
		spa_strfree(vd->vdev_physpath);
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
   612
	if (vd->vdev_fru)
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
   613
		spa_strfree(vd->vdev_fru);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   614
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   615
	if (vd->vdev_isspare)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   616
		spa_spare_remove(vd);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
   617
	if (vd->vdev_isl2cache)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
   618
		spa_l2cache_remove(vd);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   619
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   620
	txg_list_destroy(&vd->vdev_ms_list);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   621
	txg_list_destroy(&vd->vdev_dtl_list);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   622
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   623
	mutex_enter(&vd->vdev_dtl_lock);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   624
	for (int t = 0; t < DTL_TYPES; t++) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   625
		space_map_unload(&vd->vdev_dtl[t]);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   626
		space_map_destroy(&vd->vdev_dtl[t]);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   627
	}
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   628
	mutex_exit(&vd->vdev_dtl_lock);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   629
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   630
	mutex_destroy(&vd->vdev_dtl_lock);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   631
	mutex_destroy(&vd->vdev_stat_lock);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   632
	mutex_destroy(&vd->vdev_probe_lock);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   633
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   634
	if (vd == spa->spa_root_vdev)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   635
		spa->spa_root_vdev = NULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   636
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
   637
	kmem_free(vd, sizeof (vdev_t));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   638
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   639
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   640
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   641
 * Transfer top-level vdev state from svd to tvd.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   642
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   643
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
vdev_top_transfer(vdev_t *svd, vdev_t *tvd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   646
	spa_t *spa = svd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
	metaslab_t *msp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   648
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   649
	int t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
	ASSERT(tvd == tvd->vdev_top);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   652
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
	tvd->vdev_ms_array = svd->vdev_ms_array;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
	tvd->vdev_ms_shift = svd->vdev_ms_shift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
	tvd->vdev_ms_count = svd->vdev_ms_count;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   656
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   657
	svd->vdev_ms_array = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   658
	svd->vdev_ms_shift = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   659
	svd->vdev_ms_count = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   660
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   661
	tvd->vdev_mg = svd->vdev_mg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   662
	tvd->vdev_ms = svd->vdev_ms;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   664
	svd->vdev_mg = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   665
	svd->vdev_ms = NULL;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   666
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   667
	if (tvd->vdev_mg != NULL)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   668
		tvd->vdev_mg->mg_vd = tvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   669
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   670
	tvd->vdev_stat.vs_alloc = svd->vdev_stat.vs_alloc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   671
	tvd->vdev_stat.vs_space = svd->vdev_stat.vs_space;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   672
	tvd->vdev_stat.vs_dspace = svd->vdev_stat.vs_dspace;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   673
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   674
	svd->vdev_stat.vs_alloc = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
	svd->vdev_stat.vs_space = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   676
	svd->vdev_stat.vs_dspace = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   677
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   678
	for (t = 0; t < TXG_SIZE; t++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
		while ((msp = txg_list_remove(&svd->vdev_ms_list, t)) != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   680
			(void) txg_list_add(&tvd->vdev_ms_list, msp, t);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   681
		while ((vd = txg_list_remove(&svd->vdev_dtl_list, t)) != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
			(void) txg_list_add(&tvd->vdev_dtl_list, vd, t);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   683
		if (txg_list_remove_this(&spa->spa_vdev_txg_list, svd, t))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   684
			(void) txg_list_add(&spa->spa_vdev_txg_list, tvd, t);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   685
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   686
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   687
	if (list_link_active(&svd->vdev_config_dirty_node)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   688
		vdev_config_clean(svd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
		vdev_config_dirty(tvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   690
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   691
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   692
	if (list_link_active(&svd->vdev_state_dirty_node)) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   693
		vdev_state_clean(svd);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   694
		vdev_state_dirty(tvd);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   695
	}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   696
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   697
	tvd->vdev_deflate_ratio = svd->vdev_deflate_ratio;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   698
	svd->vdev_deflate_ratio = 0;
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   699
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   700
	tvd->vdev_islog = svd->vdev_islog;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
   701
	svd->vdev_islog = 0;
789
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
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
vdev_top_update(vdev_t *tvd, vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
	if (vd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   710
	vd->vdev_top = tvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   711
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   712
	for (int c = 0; c < vd->vdev_children; c++)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
		vdev_top_update(tvd, vd->vdev_child[c]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
 * Add a mirror/replacing vdev above an existing vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   718
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
vdev_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
vdev_add_parent(vdev_t *cvd, vdev_ops_t *ops)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
	spa_t *spa = cvd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   723
	vdev_t *pvd = cvd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
	vdev_t *mvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   726
	ASSERT(spa_config_held(spa, SCL_ALL, RW_WRITER) == SCL_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   727
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
	mvd = vdev_alloc_common(spa, cvd->vdev_id, 0, ops);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   729
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   730
	mvd->vdev_asize = cvd->vdev_asize;
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
   731
	mvd->vdev_min_asize = cvd->vdev_min_asize;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   732
	mvd->vdev_ashift = cvd->vdev_ashift;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   733
	mvd->vdev_state = cvd->vdev_state;
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   734
	mvd->vdev_crtxg = cvd->vdev_crtxg;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   735
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   736
	vdev_remove_child(pvd, cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   737
	vdev_add_child(pvd, mvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   738
	cvd->vdev_id = mvd->vdev_children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
	vdev_add_child(mvd, cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
	vdev_top_update(cvd->vdev_top, cvd->vdev_top);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
	if (mvd == mvd->vdev_top)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
		vdev_top_transfer(cvd, mvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
	return (mvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
 * Remove a 1-way mirror/replacing vdev from the tree.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   750
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   751
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
vdev_remove_parent(vdev_t *cvd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
	vdev_t *mvd = cvd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
	vdev_t *pvd = mvd->vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   757
	ASSERT(spa_config_held(cvd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
	ASSERT(mvd->vdev_children == 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
	ASSERT(mvd->vdev_ops == &vdev_mirror_ops ||
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   761
	    mvd->vdev_ops == &vdev_replacing_ops ||
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
   762
	    mvd->vdev_ops == &vdev_spare_ops);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   763
	cvd->vdev_ashift = mvd->vdev_ashift;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
	vdev_remove_child(mvd, cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
	vdev_remove_child(pvd, mvd);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   767
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   768
	/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   769
	 * If cvd will replace mvd as a top-level vdev, preserve mvd's guid.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   770
	 * Otherwise, we could have detached an offline device, and when we
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   771
	 * go to import the pool we'll think we have two top-level vdevs,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   772
	 * instead of a different version of the same top-level vdev.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   773
	 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   774
	if (mvd->vdev_top == mvd) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   775
		uint64_t guid_delta = mvd->vdev_guid - cvd->vdev_guid;
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
   776
		cvd->vdev_orig_guid = cvd->vdev_guid;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   777
		cvd->vdev_guid += guid_delta;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   778
		cvd->vdev_guid_sum += guid_delta;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   779
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   780
	cvd->vdev_id = mvd->vdev_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   781
	vdev_add_child(pvd, cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   782
	vdev_top_update(cvd->vdev_top, cvd->vdev_top);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   783
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   784
	if (cvd == cvd->vdev_top)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   785
		vdev_top_transfer(mvd, cvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   786
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   787
	ASSERT(mvd->vdev_children == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   788
	vdev_free(mvd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   789
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   790
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   791
int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
vdev_metaslab_init(vdev_t *vd, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   794
	spa_t *spa = vd->vdev_spa;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   795
	objset_t *mos = spa->spa_meta_objset;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   796
	uint64_t m;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   797
	uint64_t oldc = vd->vdev_ms_count;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   798
	uint64_t newc = vd->vdev_asize >> vd->vdev_ms_shift;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   799
	metaslab_t **mspp;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   800
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   801
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   802
	ASSERT(txg == 0 || spa_config_held(spa, SCL_ALLOC, RW_WRITER));
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   803
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   804
	/*
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   805
	 * This vdev is not being allocated from yet or is a hole.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   806
	 */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   807
	if (vd->vdev_ms_shift == 0)
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   808
		return (0);
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
   809
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   810
	ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
   811
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   812
	/*
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   813
	 * Compute the raidz-deflation ratio.  Note, we hard-code
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   814
	 * in 128k (1 << 17) because it is the current "typical" blocksize.
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   815
	 * Even if SPA_MAXBLOCKSIZE changes, this algorithm must never change,
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   816
	 * or we will inconsistently account for existing bp's.
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   817
	 */
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   818
	vd->vdev_deflate_ratio = (1 << 17) /
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   819
	    (vdev_psize_to_asize(vd, 1 << 17) >> SPA_MINBLOCKSHIFT);
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
   820
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   821
	ASSERT(oldc <= newc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   822
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   823
	mspp = kmem_zalloc(newc * sizeof (*mspp), KM_SLEEP);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   824
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   825
	if (oldc != 0) {
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   826
		bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp));
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   827
		kmem_free(vd->vdev_ms, oldc * sizeof (*mspp));
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   828
	}
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   829
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   830
	vd->vdev_ms = mspp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   831
	vd->vdev_ms_count = newc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   832
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   833
	for (m = oldc; m < newc; m++) {
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   834
		space_map_obj_t smo = { 0, 0, 0 };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   835
		if (txg == 0) {
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   836
			uint64_t object = 0;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   837
			error = dmu_read(mos, vd->vdev_ms_array,
9512
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9425
diff changeset
   838
			    m * sizeof (uint64_t), sizeof (uint64_t), &object,
64cafcbcc337 6801810 Commit of aligned streaming rewrites to ZIL device causes unwanted disk reads
Neil Perrin <Neil.Perrin@Sun.COM>
parents: 9425
diff changeset
   839
			    DMU_READ_PREFETCH);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   840
			if (error)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   841
				return (error);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   842
			if (object != 0) {
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   843
				dmu_buf_t *db;
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   844
				error = dmu_bonus_hold(mos, object, FTAG, &db);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   845
				if (error)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   846
					return (error);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4808
diff changeset
   847
				ASSERT3U(db->db_size, >=, sizeof (smo));
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4808
diff changeset
   848
				bcopy(db->db_data, &smo, sizeof (smo));
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   849
				ASSERT3U(smo.smo_object, ==, object);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   850
				dmu_buf_rele(db, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   851
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   852
		}
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   853
		vd->vdev_ms[m] = metaslab_init(vd->vdev_mg, &smo,
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   854
		    m << vd->vdev_ms_shift, 1ULL << vd->vdev_ms_shift, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   856
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   857
	if (txg == 0)
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   858
		spa_config_enter(spa, SCL_ALLOC, FTAG, RW_WRITER);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   859
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   860
	/*
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   861
	 * If the vdev is being removed we don't activate
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   862
	 * the metaslabs since we want to ensure that no new
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   863
	 * allocations are performed on this device.
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   864
	 */
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
   865
	if (oldc == 0 && !vd->vdev_removing)
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   866
		metaslab_group_activate(vd->vdev_mg);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   867
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   868
	if (txg == 0)
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   869
		spa_config_exit(spa, SCL_ALLOC, FTAG);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   870
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
   871
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   872
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
vdev_metaslab_fini(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   876
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   877
	uint64_t m;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   878
	uint64_t count = vd->vdev_ms_count;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   879
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   880
	if (vd->vdev_ms != NULL) {
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
   881
		metaslab_group_passivate(vd->vdev_mg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   882
		for (m = 0; m < count; m++)
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   883
			if (vd->vdev_ms[m] != NULL)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
   884
				metaslab_fini(vd->vdev_ms[m]);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   885
		kmem_free(vd->vdev_ms, count * sizeof (metaslab_t *));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   886
		vd->vdev_ms = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   887
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   888
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   889
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   890
typedef struct vdev_probe_stats {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   891
	boolean_t	vps_readable;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   892
	boolean_t	vps_writeable;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   893
	int		vps_flags;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   894
} vdev_probe_stats_t;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   895
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   896
static void
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   897
vdev_probe_done(zio_t *zio)
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   898
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   899
	spa_t *spa = zio->io_spa;
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   900
	vdev_t *vd = zio->io_vd;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   901
	vdev_probe_stats_t *vps = zio->io_private;
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   902
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   903
	ASSERT(vd->vdev_probe_zio != NULL);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   904
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   905
	if (zio->io_type == ZIO_TYPE_READ) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   906
		if (zio->io_error == 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   907
			vps->vps_readable = 1;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   908
		if (zio->io_error == 0 && spa_writeable(spa)) {
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   909
			zio_nowait(zio_write_phys(vd->vdev_probe_zio, vd,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   910
			    zio->io_offset, zio->io_size, zio->io_data,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   911
			    ZIO_CHECKSUM_OFF, vdev_probe_done, vps,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   912
			    ZIO_PRIORITY_SYNC_WRITE, vps->vps_flags, B_TRUE));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   913
		} else {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   914
			zio_buf_free(zio->io_data, zio->io_size);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   915
		}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   916
	} else if (zio->io_type == ZIO_TYPE_WRITE) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   917
		if (zio->io_error == 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   918
			vps->vps_writeable = 1;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   919
		zio_buf_free(zio->io_data, zio->io_size);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   920
	} else if (zio->io_type == ZIO_TYPE_NULL) {
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   921
		zio_t *pio;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   922
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   923
		vd->vdev_cant_read |= !vps->vps_readable;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   924
		vd->vdev_cant_write |= !vps->vps_writeable;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   925
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   926
		if (vdev_readable(vd) &&
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   927
		    (vdev_writeable(vd) || !spa_writeable(spa))) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   928
			zio->io_error = 0;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   929
		} else {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   930
			ASSERT(zio->io_error != 0);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   931
			zfs_ereport_post(FM_EREPORT_ZFS_PROBE_FAILURE,
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
   932
			    spa, vd, NULL, 0, 0);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   933
			zio->io_error = ENXIO;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   934
		}
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   935
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   936
		mutex_enter(&vd->vdev_probe_lock);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   937
		ASSERT(vd->vdev_probe_zio == zio);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   938
		vd->vdev_probe_zio = NULL;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   939
		mutex_exit(&vd->vdev_probe_lock);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   940
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   941
		while ((pio = zio_walk_parents(zio)) != NULL)
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   942
			if (!vdev_accessible(vd, pio))
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   943
				pio->io_error = ENXIO;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   944
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   945
		kmem_free(vps, sizeof (*vps));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   946
	}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   947
}
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
   948
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   949
/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   950
 * Determine whether this device is accessible by reading and writing
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   951
 * to several known locations: the pad regions of each vdev label
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   952
 * but the first (which we leave alone in case it contains a VTOC).
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   953
 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   954
zio_t *
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   955
vdev_probe(vdev_t *vd, 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: 7313
diff changeset
   956
{
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   957
	spa_t *spa = vd->vdev_spa;
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   958
	vdev_probe_stats_t *vps = NULL;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   959
	zio_t *pio;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   960
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   961
	ASSERT(vd->vdev_ops->vdev_op_leaf);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
   962
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   963
	/*
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   964
	 * Don't probe the probe.
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   965
	 */
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   966
	if (zio && (zio->io_flags & ZIO_FLAG_PROBE))
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   967
		return (NULL);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   968
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   969
	/*
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   970
	 * To prevent 'probe storms' when a device fails, we create
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   971
	 * just one probe i/o at a time.  All zios that want to probe
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   972
	 * this vdev will become parents of the probe io.
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   973
	 */
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   974
	mutex_enter(&vd->vdev_probe_lock);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   975
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   976
	if ((pio = vd->vdev_probe_zio) == NULL) {
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   977
		vps = kmem_zalloc(sizeof (*vps), KM_SLEEP);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   978
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   979
		vps->vps_flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_PROBE |
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   980
		    ZIO_FLAG_DONT_CACHE | ZIO_FLAG_DONT_AGGREGATE |
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
   981
		    ZIO_FLAG_TRYHARD;
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   982
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   983
		if (spa_config_held(spa, SCL_ZIO, RW_WRITER)) {
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   984
			/*
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   985
			 * vdev_cant_read and vdev_cant_write can only
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   986
			 * transition from TRUE to FALSE when we have the
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   987
			 * SCL_ZIO lock as writer; otherwise they can only
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   988
			 * transition from FALSE to TRUE.  This ensures that
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   989
			 * any zio looking at these values can assume that
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   990
			 * failures persist for the life of the I/O.  That's
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   991
			 * important because when a device has intermittent
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   992
			 * connectivity problems, we want to ensure that
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   993
			 * they're ascribed to the device (ENXIO) and not
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   994
			 * the zio (EIO).
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   995
			 *
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   996
			 * Since we hold SCL_ZIO as writer here, clear both
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   997
			 * values so the probe can reevaluate from first
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   998
			 * principles.
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
   999
			 */
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1000
			vps->vps_flags |= ZIO_FLAG_CONFIG_WRITER;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1001
			vd->vdev_cant_read = B_FALSE;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1002
			vd->vdev_cant_write = B_FALSE;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1003
		}
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1004
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1005
		vd->vdev_probe_zio = pio = zio_null(NULL, spa, vd,
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1006
		    vdev_probe_done, vps,
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1007
		    vps->vps_flags | ZIO_FLAG_DONT_PROPAGATE);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1008
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  1009
		/*
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  1010
		 * We can't change the vdev state in this context, so we
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  1011
		 * kick off an async task to do it on our behalf.
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  1012
		 */
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1013
		if (zio != NULL) {
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1014
			vd->vdev_probe_wanted = B_TRUE;
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1015
			spa_async_request(spa, SPA_ASYNC_PROBE);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1016
		}
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1017
	}
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1018
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1019
	if (zio != NULL)
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1020
		zio_add_child(zio, pio);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1021
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1022
	mutex_exit(&vd->vdev_probe_lock);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1023
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1024
	if (vps == NULL) {
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1025
		ASSERT(zio != NULL);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1026
		return (NULL);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1027
	}
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1028
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1029
	for (int l = 1; l < VDEV_LABELS; l++) {
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1030
		zio_nowait(zio_read_phys(pio, vd,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1031
		    vdev_label_offset(vd->vdev_psize, l,
9056
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8632
diff changeset
  1032
		    offsetof(vdev_label_t, vl_pad2)),
826e1858a846 6809691 'zpool create -f' no longer overwrites ufs infomation
Lin Ling <Lin.Ling@Sun.COM>
parents: 8632
diff changeset
  1033
		    VDEV_PAD_SIZE, zio_buf_alloc(VDEV_PAD_SIZE),
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1034
		    ZIO_CHECKSUM_OFF, vdev_probe_done, vps,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1035
		    ZIO_PRIORITY_SYNC_READ, vps->vps_flags, B_TRUE));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1036
	}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1037
8632
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1038
	if (zio == NULL)
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1039
		return (pio);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1040
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1041
	zio_nowait(pio);
36ef517870a3 6798384 It can take a village to raise a zio
Bill Moore <Bill.Moore@Sun.COM>
parents: 8241
diff changeset
  1042
	return (NULL);
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1043
}
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1044
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1045
static void
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1046
vdev_open_child(void *arg)
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1047
{
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1048
	vdev_t *vd = arg;
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1049
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1050
	vd->vdev_open_thread = curthread;
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1051
	vd->vdev_open_error = vdev_open(vd);
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1052
	vd->vdev_open_thread = NULL;
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1053
}
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1054
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1055
boolean_t
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1056
vdev_uses_zvols(vdev_t *vd)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1057
{
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1058
	if (vd->vdev_path && strncmp(vd->vdev_path, ZVOL_DIR,
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1059
	    strlen(ZVOL_DIR)) == 0)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1060
		return (B_TRUE);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1061
	for (int c = 0; c < vd->vdev_children; c++)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1062
		if (vdev_uses_zvols(vd->vdev_child[c]))
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1063
			return (B_TRUE);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1064
	return (B_FALSE);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1065
}
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1066
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1067
void
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1068
vdev_open_children(vdev_t *vd)
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1069
{
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1070
	taskq_t *tq;
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1071
	int children = vd->vdev_children;
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1072
10588
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1073
	/*
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1074
	 * in order to handle pools on top of zvols, do the opens
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1075
	 * in a single thread so that the same thread holds the
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1076
	 * spa_namespace_lock
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1077
	 */
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1078
	if (vdev_uses_zvols(vd)) {
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1079
		for (int c = 0; c < children; c++)
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1080
			vd->vdev_child[c]->vdev_open_error =
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1081
			    vdev_open(vd->vdev_child[c]);
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1082
		return;
dc03f981ea18 6438937 if 'zfs destroy' fails, it can leave a zvol device link missing
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10105
diff changeset
  1083
	}
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1084
	tq = taskq_create("vdev_open", children, minclsyspri,
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1085
	    children, children, TASKQ_PREPOPULATE);
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1086
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1087
	for (int c = 0; c < children; c++)
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1088
		VERIFY(taskq_dispatch(tq, vdev_open_child, vd->vdev_child[c],
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1089
		    TQ_SLEEP) != NULL);
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1090
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1091
	taskq_destroy(tq);
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1092
}
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1093
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1094
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1095
 * Prepare a virtual device for access.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1096
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1097
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1098
vdev_open(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1099
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1100
	spa_t *spa = vd->vdev_spa;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1101
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1102
	uint64_t osize = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1103
	uint64_t asize, psize;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1104
	uint64_t ashift = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1105
9846
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1106
	ASSERT(vd->vdev_open_thread == curthread ||
6527c7b4a92e 6566744 vdev_open() should be done in parallel
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 9816
diff changeset
  1107
	    spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1108
	ASSERT(vd->vdev_state == VDEV_STATE_CLOSED ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1109
	    vd->vdev_state == VDEV_STATE_CANT_OPEN ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1110
	    vd->vdev_state == VDEV_STATE_OFFLINE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1111
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1112
	vd->vdev_stat.vs_aux = VDEV_AUX_NONE;
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  1113
	vd->vdev_cant_read = B_FALSE;
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  1114
	vd->vdev_cant_write = B_FALSE;
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1115
	vd->vdev_min_asize = vdev_get_min_asize(vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1117
	/*
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1118
	 * If this vdev is not removed, check its fault status.  If it's
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1119
	 * faulted, bail out of the open.
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1120
	 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1121
	if (!vd->vdev_removed && vd->vdev_faulted) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1122
		ASSERT(vd->vdev_children == 0);
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1123
		ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED ||
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1124
		    vd->vdev_label_aux == VDEV_AUX_EXTERNAL);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1125
		vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED,
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1126
		    vd->vdev_label_aux);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1127
		return (ENXIO);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1128
	} else if (vd->vdev_offline) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1129
		ASSERT(vd->vdev_children == 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1130
		vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1131
		return (ENXIO);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1132
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1133
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1134
	error = vd->vdev_ops->vdev_op_open(vd, &osize, &ashift);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1135
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1136
	/*
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1137
	 * Reset the vdev_reopening flag so that we actually close
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1138
	 * the vdev on error.
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1139
	 */
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1140
	vd->vdev_reopening = B_FALSE;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1141
	if (zio_injection_enabled && error == 0)
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  1142
		error = zio_handle_device_injection(vd, NULL, ENXIO);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1143
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1144
	if (error) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1145
		if (vd->vdev_removed &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1146
		    vd->vdev_stat.vs_aux != VDEV_AUX_OPEN_FAILED)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1147
			vd->vdev_removed = B_FALSE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1148
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1149
		vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1150
		    vd->vdev_stat.vs_aux);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1151
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1152
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1153
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1154
	vd->vdev_removed = B_FALSE;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1155
10830
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1156
	/*
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1157
	 * Recheck the faulted flag now that we have confirmed that
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1158
	 * the vdev is accessible.  If we're faulted, bail.
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1159
	 */
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1160
	if (vd->vdev_faulted) {
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1161
		ASSERT(vd->vdev_children == 0);
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1162
		ASSERT(vd->vdev_label_aux == VDEV_AUX_ERR_EXCEEDED ||
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1163
		    vd->vdev_label_aux == VDEV_AUX_EXTERNAL);
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1164
		vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED,
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1165
		    vd->vdev_label_aux);
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1166
		return (ENXIO);
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1167
	}
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  1168
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1169
	if (vd->vdev_degraded) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1170
		ASSERT(vd->vdev_children == 0);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1171
		vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1172
		    VDEV_AUX_ERR_EXCEEDED);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1173
	} else {
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  1174
		vdev_set_state(vd, B_TRUE, VDEV_STATE_HEALTHY, 0);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1175
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1176
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1177
	/*
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1178
	 * For hole or missing vdevs we just return success.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1179
	 */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1180
	if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1181
		return (0);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1182
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1183
	for (int c = 0; c < vd->vdev_children; c++) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1184
		if (vd->vdev_child[c]->vdev_state != VDEV_STATE_HEALTHY) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1185
			vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1186
			    VDEV_AUX_NONE);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1187
			break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1188
		}
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1189
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1190
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1191
	osize = P2ALIGN(osize, (uint64_t)sizeof (vdev_label_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1192
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1193
	if (vd->vdev_children == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1194
		if (osize < SPA_MINDEVSIZE) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1195
			vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1196
			    VDEV_AUX_TOO_SMALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1197
			return (EOVERFLOW);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1198
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
		psize = osize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1200
		asize = osize - (VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
	} else {
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1202
		if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE -
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
		    (VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE)) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1204
			vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1205
			    VDEV_AUX_TOO_SMALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1206
			return (EOVERFLOW);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1208
		psize = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1209
		asize = osize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1211
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
	vd->vdev_psize = psize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1213
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1214
	/*
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1215
	 * Make sure the allocatable size hasn't shrunk.
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1216
	 */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1217
	if (asize < vd->vdev_min_asize) {
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1218
		vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1219
		    VDEV_AUX_BAD_LABEL);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1220
		return (EINVAL);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1221
	}
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1222
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1223
	if (vd->vdev_asize == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1224
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1225
		 * This is the first-ever open, so use the computed values.
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1226
		 * For testing purposes, a higher ashift can be requested.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1227
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1228
		vd->vdev_asize = asize;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1229
		vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1230
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1231
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1232
		 * Make sure the alignment requirement hasn't increased.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1233
		 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1234
		if (ashift > vd->vdev_top->vdev_ashift) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1235
			vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1236
			    VDEV_AUX_BAD_LABEL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1237
			return (EINVAL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1238
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1239
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1240
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1241
	/*
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1242
	 * If all children are healthy and the asize has increased,
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1243
	 * then we've experienced dynamic LUN growth.  If automatic
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1244
	 * expansion is enabled then use the additional space.
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1245
	 */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1246
	if (vd->vdev_state == VDEV_STATE_HEALTHY && asize > vd->vdev_asize &&
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1247
	    (vd->vdev_expanding || spa->spa_autoexpand))
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1248
		vd->vdev_asize = asize;
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1249
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1250
	vdev_set_min_asize(vd);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1251
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1252
	/*
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1253
	 * Ensure we can issue some IO before declaring the
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1254
	 * vdev open for business.
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1255
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1256
	if (vd->vdev_ops->vdev_op_leaf &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1257
	    (error = zio_wait(vdev_probe(vd, NULL))) != 0) {
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  1258
		vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED,
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  1259
		    VDEV_AUX_ERR_EXCEEDED);
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1260
		return (error);
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1261
	}
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1262
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  1263
	/*
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1264
	 * If a leaf vdev has a DTL, and seems healthy, then kick off a
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1265
	 * resilver.  But don't do this if we are doing a reopen for a scrub,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1266
	 * since this would just restart the scrub we are already doing.
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1267
	 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1268
	if (vd->vdev_ops->vdev_op_leaf && !spa->spa_scrub_reopen &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1269
	    vdev_resilver_needed(vd, NULL, NULL))
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1270
		spa_async_request(spa, SPA_ASYNC_RESILVER);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1271
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1272
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1273
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1274
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1275
/*
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1276
 * Called once the vdevs are all opened, this routine validates the label
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1277
 * contents.  This needs to be done before vdev_load() so that we don't
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1278
 * inadvertently do repair I/Os to the wrong device.
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1279
 *
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1280
 * This function will only return failure if one of the vdevs indicates that it
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1281
 * has since been destroyed or exported.  This is only possible if
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1282
 * /etc/zfs/zpool.cache was readonly at the time.  Otherwise, the vdev state
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1283
 * will be updated but the function will return 0.
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1284
 */
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1285
int
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1286
vdev_validate(vdev_t *vd)
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1287
{
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1288
	spa_t *spa = vd->vdev_spa;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1289
	nvlist_t *label;
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1290
	uint64_t guid = 0, top_guid;
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1291
	uint64_t state;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1292
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1293
	for (int c = 0; c < vd->vdev_children; c++)
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1294
		if (vdev_validate(vd->vdev_child[c]) != 0)
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3697
diff changeset
  1295
			return (EBADF);
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1296
2174
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
  1297
	/*
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
  1298
	 * If the device has already failed, or was marked offline, don't do
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
  1299
	 * any further validation.  Otherwise, label I/O will fail and we will
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
  1300
	 * overwrite the previous state.
73de7a781492 6433717 offline devices should not be marked persistently unavailble
eschrock
parents: 2082
diff changeset
  1301
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1302
	if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) {
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1303
		uint64_t aux_guid = 0;
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1304
		nvlist_t *nvl;
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1305
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1306
		if ((label = vdev_label_read_config(vd)) == NULL) {
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1307
			vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1308
			    VDEV_AUX_BAD_LABEL);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1309
			return (0);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1310
		}
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1311
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1312
		/*
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1313
		 * Determine if this vdev has been split off into another
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1314
		 * pool.  If so, then refuse to open it.
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1315
		 */
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1316
		if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_SPLIT_GUID,
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1317
		    &aux_guid) == 0 && aux_guid == spa_guid(spa)) {
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1318
			vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1319
			    VDEV_AUX_SPLIT_POOL);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1320
			nvlist_free(label);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1321
			return (0);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1322
		}
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1323
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1324
		if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1325
		    &guid) != 0 || guid != spa_guid(spa)) {
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1326
			vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1327
			    VDEV_AUX_CORRUPT_DATA);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1328
			nvlist_free(label);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1329
			return (0);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1330
		}
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1331
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1332
		if (nvlist_lookup_nvlist(label, ZPOOL_CONFIG_VDEV_TREE, &nvl)
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1333
		    != 0 || nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_ORIG_GUID,
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1334
		    &aux_guid) != 0)
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1335
			aux_guid = 0;
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1336
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1337
		/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1338
		 * If this vdev just became a top-level vdev because its
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1339
		 * sibling was detached, it will have adopted the parent's
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1340
		 * vdev guid -- but the label may or may not be on disk yet.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1341
		 * Fortunately, either version of the label will have the
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1342
		 * same top guid, so if we're a top-level vdev, we can
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1343
		 * safely compare to that instead.
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1344
		 *
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1345
		 * If we split this vdev off instead, then we also check the
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1346
		 * original pool's guid.  We don't want to consider the vdev
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1347
		 * corrupt if it is partway through a split operation.
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1348
		 */
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1349
		if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID,
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1350
		    &guid) != 0 ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1351
		    nvlist_lookup_uint64(label, ZPOOL_CONFIG_TOP_GUID,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1352
		    &top_guid) != 0 ||
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1353
		    ((vd->vdev_guid != guid && vd->vdev_guid != aux_guid) &&
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1354
		    (vd->vdev_guid != top_guid || vd != vd->vdev_top))) {
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1355
			vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1356
			    VDEV_AUX_CORRUPT_DATA);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1357
			nvlist_free(label);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1358
			return (0);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1359
		}
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1360
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1361
		if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1362
		    &state) != 0) {
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1363
			vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1364
			    VDEV_AUX_CORRUPT_DATA);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1365
			nvlist_free(label);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1366
			return (0);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1367
		}
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1368
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1369
		nvlist_free(label);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1370
10100
4a6965f6bef8 6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents: 10000
diff changeset
  1371
		/*
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  1372
		 * If this is a verbatim import, no need to check the
10100
4a6965f6bef8 6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents: 10000
diff changeset
  1373
		 * state of the pool.
4a6965f6bef8 6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents: 10000
diff changeset
  1374
		 */
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  1375
		if (!(spa->spa_import_flags & ZFS_IMPORT_VERBATIM) &&
11147
74e8c05021f1 6678033 resilver code should prefetch
George Wilson <George.Wilson@Sun.COM>
parents: 11146
diff changeset
  1376
		    spa_load_state(spa) == SPA_LOAD_OPEN &&
10100
4a6965f6bef8 6856634 snv_117 not booting: zfs_parse_bootfs: error2
Lin Ling <Lin.Ling@Sun.COM>
parents: 10000
diff changeset
  1377
		    state != POOL_STATE_ACTIVE)
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3697
diff changeset
  1378
			return (EBADF);
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1379
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1380
		/*
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1381
		 * If we were able to open and validate a vdev that was
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1382
		 * previously marked permanently unavailable, clear that state
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1383
		 * now.
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1384
		 */
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1385
		if (vd->vdev_not_present)
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  1386
			vd->vdev_not_present = 0;
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1387
	}
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1388
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1389
	return (0);
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1390
}
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1391
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1392
/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1393
 * Close a virtual device.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1394
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1395
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1396
vdev_close(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1397
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1398
	spa_t *spa = vd->vdev_spa;
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1399
	vdev_t *pvd = vd->vdev_parent;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1400
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1401
	ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1402
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1403
	/*
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1404
	 * If our parent is reopening, then we are as well, unless we are
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1405
	 * going offline.
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1406
	 */
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1407
	if (pvd != NULL && pvd->vdev_reopening)
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1408
		vd->vdev_reopening = (pvd->vdev_reopening && !vd->vdev_offline);
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1409
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1410
	vd->vdev_ops->vdev_op_close(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1411
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1412
	vdev_cache_purge(vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1413
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1414
	/*
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1415
	 * We record the previous state before we close it, so that if we are
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1416
	 * doing a reopen(), we don't generate FMA ereports if we notice that
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1417
	 * it's still faulted.
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1418
	 */
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1419
	vd->vdev_prevstate = vd->vdev_state;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1420
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1421
	if (vd->vdev_offline)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1422
		vd->vdev_state = VDEV_STATE_OFFLINE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1423
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1424
		vd->vdev_state = VDEV_STATE_CLOSED;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1425
	vd->vdev_stat.vs_aux = VDEV_AUX_NONE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1426
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1427
11958
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1428
void
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1429
vdev_hold(vdev_t *vd)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1430
{
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1431
	spa_t *spa = vd->vdev_spa;
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1432
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1433
	ASSERT(spa_is_root(spa));
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1434
	if (spa->spa_state == POOL_STATE_UNINITIALIZED)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1435
		return;
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1436
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1437
	for (int c = 0; c < vd->vdev_children; c++)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1438
		vdev_hold(vd->vdev_child[c]);
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1439
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1440
	if (vd->vdev_ops->vdev_op_leaf)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1441
		vd->vdev_ops->vdev_op_hold(vd);
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1442
}
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1443
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1444
void
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1445
vdev_rele(vdev_t *vd)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1446
{
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1447
	spa_t *spa = vd->vdev_spa;
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1448
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1449
	ASSERT(spa_is_root(spa));
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1450
	for (int c = 0; c < vd->vdev_children; c++)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1451
		vdev_rele(vd->vdev_child[c]);
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1452
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1453
	if (vd->vdev_ops->vdev_op_leaf)
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1454
		vd->vdev_ops->vdev_op_rele(vd);
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1455
}
575ffe1e978d 6923585 deadlock while booting OpenSolaris build 132 from mirrored rpool with removed submirror
George Wilson <George.Wilson@Sun.COM>
parents: 11815
diff changeset
  1456
10850
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1457
/*
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1458
 * Reopen all interior vdevs and any unopened leaves.  We don't actually
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1459
 * reopen leaf vdevs which had previously been opened as they might deadlock
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1460
 * on the spa_config_lock.  Instead we only obtain the leaf's physical size.
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1461
 * If the leaf has never been opened then open it, as usual.
bb29ac73664d 6840704 osol_0906 PV guests sometimes hang at login prompt
George Wilson <George.Wilson@Sun.COM>
parents: 10830
diff changeset
  1462
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1463
void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1464
vdev_reopen(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1465
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1466
	spa_t *spa = vd->vdev_spa;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1467
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1468
	ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1469
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1470
	/* set the reopening flag unless we're taking the vdev offline */
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  1471
	vd->vdev_reopening = !vd->vdev_offline;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1472
	vdev_close(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1473
	(void) vdev_open(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1474
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1475
	/*
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1476
	 * Call vdev_validate() here to make sure we have the same device.
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1477
	 * Otherwise, a device with an invalid label could be successfully
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1478
	 * opened in response to vdev_reopen().
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1479
	 */
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1480
	if (vd->vdev_aux) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1481
		(void) vdev_validate_aux(vd);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1482
		if (vdev_readable(vd) && vdev_writeable(vd) &&
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  1483
		    vd->vdev_aux == &spa->spa_l2cache &&
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1484
		    !l2arc_vdev_present(vd))
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1485
			l2arc_add_vdev(spa, vd);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1486
	} else {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1487
		(void) vdev_validate(vd);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1488
	}
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1489
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1490
	/*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1491
	 * Reassess parent vdev's health.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1492
	 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  1493
	vdev_propagate_state(vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1495
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1496
int
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1497
vdev_create(vdev_t *vd, uint64_t txg, boolean_t isreplacing)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1498
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1499
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1500
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1501
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1502
	 * Normally, partial opens (e.g. of a mirror) are allowed.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
	 * For a create, however, we want to fail the request if
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
	 * there are any components we can't open.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1505
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
	error = vdev_open(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1507
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
	if (error || vd->vdev_state != VDEV_STATE_HEALTHY) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1509
		vdev_close(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1510
		return (error ? error : ENXIO);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1511
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1512
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1513
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1514
	 * Recursively initialize all labels.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
	 */
3377
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1516
	if ((error = vdev_label_init(vd, txg, isreplacing ?
a2fa338530c1 6393525 vdev_reopen() should verify that it's still the same device
eschrock
parents: 3059
diff changeset
  1517
	    VDEV_LABEL_REPLACE : VDEV_LABEL_CREATE)) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
		vdev_close(vd);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1519
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1521
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1524
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
  1525
void
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  1526
vdev_metaslab_set_size(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1527
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1529
	 * Aim for roughly 200 metaslabs per vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1530
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1531
	vd->vdev_ms_shift = highbit(vd->vdev_asize / 200);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1532
	vd->vdev_ms_shift = MAX(vd->vdev_ms_shift, SPA_MAXBLOCKSHIFT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1533
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1534
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1535
void
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1536
vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1537
{
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1538
	ASSERT(vd == vd->vdev_top);
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1539
	ASSERT(!vd->vdev_ishole);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1540
	ASSERT(ISP2(flags));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1541
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1542
	if (flags & VDD_METASLAB)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1543
		(void) txg_list_add(&vd->vdev_ms_list, arg, txg);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1544
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1545
	if (flags & VDD_DTL)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1546
		(void) txg_list_add(&vd->vdev_dtl_list, arg, txg);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1547
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1548
	(void) txg_list_add(&vd->vdev_spa->spa_vdev_txg_list, vd, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1549
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1550
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1551
/*
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1552
 * DTLs.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1553
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1554
 * A vdev's DTL (dirty time log) is the set of transaction groups for which
11815
4d5e16e1b512 6887372 DTLs not cleared after resilver if permanent errors present
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 11422
diff changeset
  1555
 * the vdev has less than perfect replication.  There are four kinds of DTL:
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1556
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1557
 * DTL_MISSING: txgs for which the vdev has no valid copies of the data
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1558
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1559
 * DTL_PARTIAL: txgs for which data is available, but not fully replicated
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1560
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1561
 * DTL_SCRUB: the txgs that could not be repaired by the last scrub; upon
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1562
 *	scrub completion, DTL_SCRUB replaces DTL_MISSING in the range of
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1563
 *	txgs that was scrubbed.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1564
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1565
 * DTL_OUTAGE: txgs which cannot currently be read, whether due to
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1566
 *	persistent errors or just some device being offline.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1567
 *	Unlike the other three, the DTL_OUTAGE map is not generally
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1568
 *	maintained; it's only computed when needed, typically to
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1569
 *	determine whether a device can be detached.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1570
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1571
 * For leaf vdevs, DTL_MISSING and DTL_PARTIAL are identical: the device
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1572
 * either has the data or it doesn't.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1573
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1574
 * For interior vdevs such as mirror and RAID-Z the picture is more complex.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1575
 * A vdev's DTL_PARTIAL is the union of its children's DTL_PARTIALs, because
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1576
 * if any child is less than fully replicated, then so is its parent.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1577
 * A vdev's DTL_MISSING is a modified union of its children's DTL_MISSINGs,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1578
 * comprising only those txgs which appear in 'maxfaults' or more children;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1579
 * those are the txgs we don't have enough replication to read.  For example,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1580
 * double-parity RAID-Z can tolerate up to two missing devices (maxfaults == 2);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1581
 * thus, its DTL_MISSING consists of the set of txgs that appear in more than
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1582
 * two child DTL_MISSING maps.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1583
 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1584
 * It should be clear from the above that to compute the DTLs and outage maps
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1585
 * for all vdevs, it suffices to know just the leaf vdevs' DTL_MISSING maps.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1586
 * Therefore, that is all we keep on disk.  When loading the pool, or after
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1587
 * a configuration change, we generate all other DTLs from first principles.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1588
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1589
void
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1590
vdev_dtl_dirty(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1591
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1592
	space_map_t *sm = &vd->vdev_dtl[t];
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1593
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1594
	ASSERT(t < DTL_TYPES);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1595
	ASSERT(vd != vd->vdev_spa->spa_root_vdev);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1596
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
	mutex_enter(sm->sm_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1598
	if (!space_map_contains(sm, txg, size))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1599
		space_map_add(sm, txg, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1600
	mutex_exit(sm->sm_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1601
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1602
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1603
boolean_t
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1604
vdev_dtl_contains(vdev_t *vd, vdev_dtl_type_t t, uint64_t txg, uint64_t size)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1605
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1606
	space_map_t *sm = &vd->vdev_dtl[t];
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1607
	boolean_t dirty = B_FALSE;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1608
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1609
	ASSERT(t < DTL_TYPES);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1610
	ASSERT(vd != vd->vdev_spa->spa_root_vdev);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1611
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
	mutex_enter(sm->sm_lock);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1613
	if (sm->sm_space != 0)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1614
		dirty = space_map_contains(sm, txg, size);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1615
	mutex_exit(sm->sm_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
	return (dirty);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1618
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1619
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1620
boolean_t
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1621
vdev_dtl_empty(vdev_t *vd, vdev_dtl_type_t t)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1622
{
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1623
	space_map_t *sm = &vd->vdev_dtl[t];
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1624
	boolean_t empty;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1625
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1626
	mutex_enter(sm->sm_lock);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1627
	empty = (sm->sm_space == 0);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1628
	mutex_exit(sm->sm_lock);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1629
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1630
	return (empty);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1631
}
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1632
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1633
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1634
 * Reassess DTLs after a config change or scrub completion.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1635
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1636
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1637
vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, int scrub_done)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1638
{
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1639
	spa_t *spa = vd->vdev_spa;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1640
	avl_tree_t reftree;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1641
	int minref;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1642
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1643
	ASSERT(spa_config_held(spa, SCL_ALL, RW_READER) != 0);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1644
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1645
	for (int c = 0; c < vd->vdev_children; c++)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1646
		vdev_dtl_reassess(vd->vdev_child[c], txg,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1647
		    scrub_txg, scrub_done);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1648
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  1649
	if (vd == spa->spa_root_vdev || vd->vdev_ishole || vd->vdev_aux)
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1650
		return;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1651
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1652
	if (vd->vdev_ops->vdev_op_leaf) {
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  1653
		dsl_scan_t *scn = spa->spa_dsl_pool->dp_scan;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  1654
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
		mutex_enter(&vd->vdev_dtl_lock);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1656
		if (scrub_txg != 0 &&
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  1657
		    (spa->spa_scrub_started ||
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  1658
		    (scn && scn->scn_phys.scn_errors == 0))) {
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1659
			/*
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1660
			 * We completed a scrub up to scrub_txg.  If we
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1661
			 * did it without rebooting, then the scrub dtl
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1662
			 * will be valid, so excise the old region and
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1663
			 * fold in the scrub dtl.  Otherwise, leave the
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1664
			 * dtl as-is if there was an error.
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1665
			 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1666
			 * There's little trick here: to excise the beginning
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1667
			 * of the DTL_MISSING map, we put it into a reference
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1668
			 * tree and then add a segment with refcnt -1 that
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1669
			 * covers the range [0, scrub_txg).  This means
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1670
			 * that each txg in that range has refcnt -1 or 0.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1671
			 * We then add DTL_SCRUB with a refcnt of 2, so that
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1672
			 * entries in the range [0, scrub_txg) will have a
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1673
			 * positive refcnt -- either 1 or 2.  We then convert
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1674
			 * the reference tree into the new DTL_MISSING map.
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1675
			 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1676
			space_map_ref_create(&reftree);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1677
			space_map_ref_add_map(&reftree,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1678
			    &vd->vdev_dtl[DTL_MISSING], 1);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1679
			space_map_ref_add_seg(&reftree, 0, scrub_txg, -1);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1680
			space_map_ref_add_map(&reftree,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1681
			    &vd->vdev_dtl[DTL_SCRUB], 2);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1682
			space_map_ref_generate_map(&reftree,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1683
			    &vd->vdev_dtl[DTL_MISSING], 1);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1684
			space_map_ref_destroy(&reftree);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1685
		}
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1686
		space_map_vacate(&vd->vdev_dtl[DTL_PARTIAL], NULL, NULL);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1687
		space_map_walk(&vd->vdev_dtl[DTL_MISSING],
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1688
		    space_map_add, &vd->vdev_dtl[DTL_PARTIAL]);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1689
		if (scrub_done)
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1690
			space_map_vacate(&vd->vdev_dtl[DTL_SCRUB], NULL, NULL);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1691
		space_map_vacate(&vd->vdev_dtl[DTL_OUTAGE], NULL, NULL);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1692
		if (!vdev_readable(vd))
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1693
			space_map_add(&vd->vdev_dtl[DTL_OUTAGE], 0, -1ULL);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1694
		else
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1695
			space_map_walk(&vd->vdev_dtl[DTL_MISSING],
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1696
			    space_map_add, &vd->vdev_dtl[DTL_OUTAGE]);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1697
		mutex_exit(&vd->vdev_dtl_lock);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1698
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1699
		if (txg != 0)
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1700
			vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1701
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1702
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1703
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1704
	mutex_enter(&vd->vdev_dtl_lock);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1705
	for (int t = 0; t < DTL_TYPES; t++) {
10890
499786962772 6807339 spurious checksum errors when replacing a vdev
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10850
diff changeset
  1706
		/* account for child's outage in parent's missing map */
499786962772 6807339 spurious checksum errors when replacing a vdev
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10850
diff changeset
  1707
		int s = (t == DTL_MISSING) ? DTL_OUTAGE: t;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1708
		if (t == DTL_SCRUB)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1709
			continue;			/* leaf vdevs only */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1710
		if (t == DTL_PARTIAL)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1711
			minref = 1;			/* i.e. non-zero */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1712
		else if (vd->vdev_nparity != 0)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1713
			minref = vd->vdev_nparity + 1;	/* RAID-Z */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1714
		else
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1715
			minref = vd->vdev_children;	/* any kind of mirror */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1716
		space_map_ref_create(&reftree);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1717
		for (int c = 0; c < vd->vdev_children; c++) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1718
			vdev_t *cvd = vd->vdev_child[c];
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1719
			mutex_enter(&cvd->vdev_dtl_lock);
10890
499786962772 6807339 spurious checksum errors when replacing a vdev
Eric Taylor <Eric.Taylor@Sun.COM>
parents: 10850
diff changeset
  1720
			space_map_ref_add_map(&reftree, &cvd->vdev_dtl[s], 1);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1721
			mutex_exit(&cvd->vdev_dtl_lock);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1722
		}
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1723
		space_map_ref_generate_map(&reftree, &vd->vdev_dtl[t], minref);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1724
		space_map_ref_destroy(&reftree);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1725
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1726
	mutex_exit(&vd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1727
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1728
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1729
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1730
vdev_dtl_load(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1731
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1732
	spa_t *spa = vd->vdev_spa;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1733
	space_map_obj_t *smo = &vd->vdev_dtl_smo;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1734
	objset_t *mos = spa->spa_meta_objset;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1735
	dmu_buf_t *db;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1736
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1737
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1738
	ASSERT(vd->vdev_children == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1739
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1740
	if (smo->smo_object == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1741
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1742
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1743
	ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1744
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1745
	if ((error = dmu_bonus_hold(mos, smo->smo_object, FTAG, &db)) != 0)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1746
		return (error);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1747
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4808
diff changeset
  1748
	ASSERT3U(db->db_size, >=, sizeof (*smo));
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4808
diff changeset
  1749
	bcopy(db->db_data, smo, sizeof (*smo));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1750
	dmu_buf_rele(db, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1751
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1752
	mutex_enter(&vd->vdev_dtl_lock);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1753
	error = space_map_load(&vd->vdev_dtl[DTL_MISSING],
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1754
	    NULL, SM_ALLOC, smo, mos);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1755
	mutex_exit(&vd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1756
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1757
	return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1758
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1759
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1760
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1761
vdev_dtl_sync(vdev_t *vd, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1762
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1763
	spa_t *spa = vd->vdev_spa;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1764
	space_map_obj_t *smo = &vd->vdev_dtl_smo;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1765
	space_map_t *sm = &vd->vdev_dtl[DTL_MISSING];
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1766
	objset_t *mos = spa->spa_meta_objset;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1767
	space_map_t smsync;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1768
	kmutex_t smlock;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1769
	dmu_buf_t *db;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1770
	dmu_tx_t *tx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1771
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1772
	ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1773
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1774
	tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1775
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1776
	if (vd->vdev_detached) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1777
		if (smo->smo_object != 0) {
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1778
			int err = dmu_object_free(mos, smo->smo_object, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1779
			ASSERT3U(err, ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
			smo->smo_object = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
		dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1783
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1786
	if (smo->smo_object == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1787
		ASSERT(smo->smo_objsize == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1788
		ASSERT(smo->smo_alloc == 0);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1789
		smo->smo_object = dmu_object_alloc(mos,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1790
		    DMU_OT_SPACE_MAP, 1 << SPACE_MAP_BLOCKSHIFT,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1791
		    DMU_OT_SPACE_MAP_HEADER, sizeof (*smo), tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1792
		ASSERT(smo->smo_object != 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1793
		vdev_config_dirty(vd->vdev_top);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1794
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1795
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1796
	mutex_init(&smlock, NULL, MUTEX_DEFAULT, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1797
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1798
	space_map_create(&smsync, sm->sm_start, sm->sm_size, sm->sm_shift,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1799
	    &smlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1800
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1801
	mutex_enter(&smlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1802
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1803
	mutex_enter(&vd->vdev_dtl_lock);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1804
	space_map_walk(sm, space_map_add, &smsync);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1805
	mutex_exit(&vd->vdev_dtl_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1806
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1807
	space_map_truncate(smo, mos, tx);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1808
	space_map_sync(&smsync, SM_ALLOC, smo, mos, tx);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1809
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1810
	space_map_destroy(&smsync);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1811
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1812
	mutex_exit(&smlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1813
	mutex_destroy(&smlock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1814
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  1815
	VERIFY(0 == dmu_bonus_hold(mos, smo->smo_object, FTAG, &db));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1816
	dmu_buf_will_dirty(db, tx);
4944
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4808
diff changeset
  1817
	ASSERT3U(db->db_size, >=, sizeof (*smo));
96d96f8de974 6569719 panic dangling dbufs (dn=ffffffff28814d30, dbuf=ffffffff20756008)
maybee
parents: 4808
diff changeset
  1818
	bcopy(smo, db->db_data, sizeof (*smo));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1819
	dmu_buf_rele(db, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1820
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1821
	dmu_tx_commit(tx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1822
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1823
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1824
/*
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1825
 * Determine whether the specified vdev can be offlined/detached/removed
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1826
 * without losing data.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1827
 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1828
boolean_t
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1829
vdev_dtl_required(vdev_t *vd)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1830
{
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1831
	spa_t *spa = vd->vdev_spa;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1832
	vdev_t *tvd = vd->vdev_top;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1833
	uint8_t cant_read = vd->vdev_cant_read;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1834
	boolean_t required;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1835
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1836
	ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1837
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1838
	if (vd == spa->spa_root_vdev || vd == tvd)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1839
		return (B_TRUE);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1840
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1841
	/*
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1842
	 * Temporarily mark the device as unreadable, and then determine
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1843
	 * whether this results in any DTL outages in the top-level vdev.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1844
	 * If not, we can safely offline/detach/remove the device.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1845
	 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1846
	vd->vdev_cant_read = B_TRUE;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1847
	vdev_dtl_reassess(tvd, 0, 0, B_FALSE);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1848
	required = !vdev_dtl_empty(tvd, DTL_OUTAGE);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1849
	vd->vdev_cant_read = cant_read;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1850
	vdev_dtl_reassess(tvd, 0, 0, B_FALSE);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1851
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1852
	return (required);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1853
}
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1854
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1855
/*
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1856
 * Determine if resilver is needed, and if so the txg range.
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1857
 */
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1858
boolean_t
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1859
vdev_resilver_needed(vdev_t *vd, uint64_t *minp, uint64_t *maxp)
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1860
{
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1861
	boolean_t needed = B_FALSE;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1862
	uint64_t thismin = UINT64_MAX;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1863
	uint64_t thismax = 0;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1864
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1865
	if (vd->vdev_children == 0) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1866
		mutex_enter(&vd->vdev_dtl_lock);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1867
		if (vd->vdev_dtl[DTL_MISSING].sm_space != 0 &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1868
		    vdev_writeable(vd)) {
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1869
			space_seg_t *ss;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1870
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1871
			ss = avl_first(&vd->vdev_dtl[DTL_MISSING].sm_root);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1872
			thismin = ss->ss_start - 1;
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1873
			ss = avl_last(&vd->vdev_dtl[DTL_MISSING].sm_root);
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1874
			thismax = ss->ss_end;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1875
			needed = B_TRUE;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1876
		}
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1877
		mutex_exit(&vd->vdev_dtl_lock);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1878
	} else {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1879
		for (int c = 0; c < vd->vdev_children; c++) {
7046
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1880
			vdev_t *cvd = vd->vdev_child[c];
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1881
			uint64_t cmin, cmax;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1882
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1883
			if (vdev_resilver_needed(cvd, &cmin, &cmax)) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1884
				thismin = MIN(thismin, cmin);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1885
				thismax = MAX(thismax, cmax);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1886
				needed = B_TRUE;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1887
			}
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1888
		}
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1889
	}
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1890
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1891
	if (needed && minp) {
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1892
		*minp = thismin;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1893
		*maxp = thismax;
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1894
	}
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1895
	return (needed);
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1896
}
361307ae060d 6343667 scrub/resilver has to start over when a snapshot is taken
ahrens
parents: 7042
diff changeset
  1897
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1898
void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  1899
vdev_load(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1900
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1901
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1902
	 * Recursively load all children.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1903
	 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  1904
	for (int c = 0; c < vd->vdev_children; c++)
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1905
		vdev_load(vd->vdev_child[c]);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1906
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1907
	/*
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
  1908
	 * If this is a top-level vdev, initialize its metaslabs.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1909
	 */
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1910
	if (vd == vd->vdev_top && !vd->vdev_ishole &&
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1911
	    (vd->vdev_ashift == 0 || vd->vdev_asize == 0 ||
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1912
	    vdev_metaslab_init(vd, 0) != 0))
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1913
		vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1914
		    VDEV_AUX_CORRUPT_DATA);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1915
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1916
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1917
	 * If this is a leaf vdev, load its DTL.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1918
	 */
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1919
	if (vd->vdev_ops->vdev_op_leaf && vdev_dtl_load(vd) != 0)
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1920
		vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  1921
		    VDEV_AUX_CORRUPT_DATA);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1922
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1923
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1924
/*
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  1925
 * The special vdev case is used for hot spares and l2cache devices.  Its
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  1926
 * sole purpose it to set the vdev state for the associated vdev.  To do this,
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  1927
 * we make sure that we can open the underlying device, then try to read the
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  1928
 * label, and make sure that the label is sane and that it hasn't been
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  1929
 * repurposed to another pool.
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1930
 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1931
int
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  1932
vdev_validate_aux(vdev_t *vd)
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1933
{
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1934
	nvlist_t *label;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1935
	uint64_t guid, version;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1936
	uint64_t state;
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1937
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  1938
	if (!vdev_readable(vd))
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1939
		return (0);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  1940
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1941
	if ((label = vdev_label_read_config(vd)) == NULL) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1942
		vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1943
		    VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1944
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1945
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1946
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1947
	if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_VERSION, &version) != 0 ||
4577
ed36b0e652bc PSARC/2007/328 zfs upgrade
ahrens
parents: 4527
diff changeset
  1948
	    version > SPA_VERSION ||
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1949
	    nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, &guid) != 0 ||
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1950
	    guid != vd->vdev_guid ||
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1951
	    nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE, &state) != 0) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1952
		vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1953
		    VDEV_AUX_CORRUPT_DATA);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1954
		nvlist_free(label);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1955
		return (-1);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1956
	}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1957
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1958
	/*
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1959
	 * We don't actually check the pool state here.  If it's in fact in
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1960
	 * use by another pool, we update this fact on the fly when requested.
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1961
	 */
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1962
	nvlist_free(label);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1963
	return (0);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1964
}
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  1965
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1966
void
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1967
vdev_remove(vdev_t *vd, uint64_t txg)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1968
{
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1969
	spa_t *spa = vd->vdev_spa;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1970
	objset_t *mos = spa->spa_meta_objset;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1971
	dmu_tx_t *tx;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1972
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1973
	tx = dmu_tx_create_assigned(spa_get_dsl(spa), txg);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1974
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1975
	if (vd->vdev_dtl_smo.smo_object) {
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1976
		ASSERT3U(vd->vdev_dtl_smo.smo_alloc, ==, 0);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1977
		(void) dmu_object_free(mos, vd->vdev_dtl_smo.smo_object, tx);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1978
		vd->vdev_dtl_smo.smo_object = 0;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1979
	}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1980
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1981
	if (vd->vdev_ms != NULL) {
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1982
		for (int m = 0; m < vd->vdev_ms_count; m++) {
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1983
			metaslab_t *msp = vd->vdev_ms[m];
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1984
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1985
			if (msp == NULL || msp->ms_smo.smo_object == 0)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1986
				continue;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1987
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1988
			ASSERT3U(msp->ms_smo.smo_alloc, ==, 0);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1989
			(void) dmu_object_free(mos, msp->ms_smo.smo_object, tx);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1990
			msp->ms_smo.smo_object = 0;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1991
		}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1992
	}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1993
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1994
	if (vd->vdev_ms_array) {
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1995
		(void) dmu_object_free(mos, vd->vdev_ms_array, tx);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1996
		vd->vdev_ms_array = 0;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1997
		vd->vdev_ms_shift = 0;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1998
	}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  1999
	dmu_tx_commit(tx);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2000
}
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2001
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2002
void
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2003
vdev_sync_done(vdev_t *vd, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2004
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2005
	metaslab_t *msp;
11146
7e58f40bcb1c 6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents: 10982
diff changeset
  2006
	boolean_t reassess = !txg_list_empty(&vd->vdev_ms_list, TXG_CLEAN(txg));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2007
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2008
	ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2009
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2010
	while (msp = txg_list_remove(&vd->vdev_ms_list, TXG_CLEAN(txg)))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2011
		metaslab_sync_done(msp, txg);
11146
7e58f40bcb1c 6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents: 10982
diff changeset
  2012
7e58f40bcb1c 6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents: 10982
diff changeset
  2013
	if (reassess)
7e58f40bcb1c 6826241 Sync write IOPS drops dramatically during TXG sync
George Wilson <George.Wilson@Sun.COM>
parents: 10982
diff changeset
  2014
		metaslab_sync_reassess(vd->vdev_mg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2015
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2016
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2017
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2018
vdev_sync(vdev_t *vd, uint64_t txg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2019
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2020
	spa_t *spa = vd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2021
	vdev_t *lvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2022
	metaslab_t *msp;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2023
	dmu_tx_t *tx;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2024
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2025
	ASSERT(!vd->vdev_ishole);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2026
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2027
	if (vd->vdev_ms_array == 0 && vd->vdev_ms_shift != 0) {
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2028
		ASSERT(vd == vd->vdev_top);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2029
		tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2030
		vd->vdev_ms_array = dmu_object_alloc(spa->spa_meta_objset,
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2031
		    DMU_OT_OBJECT_ARRAY, 0, DMU_OT_NONE, 0, tx);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2032
		ASSERT(vd->vdev_ms_array != 0);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2033
		vdev_config_dirty(vd);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2034
		dmu_tx_commit(tx);
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2035
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2036
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2037
	/*
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2038
	 * Remove the metadata associated with this vdev once it's empty.
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2039
	 */
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2040
	if (vd->vdev_stat.vs_alloc == 0 && vd->vdev_removing)
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2041
		vdev_remove(vd, txg);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2042
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2043
	while ((msp = txg_list_remove(&vd->vdev_ms_list, txg)) != NULL) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2044
		metaslab_sync(msp, txg);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2045
		(void) txg_list_add(&vd->vdev_ms_list, msp, TXG_CLEAN(txg));
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2046
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2047
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2048
	while ((lvd = txg_list_remove(&vd->vdev_dtl_list, txg)) != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2049
		vdev_dtl_sync(lvd, txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2050
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2051
	(void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2052
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2053
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2054
uint64_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2055
vdev_psize_to_asize(vdev_t *vd, uint64_t psize)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2056
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2057
	return (vd->vdev_ops->vdev_op_asize(vd, psize));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2058
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2059
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2060
/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2061
 * Mark the given vdev faulted.  A faulted vdev behaves as if the device could
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2062
 * not be opened, and no I/O is attempted.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2063
 */
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2064
int
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2065
vdev_fault(spa_t *spa, uint64_t guid, vdev_aux_t aux)
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2066
{
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  2067
	vdev_t *vd, *tvd;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2068
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2069
	spa_vdev_state_enter(spa, SCL_NONE);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2070
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2071
	if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2072
		return (spa_vdev_state_exit(spa, NULL, ENODEV));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2073
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2074
	if (!vd->vdev_ops->vdev_op_leaf)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2075
		return (spa_vdev_state_exit(spa, NULL, ENOTSUP));
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2076
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  2077
	tvd = vd->vdev_top;
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  2078
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2079
	/*
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2080
	 * We don't directly use the aux state here, but if we do a
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2081
	 * vdev_reopen(), we need this value to be present to remember why we
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2082
	 * were faulted.
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2083
	 */
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2084
	vd->vdev_label_aux = aux;
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2085
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2086
	/*
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2087
	 * Faulted state takes precedence over degraded.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2088
	 */
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2089
	vd->vdev_delayed_close = B_FALSE;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2090
	vd->vdev_faulted = 1ULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2091
	vd->vdev_degraded = 0ULL;
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2092
	vdev_set_state(vd, B_FALSE, VDEV_STATE_FAULTED, aux);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2093
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2094
	/*
11982
16e28ad89250 6932959 ZFS allows too many devices to be faulted
George Wilson <George.Wilson@Sun.COM>
parents: 11958
diff changeset
  2095
	 * If this device has the only valid copy of the data, then
16e28ad89250 6932959 ZFS allows too many devices to be faulted
George Wilson <George.Wilson@Sun.COM>
parents: 11958
diff changeset
  2096
	 * back off and simply mark the vdev as degraded instead.
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2097
	 */
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  2098
	if (!tvd->vdev_islog && vd->vdev_aux == NULL && vdev_dtl_required(vd)) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2099
		vd->vdev_degraded = 1ULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2100
		vd->vdev_faulted = 0ULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2101
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2102
		/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2103
		 * If we reopen the device and it's not dead, only then do we
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2104
		 * mark it degraded.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2105
		 */
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  2106
		vdev_reopen(tvd);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2107
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2108
		if (vdev_readable(vd))
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2109
			vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, aux);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2110
	}
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2111
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2112
	return (spa_vdev_state_exit(spa, vd, 0));
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2113
}
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2114
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2115
/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2116
 * Mark the given vdev degraded.  A degraded vdev is purely an indication to the
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2117
 * user that something is wrong.  The vdev continues to operate as normal as far
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2118
 * as I/O is concerned.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2119
 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2120
int
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2121
vdev_degrade(spa_t *spa, uint64_t guid, vdev_aux_t aux)
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2122
{
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2123
	vdev_t *vd;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2124
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2125
	spa_vdev_state_enter(spa, SCL_NONE);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2126
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2127
	if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2128
		return (spa_vdev_state_exit(spa, NULL, ENODEV));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2129
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2130
	if (!vd->vdev_ops->vdev_op_leaf)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2131
		return (spa_vdev_state_exit(spa, NULL, ENOTSUP));
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2132
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2133
	/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2134
	 * If the vdev is already faulted, then don't do anything.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2135
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2136
	if (vd->vdev_faulted || vd->vdev_degraded)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2137
		return (spa_vdev_state_exit(spa, NULL, 0));
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2138
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2139
	vd->vdev_degraded = 1ULL;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2140
	if (!vdev_is_dead(vd))
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2141
		vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED,
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2142
		    aux);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2143
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2144
	return (spa_vdev_state_exit(spa, vd, 0));
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2145
}
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2146
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2147
/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2148
 * Online the given vdev.  If 'unspare' is set, it implies two things.  First,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2149
 * any attached spare device should be detached when the device finishes
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2150
 * resilvering.  Second, the online should be treated like a 'test' online case,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2151
 * so no FMA events are generated if the device fails to open.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2152
 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2153
int
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2154
vdev_online(spa_t *spa, uint64_t guid, uint64_t flags, vdev_state_t *newstate)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2155
{
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2156
	vdev_t *vd, *tvd, *pvd, *rvd = spa->spa_root_vdev;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2157
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2158
	spa_vdev_state_enter(spa, SCL_NONE);
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1199
diff changeset
  2159
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2160
	if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2161
		return (spa_vdev_state_exit(spa, NULL, ENODEV));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2162
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
  2163
	if (!vd->vdev_ops->vdev_op_leaf)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2164
		return (spa_vdev_state_exit(spa, NULL, ENOTSUP));
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
  2165
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2166
	tvd = vd->vdev_top;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2167
	vd->vdev_offline = B_FALSE;
1485
e971e58d18f6 6322005 support for persistent offline
lling
parents: 1199
diff changeset
  2168
	vd->vdev_tmpoffline = B_FALSE;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2169
	vd->vdev_checkremove = !!(flags & ZFS_ONLINE_CHECKREMOVE);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2170
	vd->vdev_forcefault = !!(flags & ZFS_ONLINE_FORCEFAULT);
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2171
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2172
	/* XXX - L2ARC 1.0 does not support expansion */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2173
	if (!vd->vdev_aux) {
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2174
		for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2175
			pvd->vdev_expanding = !!(flags & ZFS_ONLINE_EXPAND);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2176
	}
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2177
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2178
	vdev_reopen(tvd);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2179
	vd->vdev_checkremove = vd->vdev_forcefault = B_FALSE;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2180
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2181
	if (!vd->vdev_aux) {
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2182
		for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2183
			pvd->vdev_expanding = B_FALSE;
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2184
	}
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2185
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2186
	if (newstate)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2187
		*newstate = vd->vdev_state;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2188
	if ((flags & ZFS_ONLINE_UNSPARE) &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2189
	    !vdev_is_dead(vd) && vd->vdev_parent &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2190
	    vd->vdev_parent->vdev_ops == &vdev_spare_ops &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2191
	    vd->vdev_parent->vdev_child[0] == vd)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2192
		vd->vdev_unspare = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2193
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2194
	if ((flags & ZFS_ONLINE_EXPAND) || spa->spa_autoexpand) {
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2195
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2196
		/* XXX - L2ARC 1.0 does not support expansion */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2197
		if (vd->vdev_aux)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2198
			return (spa_vdev_state_exit(spa, vd, ENOTSUP));
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2199
		spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2200
	}
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2201
	return (spa_vdev_state_exit(spa, vd, 0));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2202
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2203
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2204
static int
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2205
vdev_offline_locked(spa_t *spa, uint64_t guid, uint64_t flags)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2206
{
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2207
	vdev_t *vd, *tvd;
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2208
	int error = 0;
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2209
	uint64_t generation;
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2210
	metaslab_group_t *mg;
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2211
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2212
top:
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2213
	spa_vdev_state_enter(spa, SCL_ALLOC);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2214
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2215
	if ((vd = spa_lookup_by_guid(spa, guid, B_TRUE)) == NULL)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2216
		return (spa_vdev_state_exit(spa, NULL, ENODEV));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2217
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
  2218
	if (!vd->vdev_ops->vdev_op_leaf)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2219
		return (spa_vdev_state_exit(spa, NULL, ENOTSUP));
1585
4ad213e858a9 6395480 ztest ASSERT: rbt.bt_objset == wbt.bt_objset, line 2041
bonwick
parents: 1544
diff changeset
  2220
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2221
	tvd = vd->vdev_top;
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2222
	mg = tvd->vdev_mg;
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2223
	generation = spa->spa_config_generation + 1;
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2224
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2225
	/*
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2226
	 * If the device isn't already offline, try to offline it.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2227
	 */
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2228
	if (!vd->vdev_offline) {
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2229
		/*
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2230
		 * If this device has the only valid copy of some data,
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2231
		 * don't allow it to be offlined. Log devices are always
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2232
		 * expendable.
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2233
		 */
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2234
		if (!tvd->vdev_islog && vd->vdev_aux == NULL &&
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2235
		    vdev_dtl_required(vd))
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2236
			return (spa_vdev_state_exit(spa, NULL, EBUSY));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2237
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2238
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2239
		 * If the top-level is a slog and it has had allocations
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2240
		 * then proceed.  We check that the vdev's metaslab group
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2241
		 * is not NULL since it's possible that we may have just
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2242
		 * added this vdev but not yet initialized its metaslabs.
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2243
		 */
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2244
		if (tvd->vdev_islog && mg != NULL) {
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2245
			/*
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2246
			 * Prevent any future allocations.
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2247
			 */
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2248
			metaslab_group_passivate(mg);
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2249
			(void) spa_vdev_state_exit(spa, vd, 0);
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2250
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  2251
			error = spa_offline_log(spa);
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2252
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2253
			spa_vdev_state_enter(spa, SCL_ALLOC);
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2254
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2255
			/*
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2256
			 * Check to see if the config has changed.
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2257
			 */
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2258
			if (error || generation != spa->spa_config_generation) {
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2259
				metaslab_group_activate(mg);
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2260
				if (error)
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2261
					return (spa_vdev_state_exit(spa,
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2262
					    vd, error));
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2263
				(void) spa_vdev_state_exit(spa, vd, 0);
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2264
				goto top;
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2265
			}
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2266
			ASSERT3U(tvd->vdev_stat.vs_alloc, ==, 0);
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2267
		}
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2268
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2269
		/*
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2270
		 * Offline this device and reopen its top-level vdev.
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2271
		 * If the top-level vdev is a log device then just offline
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2272
		 * it. Otherwise, if this action results in the top-level
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2273
		 * vdev becoming unusable, undo it and fail the request.
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2274
		 */
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2275
		vd->vdev_offline = B_TRUE;
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2276
		vdev_reopen(tvd);
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2277
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2278
		if (!tvd->vdev_islog && vd->vdev_aux == NULL &&
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2279
		    vdev_is_dead(tvd)) {
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2280
			vd->vdev_offline = B_FALSE;
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2281
			vdev_reopen(tvd);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2282
			return (spa_vdev_state_exit(spa, NULL, EBUSY));
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2283
		}
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2284
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2285
		/*
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2286
		 * Add the device back into the metaslab rotor so that
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2287
		 * once we online the device it's open for business.
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2288
		 */
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2289
		if (tvd->vdev_islog && mg != NULL)
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2290
			metaslab_group_activate(mg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2291
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2292
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2293
	vd->vdev_tmpoffline = !!(flags & ZFS_OFFLINE_TEMPORARY);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1631
diff changeset
  2294
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2295
	return (spa_vdev_state_exit(spa, vd, 0));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2296
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2297
10974
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2298
int
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2299
vdev_offline(spa_t *spa, uint64_t guid, uint64_t flags)
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2300
{
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2301
	int error;
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2302
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2303
	mutex_enter(&spa->spa_vdev_top_lock);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2304
	error = vdev_offline_locked(spa, guid, flags);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2305
	mutex_exit(&spa->spa_vdev_top_lock);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2306
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2307
	return (error);
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2308
}
32d689ba6466 6897958 ASSERT in metaslab_class_space_update() with 8+ exabyte pool
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10922
diff changeset
  2309
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2310
/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2311
 * Clear the error counts associated with this vdev.  Unlike vdev_online() and
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2312
 * vdev_offline(), we assume the spa config is locked.  We also clear all
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2313
 * children.  If 'vd' is NULL, then the user wants to clear all vdevs.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2314
 */
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2315
void
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2316
vdev_clear(spa_t *spa, vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2317
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2318
	vdev_t *rvd = spa->spa_root_vdev;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2319
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2320
	ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2321
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2322
	if (vd == NULL)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2323
		vd = rvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2324
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2325
	vd->vdev_stat.vs_read_errors = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2326
	vd->vdev_stat.vs_write_errors = 0;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2327
	vd->vdev_stat.vs_checksum_errors = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2328
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2329
	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: 7313
diff changeset
  2330
		vdev_clear(spa, vd->vdev_child[c]);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2331
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2332
	/*
6959
f223e134ee61 6700920 vdev_clear() needs some polishing
ek110237
parents: 6643
diff changeset
  2333
	 * If we're in the FAULTED state or have experienced failed I/O, then
f223e134ee61 6700920 vdev_clear() needs some polishing
ek110237
parents: 6643
diff changeset
  2334
	 * clear the persistent state and attempt to reopen the device.  We
f223e134ee61 6700920 vdev_clear() needs some polishing
ek110237
parents: 6643
diff changeset
  2335
	 * also mark the vdev config dirty, so that the new faulted state is
f223e134ee61 6700920 vdev_clear() needs some polishing
ek110237
parents: 6643
diff changeset
  2336
	 * written out to disk.
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2337
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2338
	if (vd->vdev_faulted || vd->vdev_degraded ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2339
	    !vdev_readable(vd) || !vdev_writeable(vd)) {
6959
f223e134ee61 6700920 vdev_clear() needs some polishing
ek110237
parents: 6643
diff changeset
  2340
10830
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2341
		/*
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2342
		 * When reopening in reponse to a clear event, it may be due to
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2343
		 * a fmadm repair request.  In this case, if the device is
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2344
		 * still broken, we want to still post the ereport again.
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2345
		 */
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2346
		vd->vdev_forcefault = B_TRUE;
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2347
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  2348
		vd->vdev_faulted = vd->vdev_degraded = 0ULL;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2349
		vd->vdev_cant_read = B_FALSE;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2350
		vd->vdev_cant_write = B_FALSE;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2351
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2352
		vdev_reopen(vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2353
10830
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2354
		vd->vdev_forcefault = B_FALSE;
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2355
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2356
		if (vd != rvd)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2357
			vdev_state_dirty(vd->vdev_top);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2358
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2359
		if (vd->vdev_aux == NULL && !vdev_is_dead(vd))
4808
63629eaeb41a 6498144 ::kmastat could be even easier to read
ek110237
parents: 4577
diff changeset
  2360
			spa_async_request(spa, SPA_ASYNC_RESILVER);
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2361
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2362
		spa_event_notify(spa, vd, ESC_ZFS_VDEV_CLEAR);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2363
	}
10830
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2364
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2365
	/*
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2366
	 * When clearing a FMA-diagnosed fault, we always want to
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2367
	 * unspare the device, as we assume that the original spare was
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2368
	 * done in response to the FMA fault.
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2369
	 */
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2370
	if (!vdev_is_dead(vd) && vd->vdev_parent != NULL &&
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2371
	    vd->vdev_parent->vdev_ops == &vdev_spare_ops &&
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2372
	    vd->vdev_parent->vdev_child[0] == vd)
dd88d8700b3e 6893087 removing and inserting a faulted vdev clears faulted state
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10817
diff changeset
  2373
		vd->vdev_unspare = B_TRUE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2374
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2375
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2376
boolean_t
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2377
vdev_is_dead(vdev_t *vd)
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  2378
{
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2379
	/*
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2380
	 * Holes and missing devices are always considered "dead".
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2381
	 * This simplifies the code since we don't have to check for
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2382
	 * these types of devices in the various code paths.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2383
	 * Instead we rely on the fact that we skip over dead devices
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2384
	 * before issuing I/O to them.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2385
	 */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2386
	return (vd->vdev_state < VDEV_STATE_DEGRADED || vd->vdev_ishole ||
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2387
	    vd->vdev_ops == &vdev_missing_ops);
5329
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  2388
}
33cb98223b2d PSARC 2007/567 zpool failmode property
gw25295
parents: 5094
diff changeset
  2389
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2390
boolean_t
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2391
vdev_readable(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2392
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2393
	return (!vdev_is_dead(vd) && !vd->vdev_cant_read);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2394
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2395
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2396
boolean_t
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2397
vdev_writeable(vdev_t *vd)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2398
{
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2399
	return (!vdev_is_dead(vd) && !vd->vdev_cant_write);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2400
}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2401
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2402
boolean_t
7980
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2403
vdev_allocatable(vdev_t *vd)
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2404
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2405
	uint64_t state = vd->vdev_state;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2406
7980
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2407
	/*
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2408
	 * We currently allow allocations from vdevs which may be in the
7980
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2409
	 * process of reopening (i.e. VDEV_STATE_CLOSED). If the device
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2410
	 * fails to reopen then we'll catch it later when we're holding
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2411
	 * the proper locks.  Note that we have to get the vdev state
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2412
	 * in a local variable because although it changes atomically,
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2413
	 * we're asking two separate questions about it.
7980
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2414
	 */
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2415
	return (!(state < VDEV_STATE_DEGRADED && state != VDEV_STATE_CLOSED) &&
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2416
	    !vd->vdev_cant_write && !vd->vdev_ishole);
7980
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2417
}
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2418
589f37f25048 6764914 vdev_reopen() can lead to failed allocations
George Wilson <George.Wilson@Sun.COM>
parents: 7881
diff changeset
  2419
boolean_t
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2420
vdev_accessible(vdev_t *vd, zio_t *zio)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2421
{
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2422
	ASSERT(zio->io_vd == vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2423
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2424
	if (vdev_is_dead(vd) || vd->vdev_remove_wanted)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2425
		return (B_FALSE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2426
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2427
	if (zio->io_type == ZIO_TYPE_READ)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2428
		return (!vd->vdev_cant_read);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2429
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2430
	if (zio->io_type == ZIO_TYPE_WRITE)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2431
		return (!vd->vdev_cant_write);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2432
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2433
	return (B_TRUE);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2434
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2435
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2436
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2437
 * Get statistics for the given vdev.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2438
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2439
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2440
vdev_get_stats(vdev_t *vd, vdev_stat_t *vs)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2441
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2442
	vdev_t *rvd = vd->vdev_spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2443
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2444
	mutex_enter(&vd->vdev_stat_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2445
	bcopy(&vd->vdev_stat, vs, sizeof (*vs));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2446
	vs->vs_timestamp = gethrtime() - vs->vs_timestamp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2447
	vs->vs_state = vd->vdev_state;
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2448
	vs->vs_rsize = vdev_get_min_asize(vd);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2449
	if (vd->vdev_ops->vdev_op_leaf)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2450
		vs->vs_rsize += VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2451
	mutex_exit(&vd->vdev_stat_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2452
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2453
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2454
	 * If we're getting stats on the root vdev, aggregate the I/O counts
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2455
	 * over all top-level vdevs (i.e. the direct children of the root).
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2456
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2457
	if (vd == rvd) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2458
		for (int c = 0; c < rvd->vdev_children; c++) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2459
			vdev_t *cvd = rvd->vdev_child[c];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2460
			vdev_stat_t *cvs = &cvd->vdev_stat;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2461
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2462
			mutex_enter(&vd->vdev_stat_lock);
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2463
			for (int t = 0; t < ZIO_TYPES; t++) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2464
				vs->vs_ops[t] += cvs->vs_ops[t];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2465
				vs->vs_bytes[t] += cvs->vs_bytes[t];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2466
			}
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2467
			cvs->vs_scan_removing = cvd->vdev_removing;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2468
			mutex_exit(&vd->vdev_stat_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2469
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2470
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2471
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2472
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2473
void
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2474
vdev_clear_stats(vdev_t *vd)
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2475
{
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2476
	mutex_enter(&vd->vdev_stat_lock);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2477
	vd->vdev_stat.vs_space = 0;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2478
	vd->vdev_stat.vs_dspace = 0;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2479
	vd->vdev_stat.vs_alloc = 0;
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2480
	mutex_exit(&vd->vdev_stat_lock);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2481
}
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2482
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2483
void
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2484
vdev_scan_stat_init(vdev_t *vd)
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2485
{
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2486
	vdev_stat_t *vs = &vd->vdev_stat;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2487
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2488
	for (int c = 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: 12247
diff changeset
  2489
		vdev_scan_stat_init(vd->vdev_child[c]);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2490
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2491
	mutex_enter(&vd->vdev_stat_lock);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2492
	vs->vs_scan_processed = 0;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2493
	mutex_exit(&vd->vdev_stat_lock);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2494
}
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2495
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2496
void
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2497
vdev_stat_update(zio_t *zio, uint64_t psize)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2498
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2499
	spa_t *spa = zio->io_spa;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2500
	vdev_t *rvd = spa->spa_root_vdev;
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2501
	vdev_t *vd = zio->io_vd ? zio->io_vd : rvd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2502
	vdev_t *pvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2503
	uint64_t txg = zio->io_txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2504
	vdev_stat_t *vs = &vd->vdev_stat;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2505
	zio_type_t type = zio->io_type;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2506
	int flags = zio->io_flags;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2507
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2508
	/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2509
	 * If this i/o is a gang leader, it didn't do any actual work.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2510
	 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2511
	if (zio->io_gang_tree)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2512
		return;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2513
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2514
	if (zio->io_error == 0) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2515
		/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2516
		 * If this is a root i/o, don't count it -- we've already
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2517
		 * counted the top-level vdevs, and vdev_get_stats() will
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2518
		 * aggregate them when asked.  This reduces contention on
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2519
		 * the root vdev_stat_lock and implicitly handles blocks
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2520
		 * that compress away to holes, for which there is no i/o.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2521
		 * (Holes never create vdev children, so all the counters
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2522
		 * remain zero, which is what we want.)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2523
		 *
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2524
		 * Note: this only applies to successful i/o (io_error == 0)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2525
		 * because unlike i/o counts, errors are not additive.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2526
		 * When reading a ditto block, for example, failure of
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2527
		 * one top-level vdev does not imply a root-level error.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2528
		 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2529
		if (vd == rvd)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2530
			return;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2531
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2532
		ASSERT(vd == zio->io_vd);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2533
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2534
		if (flags & ZIO_FLAG_IO_BYPASS)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2535
			return;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2536
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2537
		mutex_enter(&vd->vdev_stat_lock);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2538
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2539
		if (flags & ZIO_FLAG_IO_REPAIR) {
12586
b118bbd65be9 6494473 ZFS needs a way to slow down resilvering
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
  2540
			if (flags & ZIO_FLAG_SCAN_THREAD) {
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2541
				dsl_scan_phys_t *scn_phys =
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2542
				    &spa->spa_dsl_pool->dp_scan->scn_phys;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2543
				uint64_t *processed = &scn_phys->scn_processed;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2544
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2545
				/* XXX cleanup? */
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2546
				if (vd->vdev_ops->vdev_op_leaf)
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2547
					atomic_add_64(processed, psize);
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2548
				vs->vs_scan_processed += psize;
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2549
			}
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2550
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2551
			if (flags & ZIO_FLAG_SELF_HEAL)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2552
				vs->vs_self_healed += psize;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2553
		}
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2554
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2555
		vs->vs_ops[type]++;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2556
		vs->vs_bytes[type] += psize;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2557
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2558
		mutex_exit(&vd->vdev_stat_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2559
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2560
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2561
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2562
	if (flags & ZIO_FLAG_SPECULATIVE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2563
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2564
9725
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2565
	/*
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2566
	 * If this is an I/O error that is going to be retried, then ignore the
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2567
	 * error.  Otherwise, the user may interpret B_FAILFAST I/O errors as
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2568
	 * hard errors, when in reality they can happen for any number of
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2569
	 * innocuous reasons (bus resets, MPxIO link failure, etc).
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2570
	 */
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2571
	if (zio->io_error == EIO &&
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2572
	    !(zio->io_flags & ZIO_FLAG_IO_RETRY))
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2573
		return;
0bf7402e8022 6843014 ZFS B_FAILFAST handling is broken
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9701
diff changeset
  2574
10685
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2575
	/*
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2576
	 * Intent logs writes won't propagate their error to the root
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2577
	 * I/O so don't mark these types of failures as pool-level
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2578
	 * errors.
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2579
	 */
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2580
	if (zio->io_vd == NULL && (zio->io_flags & ZIO_FLAG_DONT_PROPAGATE))
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2581
		return;
931790026ac6 6846163 ZFS continues to use faulted logzilla, bringing system to a crawl
George Wilson <George.Wilson@Sun.COM>
parents: 10594
diff changeset
  2582
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2583
	mutex_enter(&vd->vdev_stat_lock);
9230
e4561e3eb1ef 6821169 offlining a device results in checksum errors
George Wilson <George.Wilson@Sun.COM>
parents: 9056
diff changeset
  2584
	if (type == ZIO_TYPE_READ && !vdev_is_dead(vd)) {
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2585
		if (zio->io_error == ECKSUM)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2586
			vs->vs_checksum_errors++;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2587
		else
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2588
			vs->vs_read_errors++;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2589
	}
9230
e4561e3eb1ef 6821169 offlining a device results in checksum errors
George Wilson <George.Wilson@Sun.COM>
parents: 9056
diff changeset
  2590
	if (type == ZIO_TYPE_WRITE && !vdev_is_dead(vd))
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2591
		vs->vs_write_errors++;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2592
	mutex_exit(&vd->vdev_stat_lock);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2593
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2594
	if (type == ZIO_TYPE_WRITE && txg != 0 &&
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2595
	    (!(flags & ZIO_FLAG_IO_REPAIR) ||
12586
b118bbd65be9 6494473 ZFS needs a way to slow down resilvering
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
  2596
	    (flags & ZIO_FLAG_SCAN_THREAD) ||
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2597
	    spa->spa_claiming)) {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2598
		/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2599
		 * This is either a normal write (not a repair), or it's
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2600
		 * a repair induced by the scrub thread, or it's a repair
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2601
		 * made by zil_claim() during spa_load() in the first txg.
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2602
		 * In the normal case, we commit the DTL change in the same
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2603
		 * txg as the block was born.  In the scrub-induced repair
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2604
		 * case, we know that scrubs run in first-pass syncing context,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2605
		 * so we commit the DTL change in spa_syncing_txg(spa).
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2606
		 * In the zil_claim() case, we commit in spa_first_txg(spa).
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2607
		 *
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2608
		 * We currently do not make DTL entries for failed spontaneous
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2609
		 * self-healing writes triggered by normal (non-scrubbing)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2610
		 * reads, because we have no transactional context in which to
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2611
		 * do so -- and it's not clear that it'd be desirable anyway.
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2612
		 */
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2613
		if (vd->vdev_ops->vdev_op_leaf) {
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2614
			uint64_t commit_txg = txg;
12586
b118bbd65be9 6494473 ZFS needs a way to slow down resilvering
George Wilson <George.Wilson@Sun.COM>
parents: 12296
diff changeset
  2615
			if (flags & ZIO_FLAG_SCAN_THREAD) {
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2616
				ASSERT(flags & ZIO_FLAG_IO_REPAIR);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2617
				ASSERT(spa_sync_pass(spa) == 1);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2618
				vdev_dtl_dirty(vd, DTL_SCRUB, txg, 1);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2619
				commit_txg = spa_syncing_txg(spa);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2620
			} else if (spa->spa_claiming) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2621
				ASSERT(flags & ZIO_FLAG_IO_REPAIR);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2622
				commit_txg = spa_first_txg(spa);
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2623
			}
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2624
			ASSERT(commit_txg >= spa_syncing_txg(spa));
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2625
			if (vdev_dtl_contains(vd, DTL_MISSING, txg, 1))
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2626
				return;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2627
			for (pvd = vd; pvd != rvd; pvd = pvd->vdev_parent)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2628
				vdev_dtl_dirty(pvd, DTL_PARTIAL, txg, 1);
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2629
			vdev_dirty(vd->vdev_top, VDD_DTL, vd, commit_txg);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2630
		}
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2631
		if (vd != rvd)
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2632
			vdev_dtl_dirty(vd, DTL_MISSING, txg, 1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2633
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2634
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2635
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2636
/*
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2637
 * Update the in-core space usage stats for this vdev, its metaslab class,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2638
 * and the root vdev.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2639
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2640
void
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2641
vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2642
    int64_t space_delta)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2643
{
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2644
	int64_t dspace_delta = space_delta;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2645
	spa_t *spa = vd->vdev_spa;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2646
	vdev_t *rvd = spa->spa_root_vdev;
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2647
	metaslab_group_t *mg = vd->vdev_mg;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2648
	metaslab_class_t *mc = mg ? mg->mg_class : NULL;
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2649
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2650
	ASSERT(vd == vd->vdev_top);
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2651
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2652
	/*
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2653
	 * Apply the inverse of the psize-to-asize (ie. RAID-Z) space-expansion
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2654
	 * factor.  We must calculate this here and not at the root vdev
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2655
	 * because the root vdev's psize-to-asize is simply the max of its
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2656
	 * childrens', thus not accurate enough for us.
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2657
	 */
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2658
	ASSERT((dspace_delta & (SPA_MINBLOCKSIZE-1)) == 0);
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  2659
	ASSERT(vd->vdev_deflate_ratio != 0 || vd->vdev_isl2cache);
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2660
	dspace_delta = (dspace_delta >> SPA_MINBLOCKSHIFT) *
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2661
	    vd->vdev_deflate_ratio;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2662
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2663
	mutex_enter(&vd->vdev_stat_lock);
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2664
	vd->vdev_stat.vs_alloc += alloc_delta;
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2665
	vd->vdev_stat.vs_space += space_delta;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2666
	vd->vdev_stat.vs_dspace += dspace_delta;
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2667
	mutex_exit(&vd->vdev_stat_lock);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1986
diff changeset
  2668
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2669
	if (mc == spa_normal_class(spa)) {
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2670
		mutex_enter(&rvd->vdev_stat_lock);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2671
		rvd->vdev_stat.vs_alloc += alloc_delta;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2672
		rvd->vdev_stat.vs_space += space_delta;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2673
		rvd->vdev_stat.vs_dspace += dspace_delta;
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2674
		mutex_exit(&rvd->vdev_stat_lock);
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2675
	}
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2676
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2677
	if (mc != NULL) {
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2678
		ASSERT(rvd == vd->vdev_parent);
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2679
		ASSERT(vd->vdev_ms_count != 0);
4527
5d5b6ba91b17 PSARC 2007/171 ZFS Separate Intent Log
perrin
parents: 4451
diff changeset
  2680
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2681
		metaslab_class_space_update(mc,
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2682
		    alloc_delta, defer_delta, space_delta, dspace_delta);
5450
b25030891c44 PSARC 2007/618 ZFS L2ARC
brendan
parents: 5369
diff changeset
  2683
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2684
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2685
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2686
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2687
 * Mark a top-level vdev's config as dirty, placing it on the dirty list
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2688
 * so that it will be written out next time the vdev configuration is synced.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2689
 * If the root vdev is specified (vdev_top == NULL), dirty all top-level vdevs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2690
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2691
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2692
vdev_config_dirty(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2693
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2694
	spa_t *spa = vd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2695
	vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2696
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2697
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2698
	/*
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2699
	 * If this is an aux vdev (as with l2cache and spare devices), then we
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2700
	 * update the vdev config manually and set the sync flag.
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2701
	 */
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2702
	if (vd->vdev_aux != NULL) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2703
		spa_aux_vdev_t *sav = vd->vdev_aux;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2704
		nvlist_t **aux;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2705
		uint_t naux;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2706
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2707
		for (c = 0; c < sav->sav_count; c++) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2708
			if (sav->sav_vdevs[c] == vd)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2709
				break;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2710
		}
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2711
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2712
		if (c == sav->sav_count) {
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2713
			/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2714
			 * We're being removed.  There's nothing more to do.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2715
			 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2716
			ASSERT(sav->sav_sync == B_TRUE);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2717
			return;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2718
		}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2719
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2720
		sav->sav_sync = B_TRUE;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2721
9425
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2722
		if (nvlist_lookup_nvlist_array(sav->sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2723
		    ZPOOL_CONFIG_L2CACHE, &aux, &naux) != 0) {
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2724
			VERIFY(nvlist_lookup_nvlist_array(sav->sav_config,
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2725
			    ZPOOL_CONFIG_SPARES, &aux, &naux) == 0);
e7ffacaec3a8 6799895 spa_add_spares() needs to be protected by config lock
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 9230
diff changeset
  2726
		}
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2727
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2728
		ASSERT(c < naux);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2729
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2730
		/*
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2731
		 * Setting the nvlist in the middle if the array is a little
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2732
		 * sketchy, but it will work.
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2733
		 */
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2734
		nvlist_free(aux[c]);
12296
7cf402a7f374 6675946 'zpool status' should show the progress of resilvering for individual disk.
Lin Ling <Lin.Ling@Sun.COM>
parents: 12247
diff changeset
  2735
		aux[c] = vdev_config_generate(spa, vd, B_TRUE, 0);
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2736
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2737
		return;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2738
	}
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2739
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2740
	/*
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2741
	 * The dirty list is protected by the SCL_CONFIG lock.  The caller
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2742
	 * must either hold SCL_CONFIG as writer, or must be the sync thread
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2743
	 * (which holds SCL_CONFIG as reader).  There's only one sync thread,
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2744
	 * so this is sufficient to ensure mutual exclusion.
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2745
	 */
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2746
	ASSERT(spa_config_held(spa, SCL_CONFIG, RW_WRITER) ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2747
	    (dsl_pool_sync_context(spa_get_dsl(spa)) &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2748
	    spa_config_held(spa, SCL_CONFIG, RW_READER)));
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2749
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2750
	if (vd == rvd) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2751
		for (c = 0; c < rvd->vdev_children; c++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2752
			vdev_config_dirty(rvd->vdev_child[c]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2753
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2754
		ASSERT(vd == vd->vdev_top);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2755
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2756
		if (!list_link_active(&vd->vdev_config_dirty_node) &&
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2757
		    !vd->vdev_ishole)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2758
			list_insert_head(&spa->spa_config_dirty_list, vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2759
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2760
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2761
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2762
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2763
vdev_config_clean(vdev_t *vd)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2764
{
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2765
	spa_t *spa = vd->vdev_spa;
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2766
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2767
	ASSERT(spa_config_held(spa, SCL_CONFIG, RW_WRITER) ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2768
	    (dsl_pool_sync_context(spa_get_dsl(spa)) &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2769
	    spa_config_held(spa, SCL_CONFIG, RW_READER)));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2770
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2771
	ASSERT(list_link_active(&vd->vdev_config_dirty_node));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2772
	list_remove(&spa->spa_config_dirty_list, vd);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2773
}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2774
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2775
/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2776
 * Mark a top-level vdev's state as dirty, so that the next pass of
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2777
 * spa_sync() can convert this into vdev_config_dirty().  We distinguish
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2778
 * the state changes from larger config changes because they require
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2779
 * much less locking, and are often needed for administrative actions.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2780
 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2781
void
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2782
vdev_state_dirty(vdev_t *vd)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2783
{
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2784
	spa_t *spa = vd->vdev_spa;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2785
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2786
	ASSERT(vd == vd->vdev_top);
1601
438b928f80c7 6397197 ADVANCE_ZIL should only visit claimed-but-not-yet-replayed logs
bonwick
parents: 1585
diff changeset
  2787
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2788
	/*
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2789
	 * The state list is protected by the SCL_STATE lock.  The caller
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2790
	 * must either hold SCL_STATE as writer, or must be the sync thread
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2791
	 * (which holds SCL_STATE as reader).  There's only one sync thread,
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2792
	 * so this is sufficient to ensure mutual exclusion.
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2793
	 */
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2794
	ASSERT(spa_config_held(spa, SCL_STATE, RW_WRITER) ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2795
	    (dsl_pool_sync_context(spa_get_dsl(spa)) &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2796
	    spa_config_held(spa, 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: 7313
diff changeset
  2797
10922
e2081f502306 PSARC 2009/571 ZFS Deduplication Properties
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 10921
diff changeset
  2798
	if (!list_link_active(&vd->vdev_state_dirty_node) && !vd->vdev_ishole)
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2799
		list_insert_head(&spa->spa_state_dirty_list, vd);
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2800
}
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2801
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2802
void
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2803
vdev_state_clean(vdev_t *vd)
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2804
{
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2805
	spa_t *spa = vd->vdev_spa;
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2806
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2807
	ASSERT(spa_config_held(spa, SCL_STATE, RW_WRITER) ||
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2808
	    (dsl_pool_sync_context(spa_get_dsl(spa)) &&
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2809
	    spa_config_held(spa, 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: 7313
diff changeset
  2810
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2811
	ASSERT(list_link_active(&vd->vdev_state_dirty_node));
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2812
	list_remove(&spa->spa_state_dirty_list, vd);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2813
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2814
6523
c1d2a7f04573 6616739 panic message ZFS: I/O failure (write on <unknown> is not very helpful
ek110237
parents: 5530
diff changeset
  2815
/*
c1d2a7f04573 6616739 panic message ZFS: I/O failure (write on <unknown> is not very helpful
ek110237
parents: 5530
diff changeset
  2816
 * Propagate vdev state up from children to parent.
c1d2a7f04573 6616739 panic message ZFS: I/O failure (write on <unknown> is not very helpful
ek110237
parents: 5530
diff changeset
  2817
 */
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2818
void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2819
vdev_propagate_state(vdev_t *vd)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2820
{
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2821
	spa_t *spa = vd->vdev_spa;
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2822
	vdev_t *rvd = spa->spa_root_vdev;
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2823
	int degraded = 0, faulted = 0;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2824
	int corrupted = 0;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2825
	vdev_t *child;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2826
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2827
	if (vd->vdev_children > 0) {
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  2828
		for (int c = 0; c < vd->vdev_children; c++) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2829
			child = vd->vdev_child[c];
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2830
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2831
			/*
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2832
			 * Don't factor holes into the decision.
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2833
			 */
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2834
			if (child->vdev_ishole)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2835
				continue;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  2836
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2837
			if (!vdev_readable(child) ||
8241
5a60f16123ba 6328632 zpool offline is a bit too conservative
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 8123
diff changeset
  2838
			    (!vdev_writeable(child) && spa_writeable(spa))) {
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2839
				/*
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2840
				 * Root special: if there is a top-level log
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2841
				 * device, treat the root vdev as if it were
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2842
				 * degraded.
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2843
				 */
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2844
				if (child->vdev_islog && vd == rvd)
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2845
					degraded++;
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2846
				else
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2847
					faulted++;
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2848
			} else if (child->vdev_state <= VDEV_STATE_DEGRADED) {
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2849
				degraded++;
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2850
			}
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2851
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2852
			if (child->vdev_stat.vs_aux == VDEV_AUX_CORRUPT_DATA)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2853
				corrupted++;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2854
		}
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2855
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2856
		vd->vdev_ops->vdev_op_state_change(vd, faulted, degraded);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2857
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2858
		/*
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7313
diff changeset
  2859
		 * Root special: if there is a top-level vdev that cannot be
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2860
		 * opened due to corrupted metadata, then propagate the root
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2861
		 * vdev's aux state as 'corrupt' rather than 'insufficient
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2862
		 * replicas'.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2863
		 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2864
		if (corrupted && vd == rvd &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2865
		    rvd->vdev_state == VDEV_STATE_CANT_OPEN)
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2866
			vdev_set_state(rvd, B_FALSE, VDEV_STATE_CANT_OPEN,
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2867
			    VDEV_AUX_CORRUPT_DATA);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2868
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2869
6976
cae5f06df471 PSARC 2008/388 Short circuit for vdev probe failure
eschrock
parents: 6959
diff changeset
  2870
	if (vd->vdev_parent)
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2871
		vdev_propagate_state(vd->vdev_parent);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2872
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2873
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2874
/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2875
 * Set a vdev's state.  If this is during an open, we don't update the parent
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2876
 * state, because we're in the process of opening children depth-first.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2877
 * Otherwise, we propagate the change to the parent.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2878
 *
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2879
 * If this routine places a device in a faulted state, an appropriate ereport is
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2880
 * generated.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2881
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2882
void
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2883
vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2884
{
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2885
	uint64_t save_state;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2886
	spa_t *spa = vd->vdev_spa;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2887
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2888
	if (state == vd->vdev_state) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2889
		vd->vdev_stat.vs_aux = aux;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2890
		return;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2891
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2892
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2893
	save_state = vd->vdev_state;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2894
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2895
	vd->vdev_state = state;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2896
	vd->vdev_stat.vs_aux = aux;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2897
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2898
	/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2899
	 * If we are setting the vdev state to anything but an open state, then
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2900
	 * always close the underlying device unless the device has requested
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2901
	 * a delayed close (i.e. we're about to remove or fault the device).
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2902
	 * Otherwise, we keep accessible but invalid devices open forever.
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2903
	 * We don't call vdev_close() itself, because that implies some extra
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2904
	 * checks (offline, etc) that we don't want here.  This is limited to
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2905
	 * leaf devices, because otherwise closing the device will affect other
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2906
	 * children.
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2907
	 */
12247
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2908
	if (!vd->vdev_delayed_close && vdev_is_dead(vd) &&
5bcd281629f8 6911420 ZFS device removal detection should work with SCSAv3
George Wilson <George.Wilson@Sun.COM>
parents: 11982
diff changeset
  2909
	    vd->vdev_ops->vdev_op_leaf)
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2910
		vd->vdev_ops->vdev_op_close(vd);
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2911
10817
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2912
	/*
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2913
	 * If we have brought this vdev back into service, we need
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2914
	 * to notify fmd so that it can gracefully repair any outstanding
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2915
	 * cases due to a missing device.  We do this in all cases, even those
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2916
	 * that probably don't correlate to a repaired fault.  This is sure to
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2917
	 * catch all cases, and we let the zfs-retire agent sort it out.  If
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2918
	 * this is a transient state it's OK, as the retire agent will
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2919
	 * double-check the state of the vdev before repairing it.
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2920
	 */
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2921
	if (state == VDEV_STATE_HEALTHY && vd->vdev_ops->vdev_op_leaf &&
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2922
	    vd->vdev_prevstate != state)
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2923
		zfs_post_state_change(spa, vd);
7dfde45252f0 6889826 ZFS retire agent should be able to repair pools
Eric Schrock <Eric.Schrock@Sun.COM>
parents: 10685
diff changeset
  2924
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2925
	if (vd->vdev_removed &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2926
	    state == VDEV_STATE_CANT_OPEN &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2927
	    (aux == VDEV_AUX_OPEN_FAILED || vd->vdev_checkremove)) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2928
		/*
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2929
		 * If the previous state is set to VDEV_STATE_REMOVED, then this
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2930
		 * device was previously marked removed and someone attempted to
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2931
		 * reopen it.  If this failed due to a nonexistent device, then
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2932
		 * keep the device in the REMOVED state.  We also let this be if
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2933
		 * it is one of our special test online cases, which is only
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2934
		 * attempting to online the device and shouldn't generate an FMA
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2935
		 * fault.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2936
		 */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2937
		vd->vdev_state = VDEV_STATE_REMOVED;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2938
		vd->vdev_stat.vs_aux = VDEV_AUX_NONE;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2939
	} else if (state == VDEV_STATE_REMOVED) {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2940
		vd->vdev_removed = B_TRUE;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2941
	} else if (state == VDEV_STATE_CANT_OPEN) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2942
		/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2943
		 * If we fail to open a vdev during an import, we mark it as
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2944
		 * "not available", which signifies that it was never there to
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2945
		 * begin with.  Failure to open such a device is not considered
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2946
		 * an error.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2947
		 */
11147
74e8c05021f1 6678033 resilver code should prefetch
George Wilson <George.Wilson@Sun.COM>
parents: 11146
diff changeset
  2948
		if (spa_load_state(spa) == SPA_LOAD_IMPORT &&
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2949
		    vd->vdev_ops->vdev_op_leaf)
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2950
			vd->vdev_not_present = 1;
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2951
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2952
		/*
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2953
		 * Post the appropriate ereport.  If the 'prevstate' field is
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2954
		 * set to something other than VDEV_STATE_UNKNOWN, it indicates
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2955
		 * that this is part of a vdev_reopen().  In this case, we don't
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2956
		 * want to post the ereport if the device was already in the
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2957
		 * CANT_OPEN state beforehand.
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2958
		 *
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2959
		 * If the 'checkremove' flag is set, then this is an attempt to
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2960
		 * online the device in response to an insertion event.  If we
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2961
		 * hit this case, then we have detected an insertion event for a
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2962
		 * faulted or offline device that wasn't in the removed state.
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2963
		 * In this scenario, we don't post an ereport because we are
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2964
		 * about to replace the device, or attempt an online with
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2965
		 * vdev_forcefault, which will generate the fault for us.
1986
628267397204 6424405 zpool import destroyed_pool can damage existing pool using same devices
eschrock
parents: 1807
diff changeset
  2966
		 */
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2967
		if ((vd->vdev_prevstate != state || vd->vdev_forcefault) &&
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2968
		    !vd->vdev_not_present && !vd->vdev_checkremove &&
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2969
		    vd != spa->spa_root_vdev) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2970
			const char *class;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2971
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2972
			switch (aux) {
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2973
			case VDEV_AUX_OPEN_FAILED:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2974
				class = FM_EREPORT_ZFS_DEVICE_OPEN_FAILED;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2975
				break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2976
			case VDEV_AUX_CORRUPT_DATA:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2977
				class = FM_EREPORT_ZFS_DEVICE_CORRUPT_DATA;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2978
				break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2979
			case VDEV_AUX_NO_REPLICAS:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2980
				class = FM_EREPORT_ZFS_DEVICE_NO_REPLICAS;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2981
				break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2982
			case VDEV_AUX_BAD_GUID_SUM:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2983
				class = FM_EREPORT_ZFS_DEVICE_BAD_GUID_SUM;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2984
				break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2985
			case VDEV_AUX_TOO_SMALL:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2986
				class = FM_EREPORT_ZFS_DEVICE_TOO_SMALL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2987
				break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2988
			case VDEV_AUX_BAD_LABEL:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2989
				class = FM_EREPORT_ZFS_DEVICE_BAD_LABEL;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2990
				break;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2991
			default:
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2992
				class = FM_EREPORT_ZFS_DEVICE_UNKNOWN;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2993
			}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2994
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6523
diff changeset
  2995
			zfs_ereport_post(class, spa, vd, NULL, save_state, 0);
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  2996
		}
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2997
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2998
		/* Erase any notion of persistent removed state */
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  2999
		vd->vdev_removed = B_FALSE;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  3000
	} else {
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4070
diff changeset
  3001
		vd->vdev_removed = B_FALSE;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3002
	}
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1485
diff changeset
  3003
9583
b0696cd037cc 6794136 Panic BAD TRAP: type=e when importing degraded zraid pool.
Tim Haley <Tim.Haley@Sun.COM>
parents: 9512
diff changeset
  3004
	if (!isopen && vd->vdev_parent)
b0696cd037cc 6794136 Panic BAD TRAP: type=e when importing degraded zraid pool.
Tim Haley <Tim.Haley@Sun.COM>
parents: 9512
diff changeset
  3005
		vdev_propagate_state(vd->vdev_parent);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  3006
}
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3007
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3008
/*
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3009
 * Check the vdev configuration to ensure that it's capable of supporting
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3010
 * a root pool. Currently, we do not support RAID-Z or partial configuration.
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3011
 * In addition, only a single top-level vdev is allowed and none of the leaves
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3012
 * can be wholedisks.
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3013
 */
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3014
boolean_t
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3015
vdev_is_bootable(vdev_t *vd)
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3016
{
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3017
	if (!vd->vdev_ops->vdev_op_leaf) {
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3018
		char *vdev_type = vd->vdev_ops->vdev_op_type;
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3019
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3020
		if (strcmp(vdev_type, VDEV_TYPE_ROOT) == 0 &&
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3021
		    vd->vdev_children > 1) {
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3022
			return (B_FALSE);
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3023
		} else if (strcmp(vdev_type, VDEV_TYPE_RAIDZ) == 0 ||
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3024
		    strcmp(vdev_type, VDEV_TYPE_MISSING) == 0) {
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3025
			return (B_FALSE);
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3026
		}
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3027
	} else if (vd->vdev_wholedisk == 1) {
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3028
		return (B_FALSE);
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3029
	}
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3030
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3031
	for (int c = 0; c < vd->vdev_children; c++) {
7042
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3032
		if (!vdev_is_bootable(vd->vdev_child[c]))
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3033
			return (B_FALSE);
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3034
	}
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3035
	return (B_TRUE);
46fc4b6db23e 6721094 Setting certain properties on root pools should not be allowed
gw25295
parents: 6976
diff changeset
  3036
}
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3037
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3038
/*
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3039
 * Load the state from the original vdev tree (ovd) which
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3040
 * we've retrieved from the MOS config object. If the original
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3041
 * vdev was offline or faulted then we transfer that state to the
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3042
 * device in the current vdev tree (nvd).
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3043
 */
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3044
void
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3045
vdev_load_log_state(vdev_t *nvd, vdev_t *ovd)
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3046
{
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3047
	spa_t *spa = nvd->vdev_spa;
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3048
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3049
	ASSERT(nvd->vdev_top->vdev_islog);
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3050
	ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3051
	ASSERT3U(nvd->vdev_guid, ==, ovd->vdev_guid);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3052
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3053
	for (int c = 0; c < nvd->vdev_children; c++)
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3054
		vdev_load_log_state(nvd->vdev_child[c], ovd->vdev_child[c]);
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3055
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3056
	if (nvd->vdev_ops->vdev_op_leaf) {
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3057
		/*
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3058
		 * Restore the persistent vdev state
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3059
		 */
10594
986cb68d2347 6574286 removing a slog doesn't work
George Wilson <George.Wilson@Sun.COM>
parents: 10588
diff changeset
  3060
		nvd->vdev_offline = ovd->vdev_offline;
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3061
		nvd->vdev_faulted = ovd->vdev_faulted;
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3062
		nvd->vdev_degraded = ovd->vdev_degraded;
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3063
		nvd->vdev_removed = ovd->vdev_removed;
9701
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3064
	}
cc5b64682e64 6803605 should be able to offline log devices
George Wilson <George.Wilson@Sun.COM>
parents: 9583
diff changeset
  3065
}
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3066
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3067
/*
12961
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3068
 * Determine if a log device has valid content.  If the vdev was
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3069
 * removed or faulted in the MOS config then we know that
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3070
 * the content on the log device has already been written to the pool.
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3071
 */
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3072
boolean_t
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3073
vdev_log_state_valid(vdev_t *vd)
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3074
{
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3075
	if (vd->vdev_ops->vdev_op_leaf && !vd->vdev_faulted &&
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3076
	    !vd->vdev_removed)
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3077
		return (B_TRUE);
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3078
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3079
	for (int c = 0; c < vd->vdev_children; c++)
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3080
		if (vdev_log_state_valid(vd->vdev_child[c]))
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3081
			return (B_TRUE);
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3082
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3083
	return (B_FALSE);
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3084
}
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3085
b521d551715f 6733267 Allow a pool to be imported with a missing slog
George Wilson <George.Wilson@Sun.COM>
parents: 12586
diff changeset
  3086
/*
9816
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3087
 * Expand a vdev if possible.
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3088
 */
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3089
void
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3090
vdev_expand(vdev_t *vd, uint64_t txg)
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3091
{
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3092
	ASSERT(vd->vdev_top == vd);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3093
	ASSERT(spa_config_held(vd->vdev_spa, SCL_ALL, RW_WRITER) == SCL_ALL);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3094
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3095
	if ((vd->vdev_asize >> vd->vdev_ms_shift) > vd->vdev_ms_count) {
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3096
		VERIFY(vdev_metaslab_init(vd, txg) == 0);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3097
		vdev_config_dirty(vd);
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3098
	}
847676ec1c5b PSARC 2008/353 zpool autoexpand property
George Wilson <George.Wilson@Sun.COM>
parents: 9790
diff changeset
  3099
}
11422
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3100
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3101
/*
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3102
 * Split a vdev.
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3103
 */
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3104
void
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3105
vdev_split(vdev_t *vd)
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3106
{
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3107
	vdev_t *cvd, *pvd = vd->vdev_parent;
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3108
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3109
	vdev_remove_child(pvd, vd);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3110
	vdev_compact_children(pvd);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3111
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3112
	cvd = pvd->vdev_child[0];
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3113
	if (pvd->vdev_children == 1) {
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3114
		vdev_remove_parent(cvd);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3115
		cvd->vdev_splitting = B_TRUE;
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3116
	}
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3117
	vdev_propagate_state(cvd);
42768837421d PSARC/2009/511 zpool split
Mark J Musante <Mark.Musante@Sun.COM>
parents: 11147
diff changeset
  3118
}