mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	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; | ||||
| 
 | ||||
| 	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
	
	Block a user
	 Brian Behlendorf
						Brian Behlendorf