summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/zfs/spa.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/zfs/spa.c')
-rw-r--r--usr/src/uts/common/fs/zfs/spa.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/zfs/spa.c b/usr/src/uts/common/fs/zfs/spa.c
index d6e230fbb4..db3317e4cd 100644
--- a/usr/src/uts/common/fs/zfs/spa.c
+++ b/usr/src/uts/common/fs/zfs/spa.c
@@ -1961,6 +1961,12 @@ spa_check_for_missing_logs(spa_t *spa)
if (idx > 0) {
spa_load_failed(spa, "some log devices are missing");
vdev_dbgmsg_print_tree(rvd, 2);
+
+ /* Save the timestamp of the last completed txg. */
+ VERIFY(nvlist_add_uint64(spa->spa_load_info,
+ ZPOOL_CONFIG_LOAD_TIME,
+ spa->spa_last_ubsync_txg_ts) == 0);
+
return (SET_ERROR(ENXIO));
}
} else {
@@ -1969,10 +1975,21 @@ spa_check_for_missing_logs(spa_t *spa)
if (tvd->vdev_islog &&
tvd->vdev_state == VDEV_STATE_CANT_OPEN) {
+ nvlist_t *rewind_info = fnvlist_alloc();
+
spa_set_log_state(spa, SPA_LOG_CLEAR);
spa_load_note(spa, "some log devices are "
"missing, ZIL is dropped.");
vdev_dbgmsg_print_tree(rvd, 2);
+
+ VERIFY(nvlist_add_uint64(rewind_info,
+ ZPOOL_CONFIG_LOAD_TIME,
+ spa->spa_uberblock.ub_timestamp) == 0);
+
+ VERIFY(nvlist_add_nvlist(spa->spa_load_info,
+ ZPOOL_CONFIG_REWIND_INFO,
+ rewind_info) == 0);
+
break;
}
}