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
363368c670
commit
a1771d243a
|
@ -291,10 +291,8 @@ zpool_in_use(libzfs_handle_t *hdl, int fd, pool_state_t *state, char **namestr,
|
|||
|
||||
*inuse = B_FALSE;
|
||||
|
||||
if (zpool_read_label(fd, &config, NULL) != 0) {
|
||||
(void) no_memory(hdl);
|
||||
if (zpool_read_label(fd, &config, NULL) != 0)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (config == NULL)
|
||||
return (0);
|
||||
|
|
|
@ -1056,10 +1056,21 @@ zpool_read_label(int fd, nvlist_t **config, int *num_labels)
|
|||
case EINVAL:
|
||||
break;
|
||||
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);
|
||||
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 ENOSYS:
|
||||
do_slow = B_TRUE;
|
||||
|
|
Loading…
Reference in New Issue