mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Illumos #2671: zpool import should not fail if vdev ashift has increased
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Eric Schrock <eric.schrock@delphix.com>
Reviewed by: Richard Elling <richard.elling@richardelling.com>
Reviewed by: Gordon Ross <gwr@nexenta.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Richard Lowe <richlowe@richlowe.net>
Refererces to Illumos issue:
      https://www.illumos.org/issues/2671
This patch has been slightly modified from the upstream Illumos
version.  In the upstream implementation a warning message is
logged to the console.  To prevent pointless console noise this
notification is now posted as a "ereport.fs.zfs.vdev.bad_ashift"
event.
The event indicates a non-optimial (but entirely safe) ashift
value was used to create the pool.  Depending on your workload
this may impact pool performance.  Unfortunately, the only way
to correct the issue is to recreate the pool with a new ashift.
NOTE: The unrelated fix to the comment in zpool_main.c appears
in the upstream commit and was preserved for consistnecy.
Ported-by: Cyril Plisko <cyril.plisko@mountall.com>
Reworked-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #955
			
			
This commit is contained in:
		
							parent
							
								
									3997bc7435
								
							
						
					
					
						commit
						32a9872bba
					
				@ -3736,7 +3736,7 @@ print_dedup_stats(nvlist_t *config)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * If the pool was faulted then we may not have been able to
 | 
						 * If the pool was faulted then we may not have been able to
 | 
				
			||||||
	 * obtain the config. Otherwise, if have anything in the dedup
 | 
						 * obtain the config. Otherwise, if we have anything in the dedup
 | 
				
			||||||
	 * table continue processing the stats.
 | 
						 * table continue processing the stats.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_OBJ_STATS,
 | 
						if (nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_OBJ_STATS,
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,7 @@ extern "C" {
 | 
				
			|||||||
#define	FM_EREPORT_ZFS_DEVICE_BAD_GUID_SUM	"vdev.bad_guid_sum"
 | 
					#define	FM_EREPORT_ZFS_DEVICE_BAD_GUID_SUM	"vdev.bad_guid_sum"
 | 
				
			||||||
#define	FM_EREPORT_ZFS_DEVICE_TOO_SMALL		"vdev.too_small"
 | 
					#define	FM_EREPORT_ZFS_DEVICE_TOO_SMALL		"vdev.too_small"
 | 
				
			||||||
#define	FM_EREPORT_ZFS_DEVICE_BAD_LABEL		"vdev.bad_label"
 | 
					#define	FM_EREPORT_ZFS_DEVICE_BAD_LABEL		"vdev.bad_label"
 | 
				
			||||||
 | 
					#define	FM_EREPORT_ZFS_DEVICE_BAD_ASHIFT	"vdev.bad_ashift"
 | 
				
			||||||
#define	FM_EREPORT_ZFS_DEVICE_REMOVE		"vdev.remove"
 | 
					#define	FM_EREPORT_ZFS_DEVICE_REMOVE		"vdev.remove"
 | 
				
			||||||
#define	FM_EREPORT_ZFS_DEVICE_CLEAR		"vdev.clear"
 | 
					#define	FM_EREPORT_ZFS_DEVICE_CLEAR		"vdev.clear"
 | 
				
			||||||
#define	FM_EREPORT_ZFS_DEVICE_CHECK		"vdev.check"
 | 
					#define	FM_EREPORT_ZFS_DEVICE_CHECK		"vdev.check"
 | 
				
			||||||
@ -71,6 +72,7 @@ extern "C" {
 | 
				
			|||||||
#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID	"vdev_devid"
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID	"vdev_devid"
 | 
				
			||||||
#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU		"vdev_fru"
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU		"vdev_fru"
 | 
				
			||||||
#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_STATE	"vdev_state"
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_STATE	"vdev_state"
 | 
				
			||||||
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_VDEV_ASHIFT	"vdev_ashift"
 | 
				
			||||||
#define	FM_EREPORT_PAYLOAD_ZFS_PARENT_GUID	"parent_guid"
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_PARENT_GUID	"parent_guid"
 | 
				
			||||||
#define	FM_EREPORT_PAYLOAD_ZFS_PARENT_TYPE	"parent_type"
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_PARENT_TYPE	"parent_type"
 | 
				
			||||||
#define	FM_EREPORT_PAYLOAD_ZFS_PARENT_PATH	"parent_path"
 | 
					#define	FM_EREPORT_PAYLOAD_ZFS_PARENT_PATH	"parent_path"
 | 
				
			||||||
 | 
				
			|||||||
@ -1271,13 +1271,16 @@ vdev_open(vdev_t *vd)
 | 
				
			|||||||
		vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
 | 
							vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Make sure the alignment requirement hasn't increased.
 | 
							 * Detect if the alignment requirement has increased.
 | 
				
			||||||
 | 
							 * We don't want to make the pool unavailable, just
 | 
				
			||||||
 | 
							 * post an event instead.
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (ashift > vd->vdev_top->vdev_ashift) {
 | 
							if (ashift > vd->vdev_top->vdev_ashift &&
 | 
				
			||||||
			vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
 | 
							    vd->vdev_ops->vdev_op_leaf) {
 | 
				
			||||||
			    VDEV_AUX_BAD_LABEL);
 | 
								zfs_ereport_post(FM_EREPORT_ZFS_DEVICE_BAD_ASHIFT,
 | 
				
			||||||
			return (EINVAL);
 | 
								    spa, vd, NULL, 0, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		vd->vdev_max_asize = max_asize;
 | 
							vd->vdev_max_asize = max_asize;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -267,6 +267,10 @@ zfs_ereport_start(nvlist_t **ereport_out, nvlist_t **detector_out,
 | 
				
			|||||||
			fm_payload_set(ereport,
 | 
								fm_payload_set(ereport,
 | 
				
			||||||
			    FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU,
 | 
								    FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU,
 | 
				
			||||||
			    DATA_TYPE_STRING, vd->vdev_fru, NULL);
 | 
								    DATA_TYPE_STRING, vd->vdev_fru, NULL);
 | 
				
			||||||
 | 
							if (vd->vdev_ashift)
 | 
				
			||||||
 | 
								fm_payload_set(ereport,
 | 
				
			||||||
 | 
								    FM_EREPORT_PAYLOAD_ZFS_VDEV_ASHIFT,
 | 
				
			||||||
 | 
								    DATA_TYPE_UINT64, vd->vdev_ashift, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (pvd != NULL) {
 | 
							if (pvd != NULL) {
 | 
				
			||||||
			fm_payload_set(ereport,
 | 
								fm_payload_set(ereport,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user