svn commit: r229664 - in stable/8/cddl/contrib/opensolaris: cmd/zdb
cmd/zpool cmd/ztest head lib/libzfs/common lib/libzpool/common
Martin Matuska
mm at FreeBSD.org
Thu Jan 5 22:28:41 UTC 2012
Author: mm
Date: Thu Jan 5 22:28:40 2012
New Revision: 229664
URL: http://svn.freebsd.org/changeset/base/229664
Log:
MFC ZFS userland to reduce diff with stable/9:
r224170, r224526, r226583, r226613, r226615, r226616
MFC r224170 (gibbs):
Correct reporting of missing leaf vdevs so that the GUID required to
perform pool actions is always displayed.
cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:
The "zpool status" command reports the "last seen at"
device node path when the vdev name is being reported
by GUID. Augment this code to assume a GUID is reported
when a device goes missing after initial boot in addition
to the previous behavior of doing this for devices that
aren't seen at boot.
cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c:
In zpool_vdev_name(), report recently missing devices
by GUID. There is no guarantee they will return at
their previous location.
MFC r224526 (mm, userland part only):
Fix serious bug in ZIL that can lead to pool corruption
in the case of a held dataset during remount.
Detailed description is available at:
https://www.illumos.org/issues/883
illumos-gate revision: 13380:161b964a0e10
MFC r226583 (pjd):
Make all the lines align properly.
MFC r226613 (pjd) [1]:
libzpool task_alloc: pass only valid flags to kmem_alloc
tqflags may contain other flags besided those that are suitable for
kmem_alloc == umem_alloc
MFC r226615 (pjd) [1]:
thr_create: new_thread_ID may be NULL
MFC r226616 (pjd) [1]:
zdb: access dp_free_bpobj only if pool version is >= SPA_VERSION_DEADLISTS
Submitted by: avg [1]
Modified:
stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c
stable/8/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c
stable/8/cddl/contrib/opensolaris/head/thread.h
stable/8/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
stable/8/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c
Directory Properties:
stable/8/cddl/contrib/opensolaris/ (props changed)
Modified: stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c Thu Jan 5 22:16:41 2012 (r229663)
+++ stable/8/cddl/contrib/opensolaris/cmd/zdb/zdb.c Thu Jan 5 22:28:40 2012 (r229664)
@@ -2190,8 +2190,10 @@ dump_block_stats(spa_t *spa)
*/
(void) bpobj_iterate_nofree(&spa->spa_deferred_bpobj,
count_block_cb, &zcb, NULL);
- (void) bpobj_iterate_nofree(&spa->spa_dsl_pool->dp_free_bpobj,
- count_block_cb, &zcb, NULL);
+ if (spa_version(spa) >= SPA_VERSION_DEADLISTS) {
+ (void) bpobj_iterate_nofree(&spa->spa_dsl_pool->dp_free_bpobj,
+ count_block_cb, &zcb, NULL);
+ }
if (dump_opt['c'] > 1)
flags |= TRAVERSE_PREFETCH_DATA;
Modified: stable/8/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c Thu Jan 5 22:16:41 2012 (r229663)
+++ stable/8/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c Thu Jan 5 22:28:40 2012 (r229664)
@@ -1217,10 +1217,11 @@ print_status_config(zpool_handle_t *zhp,
}
if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
- ¬present) == 0) {
+ ¬present) == 0 ||
+ vs->vs_state <= VDEV_STATE_CANT_OPEN) {
char *path;
- verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
- (void) printf(" was %s", path);
+ if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0)
+ (void) printf(" was %s", path);
} else if (vs->vs_aux != 0) {
(void) printf(" ");
@@ -3466,7 +3467,7 @@ print_scan_status(pool_scan_stat_t *ps)
double fraction_done;
char processed_buf[7], examined_buf[7], total_buf[7], rate_buf[7];
- (void) printf(gettext(" scan: "));
+ (void) printf(gettext(" scan: "));
/* If there's never been a scan, there's not much to say. */
if (ps == NULL || ps->pss_func == POOL_SCAN_NONE ||
@@ -3546,7 +3547,7 @@ print_scan_status(pool_scan_stat_t *ps)
/*
* do not print estimated time if hours_left is more than 30 days
*/
- (void) printf(gettext(" %s scanned out of %s at %s/s"),
+ (void) printf(gettext(" %s scanned out of %s at %s/s"),
examined_buf, total_buf, rate_buf);
if (hours_left < (30 * 24)) {
(void) printf(gettext(", %lluh%um to go\n"),
@@ -3557,10 +3558,10 @@ print_scan_status(pool_scan_stat_t *ps)
}
if (ps->pss_func == POOL_SCAN_RESILVER) {
- (void) printf(gettext(" %s resilvered, %.2f%% done\n"),
+ (void) printf(gettext(" %s resilvered, %.2f%% done\n"),
processed_buf, 100 * fraction_done);
} else if (ps->pss_func == POOL_SCAN_SCRUB) {
- (void) printf(gettext(" %s repaired, %.2f%% done\n"),
+ (void) printf(gettext(" %s repaired, %.2f%% done\n"),
processed_buf, 100 * fraction_done);
}
}
Modified: stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c Thu Jan 5 22:16:41 2012 (r229663)
+++ stable/8/cddl/contrib/opensolaris/cmd/ztest/ztest.c Thu Jan 5 22:28:40 2012 (r229664)
@@ -206,6 +206,7 @@ typedef struct ztest_od {
*/
typedef struct ztest_ds {
objset_t *zd_os;
+ rwlock_t zd_zilog_lock;
zilog_t *zd_zilog;
uint64_t zd_seq;
ztest_od_t *zd_od; /* debugging aid */
@@ -239,6 +240,7 @@ ztest_func_t ztest_dmu_commit_callbacks;
ztest_func_t ztest_zap;
ztest_func_t ztest_zap_parallel;
ztest_func_t ztest_zil_commit;
+ztest_func_t ztest_zil_remount;
ztest_func_t ztest_dmu_read_write_zcopy;
ztest_func_t ztest_dmu_objset_create_destroy;
ztest_func_t ztest_dmu_prealloc;
@@ -275,6 +277,7 @@ ztest_info_t ztest_info[] = {
{ ztest_zap_parallel, 100, &zopt_always },
{ ztest_split_pool, 1, &zopt_always },
{ ztest_zil_commit, 1, &zopt_incessant },
+ { ztest_zil_remount, 1, &zopt_sometimes },
{ ztest_dmu_read_write_zcopy, 1, &zopt_often },
{ ztest_dmu_objset_create_destroy, 1, &zopt_often },
{ ztest_dsl_prop_get_set, 1, &zopt_often },
@@ -990,6 +993,7 @@ ztest_zd_init(ztest_ds_t *zd, objset_t *
zd->zd_seq = 0;
dmu_objset_name(os, zd->zd_name);
+ VERIFY(rwlock_init(&zd->zd_zilog_lock, USYNC_THREAD, NULL) == 0);
VERIFY(_mutex_init(&zd->zd_dirobj_lock, USYNC_THREAD, NULL) == 0);
for (int l = 0; l < ZTEST_OBJECT_LOCKS; l++)
@@ -1969,6 +1973,8 @@ ztest_io(ztest_ds_t *zd, uint64_t object
if (ztest_random(2) == 0)
io_type = ZTEST_IO_WRITE_TAG;
+ (void) rw_rdlock(&zd->zd_zilog_lock);
+
switch (io_type) {
case ZTEST_IO_WRITE_TAG:
@@ -2004,6 +2010,8 @@ ztest_io(ztest_ds_t *zd, uint64_t object
break;
}
+ (void) rw_unlock(&zd->zd_zilog_lock);
+
umem_free(data, blocksize);
}
@@ -2058,6 +2066,8 @@ ztest_zil_commit(ztest_ds_t *zd, uint64_
{
zilog_t *zilog = zd->zd_zilog;
+ (void) rw_rdlock(&zd->zd_zilog_lock);
+
zil_commit(zilog, ztest_random(ZTEST_OBJECTS));
/*
@@ -2069,6 +2079,31 @@ ztest_zil_commit(ztest_ds_t *zd, uint64_
ASSERT(zd->zd_seq <= zilog->zl_commit_lr_seq);
zd->zd_seq = zilog->zl_commit_lr_seq;
mutex_exit(&zilog->zl_lock);
+
+ (void) rw_unlock(&zd->zd_zilog_lock);
+}
+
+/*
+ * This function is designed to simulate the operations that occur during a
+ * mount/unmount operation. We hold the dataset across these operations in an
+ * attempt to expose any implicit assumptions about ZIL management.
+ */
+/* ARGSUSED */
+void
+ztest_zil_remount(ztest_ds_t *zd, uint64_t id)
+{
+ objset_t *os = zd->zd_os;
+
+ (void) rw_wrlock(&zd->zd_zilog_lock);
+
+ /* zfsvfs_teardown() */
+ zil_close(zd->zd_zilog);
+
+ /* zfsvfs_setup() */
+ VERIFY(zil_open(os, ztest_get_data) == zd->zd_zilog);
+ zil_replay(os, zd, ztest_replay_vector);
+
+ (void) rw_unlock(&zd->zd_zilog_lock);
}
/*
Modified: stable/8/cddl/contrib/opensolaris/head/thread.h
==============================================================================
--- stable/8/cddl/contrib/opensolaris/head/thread.h Thu Jan 5 22:16:41 2012 (r229663)
+++ stable/8/cddl/contrib/opensolaris/head/thread.h Thu Jan 5 22:28:40 2012 (r229664)
@@ -76,6 +76,7 @@ static __inline int
thr_create(void *stack_base, size_t stack_size, void *(*start_func) (void*),
void *arg, long flags, thread_t *new_thread_ID)
{
+ pthread_t dummy;
int ret;
assert(stack_base == NULL);
@@ -85,9 +86,12 @@ thr_create(void *stack_base, size_t stac
pthread_attr_t attr;
pthread_attr_init(&attr);
- if(flags & THR_DETACHED)
+ if (flags & THR_DETACHED)
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (new_thread_ID == NULL)
+ new_thread_ID = &dummy;
+
/* This function ignores the THR_BOUND flag, since NPTL doesn't seem to support PTHREAD_SCOPE_PROCESS */
ret = pthread_create(new_thread_ID, &attr, start_func, arg);
Modified: stable/8/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c Thu Jan 5 22:16:41 2012 (r229663)
+++ stable/8/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c Thu Jan 5 22:28:40 2012 (r229664)
@@ -3153,15 +3153,25 @@ zpool_vdev_name(libzfs_handle_t *hdl, zp
char buf[64];
vdev_stat_t *vs;
uint_t vsc;
+ int have_stats;
+ int have_path;
- if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
- &value) == 0) {
+ have_stats = nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
+ (uint64_t **)&vs, &vsc) == 0;
+ have_path = nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0;
+
+ /*
+ * If the device is not currently present, assume it will not
+ * come back at the same device path. Display the device by GUID.
+ */
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &value) == 0 ||
+ have_path && have_stats && vs->vs_state <= VDEV_STATE_CANT_OPEN) {
verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
&value) == 0);
(void) snprintf(buf, sizeof (buf), "%llu",
(u_longlong_t)value);
path = buf;
- } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
+ } else if (have_path) {
/*
* If the device is dead (faulted, offline, etc) then don't
@@ -3169,8 +3179,7 @@ zpool_vdev_name(libzfs_handle_t *hdl, zp
* open a misbehaving device, which can have undesirable
* effects.
*/
- if ((nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
- (uint64_t **)&vs, &vsc) != 0 ||
+ if ((have_stats == 0 ||
vs->vs_state >= VDEV_STATE_DEGRADED) &&
zhp != NULL &&
nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
Modified: stable/8/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c
==============================================================================
--- stable/8/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c Thu Jan 5 22:16:41 2012 (r229663)
+++ stable/8/cddl/contrib/opensolaris/lib/libzpool/common/taskq.c Thu Jan 5 22:28:40 2012 (r229664)
@@ -87,7 +87,7 @@ again: if ((t = tq->tq_freelist) != NULL
}
mutex_exit(&tq->tq_lock);
- t = kmem_alloc(sizeof (task_t), tqflags);
+ t = kmem_alloc(sizeof (task_t), tqflags & KM_SLEEP);
mutex_enter(&tq->tq_lock);
if (t != NULL)
More information about the svn-src-stable
mailing list