Skip to content

Commit

Permalink
Fix "out of memory" error
Browse files Browse the repository at this point in the history
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 openzfs#13538
Closes openzfs#15747
  • Loading branch information
behlendorf authored and lundman committed Mar 13, 2024
1 parent 63f187f commit 6216549
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
4 changes: 1 addition & 3 deletions lib/libzfs/libzfs_import.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
15 changes: 13 additions & 2 deletions lib/libzutil/zutil_import.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 6216549

Please sign in to comment.