mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Fix generation of kernel uevents for snapshot rename on linux
`zvol_rename_minors()` needs to be given the full path not just the
snapshot name.  Use code removed in a0bd735ad as a guide
to providing the necessary values.
Add ZTS check for /dev changes after snapshot rename.  After
renaming a snapshot with 'snapdev=visible' ensure that the /dev
entries are updated to reflect the rename.
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: James Dingwall <james@dingwall.me.uk>
Closes #14223 
Closes #16600
			
			
This commit is contained in:
		
							parent
							
								
									d29f257b03
								
							
						
					
					
						commit
						f53f3c3e6a
					
				@ -2975,6 +2975,7 @@ dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp,
 | 
				
			|||||||
	dsl_dataset_t *ds;
 | 
						dsl_dataset_t *ds;
 | 
				
			||||||
	uint64_t val;
 | 
						uint64_t val;
 | 
				
			||||||
	dmu_tx_t *tx = ddrsa->ddrsa_tx;
 | 
						dmu_tx_t *tx = ddrsa->ddrsa_tx;
 | 
				
			||||||
 | 
						char *oldname, *newname;
 | 
				
			||||||
	int error;
 | 
						int error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_oldsnapname, &val);
 | 
						error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_oldsnapname, &val);
 | 
				
			||||||
@ -2999,8 +3000,14 @@ dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp,
 | 
				
			|||||||
	VERIFY0(zap_add(dp->dp_meta_objset,
 | 
						VERIFY0(zap_add(dp->dp_meta_objset,
 | 
				
			||||||
	    dsl_dataset_phys(hds)->ds_snapnames_zapobj,
 | 
						    dsl_dataset_phys(hds)->ds_snapnames_zapobj,
 | 
				
			||||||
	    ds->ds_snapname, 8, 1, &ds->ds_object, tx));
 | 
						    ds->ds_snapname, 8, 1, &ds->ds_object, tx));
 | 
				
			||||||
	zvol_rename_minors(dp->dp_spa, ddrsa->ddrsa_oldsnapname,
 | 
					
 | 
				
			||||||
	    ddrsa->ddrsa_newsnapname, B_TRUE);
 | 
						oldname = kmem_asprintf("%s@%s", ddrsa->ddrsa_fsname,
 | 
				
			||||||
 | 
						    ddrsa->ddrsa_oldsnapname);
 | 
				
			||||||
 | 
						newname = kmem_asprintf("%s@%s", ddrsa->ddrsa_fsname,
 | 
				
			||||||
 | 
						    ddrsa->ddrsa_newsnapname);
 | 
				
			||||||
 | 
						zvol_rename_minors(dp->dp_spa, oldname, newname, B_TRUE);
 | 
				
			||||||
 | 
						kmem_strfree(oldname);
 | 
				
			||||||
 | 
						kmem_strfree(newname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dsl_dataset_rele(ds, FTAG);
 | 
						dsl_dataset_rele(ds, FTAG);
 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
 | 
				
			|||||||
@ -117,5 +117,18 @@ log_must zfs set snapdev=visible $TESTPOOL
 | 
				
			|||||||
verify_inherited 'snapdev' 'hidden' $SUBZVOL $VOLFS
 | 
					verify_inherited 'snapdev' 'hidden' $SUBZVOL $VOLFS
 | 
				
			||||||
blockdev_missing $SUBSNAPDEV
 | 
					blockdev_missing $SUBSNAPDEV
 | 
				
			||||||
blockdev_exists $SNAPDEV
 | 
					blockdev_exists $SNAPDEV
 | 
				
			||||||
 | 
					log_must zfs destroy $SNAP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 4. Verify "rename" is correctly reflected when "snapdev=visible"
 | 
				
			||||||
 | 
					# 4.1 First create a snapshot and verify the device is present
 | 
				
			||||||
 | 
					log_must zfs snapshot $SNAP
 | 
				
			||||||
 | 
					log_must zfs set snapdev=visible $ZVOL
 | 
				
			||||||
 | 
					blockdev_exists $SNAPDEV
 | 
				
			||||||
 | 
					# 4.2 rename the snapshot and verify the devices are updated
 | 
				
			||||||
 | 
					log_must zfs rename $SNAP $SNAP-new
 | 
				
			||||||
 | 
					blockdev_missing $SNAPDEV
 | 
				
			||||||
 | 
					blockdev_exists $SNAPDEV-new
 | 
				
			||||||
 | 
					# 4.3 cleanup
 | 
				
			||||||
 | 
					log_must zfs destroy $SNAP-new
 | 
				
			||||||
 | 
					
 | 
				
			||||||
log_pass "ZFS volume property 'snapdev' works as expected"
 | 
					log_pass "ZFS volume property 'snapdev' works as expected"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user