Fix "out of memory" error
Drop the no_memory() call from zpool_in_use() when reading the label fails and instead return the error to the caller. This prevents a misleading "internal error: out of memory" error when the label can't be read. This will result in is_spare() returning B_FALSE instead of aborting, which is already safely handled. Furthermore, on Linux it's possible for EREMOTEIO to returned by an NVMe device if the device has been low-level formatted and not rescanned. In this case we want to fallback to the legacy scanning method and read any of the labels we can. Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #13538 Closes #15747
This commit is contained in:
parent
509526ad21
commit
2006ac1f4a
|
@ -291,10 +291,8 @@ zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr,
|
||||||
|
|
||||||
*inuse = B_FALSE;
|
*inuse = B_FALSE;
|
||||||
|
|
||||||
if (zpool_read_label(fd, &config, NULL) != 0) {
|
if (zpool_read_label(fd, &config, NULL) != 0)
|
||||||
(void) no_memory(hdl);
|
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
|
||||||
|
|
||||||
if (config == NULL)
|
if (config == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
@ -1056,10 +1056,21 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels)
|
||||||
case EINVAL:
|
case EINVAL:
|
||||||
break;
|
break;
|
||||||
case EINPROGRESS:
|
case EINPROGRESS:
|
||||||
// This shouldn't be possible to
|
/*
|
||||||
// encounter, die if we do.
|
* This shouldn't be possible to
|
||||||
|
* encounter, die if we do.
|
||||||
|
*/
|
||||||
ASSERT(B_FALSE);
|
ASSERT(B_FALSE);
|
||||||
zfs_fallthrough;
|
zfs_fallthrough;
|
||||||
|
case EREMOTEIO:
|
||||||
|
/*
|
||||||
|
* May be returned by an NVMe device
|
||||||
|
* which is visible in /dev/ but due
|
||||||
|
* to a low-level format change, or
|
||||||
|
* other error, needs to be rescanned.
|
||||||
|
* Try the slow method.
|
||||||
|
*/
|
||||||
|
zfs_fallthrough;
|
||||||
case EOPNOTSUPP:
|
case EOPNOTSUPP:
|
||||||
case ENOSYS:
|
case ENOSYS:
|
||||||
do_slow = B_TRUE;
|
do_slow = B_TRUE;
|
||||||
|
|
Loading…
Reference in New Issue