Page MenuHomeFreeBSD

D51913.id160387.diff
No OneTemporary

D51913.id160387.diff

diff --git a/stand/libsa/zfs/zfsimpl.c b/stand/libsa/zfs/zfsimpl.c
--- a/stand/libsa/zfs/zfsimpl.c
+++ b/stand/libsa/zfs/zfsimpl.c
@@ -2012,7 +2012,7 @@
{
vdev_t vtmp;
spa_t *spa;
- vdev_t *vdev;
+ vdev_t *vdev, *kid;
nvlist_t *nvl;
uint64_t val;
uint64_t guid, pool_guid, top_guid, txg;
@@ -2109,22 +2109,30 @@
nvlist_destroy(nvl);
return (ENOMEM);
}
- } else {
- struct vdev *kid;
-
- STAILQ_FOREACH(kid, &spa->spa_root_vdev->v_children,
- v_childlink)
- if (kid->v_guid == top_guid && kid->v_txg < txg) {
- printf("ZFS: pool %s vdev %s ignoring stale "
- "label from txg 0x%jx, using 0x%jx@0x%jx\n",
- spa->spa_name, kid->v_name,
- kid->v_txg, guid, txg);
- STAILQ_REMOVE(&spa->spa_root_vdev->v_children,
+ }
+
+ STAILQ_FOREACH(kid, &spa->spa_root_vdev->v_children, v_childlink)
+ if (kid->v_guid == top_guid) {
+ bool newer;
+
+ if (kid->v_txg == txg)
+ break;
+ newer = (kid->v_txg < txg);
+ printf("ZFS: pool %s vdev %s ignoring stale "
+ "label from txg 0x%jx, using 0x%jx\n",
+ spa->spa_name, kid->v_name,
+ newer ? kid->v_txg : txg,
+ newer ? txg : kid->v_txg);
+ if (newer) {
+ STAILQ_REMOVE( &spa->spa_root_vdev->v_children,
kid, vdev, v_childlink);
vdev_free(kid);
break;
+ } else {
+ nvlist_destroy(nvl);
+ return (EIO);
}
- }
+ }
/*
* Get the vdev tree and create our in-core copy of it.

File Metadata

Mime Type
text/plain
Expires
Sun, Aug 16, 1:12 AM (12 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36808737
Default Alt Text
D51913.id160387.diff (1 KB)

Event Timeline