loader: we do not support booting from pool with log device

If pool has log device, stop there and tell about it.
This commit is contained in:
Toomas Soome 2019-11-03 13:25:47 +00:00
parent f4ed004573
commit 0c0a882c7a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=354283
3 changed files with 29 additions and 5 deletions

View File

@ -668,6 +668,11 @@ zfs_dev_open(struct open_file *f, ...)
spa = spa_find_by_guid(dev->pool_guid); spa = spa_find_by_guid(dev->pool_guid);
if (!spa) if (!spa)
return (ENXIO); return (ENXIO);
if (spa->spa_with_log) {
printf("Reading pool %s is not supported due to log device.\n",
spa->spa_name);
return (ENXIO);
}
mount = malloc(sizeof(*mount)); mount = malloc(sizeof(*mount));
if (mount == NULL) if (mount == NULL)
return (ENOMEM); return (ENOMEM);

View File

@ -1109,6 +1109,7 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t *pvdev,
const unsigned char *kids; const unsigned char *kids;
int nkids, i, is_new; int nkids, i, is_new;
uint64_t is_offline, is_faulted, is_degraded, is_removed, isnt_present; uint64_t is_offline, is_faulted, is_degraded, is_removed, isnt_present;
uint64_t is_log;
if (nvlist_find(nvlist, ZPOOL_CONFIG_GUID, DATA_TYPE_UINT64, if (nvlist_find(nvlist, ZPOOL_CONFIG_GUID, DATA_TYPE_UINT64,
NULL, &guid) NULL, &guid)
@ -1132,17 +1133,20 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t *pvdev,
} }
is_offline = is_removed = is_faulted = is_degraded = isnt_present = 0; is_offline = is_removed = is_faulted = is_degraded = isnt_present = 0;
is_log = 0;
nvlist_find(nvlist, ZPOOL_CONFIG_OFFLINE, DATA_TYPE_UINT64, NULL, nvlist_find(nvlist, ZPOOL_CONFIG_OFFLINE, DATA_TYPE_UINT64, NULL,
&is_offline); &is_offline);
nvlist_find(nvlist, ZPOOL_CONFIG_REMOVED, DATA_TYPE_UINT64, NULL, nvlist_find(nvlist, ZPOOL_CONFIG_REMOVED, DATA_TYPE_UINT64, NULL,
&is_removed); &is_removed);
nvlist_find(nvlist, ZPOOL_CONFIG_FAULTED, DATA_TYPE_UINT64, NULL, nvlist_find(nvlist, ZPOOL_CONFIG_FAULTED, DATA_TYPE_UINT64, NULL,
&is_faulted); &is_faulted);
nvlist_find(nvlist, ZPOOL_CONFIG_DEGRADED, DATA_TYPE_UINT64, NULL, nvlist_find(nvlist, ZPOOL_CONFIG_DEGRADED, DATA_TYPE_UINT64, NULL,
&is_degraded); &is_degraded);
nvlist_find(nvlist, ZPOOL_CONFIG_NOT_PRESENT, DATA_TYPE_UINT64, NULL, nvlist_find(nvlist, ZPOOL_CONFIG_NOT_PRESENT, DATA_TYPE_UINT64, NULL,
&isnt_present); &isnt_present);
nvlist_find(nvlist, ZPOOL_CONFIG_IS_LOG, DATA_TYPE_UINT64, NULL,
&is_log);
vdev = vdev_find(guid); vdev = vdev_find(guid);
if (!vdev) { if (!vdev) {
@ -1217,6 +1221,7 @@ vdev_init_from_nvlist(const unsigned char *nvlist, vdev_t *pvdev,
return (ENOMEM); return (ENOMEM);
vdev->v_name = name; vdev->v_name = name;
} }
vdev->v_islog = is_log == 1;
} else { } else {
is_new = 0; is_new = 0;
} }
@ -1433,6 +1438,12 @@ vdev_status(vdev_t *vdev, int indent)
{ {
vdev_t *kid; vdev_t *kid;
int ret; int ret;
if (vdev->v_islog) {
(void)pager_output(" logs\n");
indent++;
}
ret = print_state(indent, vdev->v_name, vdev->v_state); ret = print_state(indent, vdev->v_name, vdev->v_state);
if (ret != 0) if (ret != 0)
return (ret); return (ret);
@ -1738,6 +1749,12 @@ vdev_probe(vdev_phys_read_t *_read, void *read_priv, spa_t **spap)
return (EIO); return (EIO);
} }
/*
* We do not support reading pools with log device.
*/
if (vdev->v_islog)
spa->spa_with_log = vdev->v_islog;
/* /*
* Re-evaluate top-level vdev state. * Re-evaluate top-level vdev state.
*/ */

View File

@ -1670,6 +1670,7 @@ typedef struct vdev {
vdev_phys_read_t *v_phys_read; /* read from raw leaf vdev */ vdev_phys_read_t *v_phys_read; /* read from raw leaf vdev */
vdev_read_t *v_read; /* read from vdev */ vdev_read_t *v_read; /* read from vdev */
void *v_read_priv; /* private data for read function */ void *v_read_priv; /* private data for read function */
boolean_t v_islog;
struct spa *spa; /* link to spa */ struct spa *spa; /* link to spa */
/* /*
* Values stored in the config for an indirect or removing vdev. * Values stored in the config for an indirect or removing vdev.
@ -1694,6 +1695,7 @@ typedef struct spa {
zio_cksum_salt_t spa_cksum_salt; /* secret salt for cksum */ zio_cksum_salt_t spa_cksum_salt; /* secret salt for cksum */
void *spa_cksum_tmpls[ZIO_CHECKSUM_FUNCTIONS]; void *spa_cksum_tmpls[ZIO_CHECKSUM_FUNCTIONS];
int spa_inited; /* initialized */ int spa_inited; /* initialized */
boolean_t spa_with_log; /* this pool has log */
} spa_t; } spa_t;
/* IO related arguments. */ /* IO related arguments. */