mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	zdb: Dump encrypted write and clone ZIL records
Block pointers are not encrypted in TX_WRITE and TX_CLONE_RANGE records, so we can dump them, that may be useful for debugging. Related to #15543. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #15629
This commit is contained in:
		
							parent
							
								
									121924575e
								
							
						
					
					
						commit
						dea2d3c6cd
					
				| @ -168,7 +168,7 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, const void *arg) | |||||||
| 	    (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_offset, | 	    (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_offset, | ||||||
| 	    (u_longlong_t)lr->lr_length); | 	    (u_longlong_t)lr->lr_length); | ||||||
| 
 | 
 | ||||||
| 	if (txtype == TX_WRITE2 || verbose < 5) | 	if (txtype == TX_WRITE2 || verbose < 4) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) { | 	if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) { | ||||||
| @ -178,6 +178,8 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, const void *arg) | |||||||
| 		    "will claim" : "won't claim"); | 		    "will claim" : "won't claim"); | ||||||
| 		print_log_bp(bp, tab_prefix); | 		print_log_bp(bp, tab_prefix); | ||||||
| 
 | 
 | ||||||
|  | 		if (verbose < 5) | ||||||
|  | 			return; | ||||||
| 		if (BP_IS_HOLE(bp)) { | 		if (BP_IS_HOLE(bp)) { | ||||||
| 			(void) printf("\t\t\tLSIZE 0x%llx\n", | 			(void) printf("\t\t\tLSIZE 0x%llx\n", | ||||||
| 			    (u_longlong_t)BP_GET_LSIZE(bp)); | 			    (u_longlong_t)BP_GET_LSIZE(bp)); | ||||||
| @ -202,6 +204,9 @@ zil_prt_rec_write(zilog_t *zilog, int txtype, const void *arg) | |||||||
| 		if (error) | 		if (error) | ||||||
| 			goto out; | 			goto out; | ||||||
| 	} else { | 	} else { | ||||||
|  | 		if (verbose < 5) | ||||||
|  | 			return; | ||||||
|  | 
 | ||||||
| 		/* data is stored after the end of the lr_write record */ | 		/* data is stored after the end of the lr_write record */ | ||||||
| 		data = abd_alloc(lr->lr_length, B_FALSE); | 		data = abd_alloc(lr->lr_length, B_FALSE); | ||||||
| 		abd_copy_from_buf(data, lr + 1, lr->lr_length); | 		abd_copy_from_buf(data, lr + 1, lr->lr_length); | ||||||
| @ -217,6 +222,28 @@ out: | |||||||
| 	abd_free(data); | 	abd_free(data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void | ||||||
|  | zil_prt_rec_write_enc(zilog_t *zilog, int txtype, const void *arg) | ||||||
|  | { | ||||||
|  | 	(void) txtype; | ||||||
|  | 	const lr_write_t *lr = arg; | ||||||
|  | 	const blkptr_t *bp = &lr->lr_blkptr; | ||||||
|  | 	int verbose = MAX(dump_opt['d'], dump_opt['i']); | ||||||
|  | 
 | ||||||
|  | 	(void) printf("%s(encrypted)\n", tab_prefix); | ||||||
|  | 
 | ||||||
|  | 	if (verbose < 4) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) { | ||||||
|  | 		(void) printf("%shas blkptr, %s\n", tab_prefix, | ||||||
|  | 		    !BP_IS_HOLE(bp) && | ||||||
|  | 		    bp->blk_birth >= spa_min_claim_txg(zilog->zl_spa) ? | ||||||
|  | 		    "will claim" : "won't claim"); | ||||||
|  | 		print_log_bp(bp, tab_prefix); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| zil_prt_rec_truncate(zilog_t *zilog, int txtype, const void *arg) | zil_prt_rec_truncate(zilog_t *zilog, int txtype, const void *arg) | ||||||
| { | { | ||||||
| @ -312,11 +339,34 @@ zil_prt_rec_clone_range(zilog_t *zilog, int txtype, const void *arg) | |||||||
| { | { | ||||||
| 	(void) zilog, (void) txtype; | 	(void) zilog, (void) txtype; | ||||||
| 	const lr_clone_range_t *lr = arg; | 	const lr_clone_range_t *lr = arg; | ||||||
|  | 	int verbose = MAX(dump_opt['d'], dump_opt['i']); | ||||||
| 
 | 
 | ||||||
| 	(void) printf("%sfoid %llu, offset %llx, length %llx, blksize %llx\n", | 	(void) printf("%sfoid %llu, offset %llx, length %llx, blksize %llx\n", | ||||||
| 	    tab_prefix, (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_offset, | 	    tab_prefix, (u_longlong_t)lr->lr_foid, (u_longlong_t)lr->lr_offset, | ||||||
| 	    (u_longlong_t)lr->lr_length, (u_longlong_t)lr->lr_blksz); | 	    (u_longlong_t)lr->lr_length, (u_longlong_t)lr->lr_blksz); | ||||||
| 
 | 
 | ||||||
|  | 	if (verbose < 4) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
|  | 	for (unsigned int i = 0; i < lr->lr_nbps; i++) { | ||||||
|  | 		(void) printf("%s[%u/%llu] ", tab_prefix, i + 1, | ||||||
|  | 		    (u_longlong_t)lr->lr_nbps); | ||||||
|  | 		print_log_bp(&lr->lr_bps[i], ""); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void | ||||||
|  | zil_prt_rec_clone_range_enc(zilog_t *zilog, int txtype, const void *arg) | ||||||
|  | { | ||||||
|  | 	(void) zilog, (void) txtype; | ||||||
|  | 	const lr_clone_range_t *lr = arg; | ||||||
|  | 	int verbose = MAX(dump_opt['d'], dump_opt['i']); | ||||||
|  | 
 | ||||||
|  | 	(void) printf("%s(encrypted)\n", tab_prefix); | ||||||
|  | 
 | ||||||
|  | 	if (verbose < 4) | ||||||
|  | 		return; | ||||||
|  | 
 | ||||||
| 	for (unsigned int i = 0; i < lr->lr_nbps; i++) { | 	for (unsigned int i = 0; i < lr->lr_nbps; i++) { | ||||||
| 		(void) printf("%s[%u/%llu] ", tab_prefix, i + 1, | 		(void) printf("%s[%u/%llu] ", tab_prefix, i + 1, | ||||||
| 		    (u_longlong_t)lr->lr_nbps); | 		    (u_longlong_t)lr->lr_nbps); | ||||||
| @ -327,6 +377,7 @@ zil_prt_rec_clone_range(zilog_t *zilog, int txtype, const void *arg) | |||||||
| typedef void (*zil_prt_rec_func_t)(zilog_t *, int, const void *); | typedef void (*zil_prt_rec_func_t)(zilog_t *, int, const void *); | ||||||
| typedef struct zil_rec_info { | typedef struct zil_rec_info { | ||||||
| 	zil_prt_rec_func_t	zri_print; | 	zil_prt_rec_func_t	zri_print; | ||||||
|  | 	zil_prt_rec_func_t	zri_print_enc; | ||||||
| 	const char		*zri_name; | 	const char		*zri_name; | ||||||
| 	uint64_t		zri_count; | 	uint64_t		zri_count; | ||||||
| } zil_rec_info_t; | } zil_rec_info_t; | ||||||
| @ -341,7 +392,9 @@ static zil_rec_info_t zil_rec_info[TX_MAX_TYPE] = { | |||||||
| 	{.zri_print = zil_prt_rec_remove,   .zri_name = "TX_RMDIR           "}, | 	{.zri_print = zil_prt_rec_remove,   .zri_name = "TX_RMDIR           "}, | ||||||
| 	{.zri_print = zil_prt_rec_link,	    .zri_name = "TX_LINK            "}, | 	{.zri_print = zil_prt_rec_link,	    .zri_name = "TX_LINK            "}, | ||||||
| 	{.zri_print = zil_prt_rec_rename,   .zri_name = "TX_RENAME          "}, | 	{.zri_print = zil_prt_rec_rename,   .zri_name = "TX_RENAME          "}, | ||||||
| 	{.zri_print = zil_prt_rec_write,    .zri_name = "TX_WRITE           "}, | 	{.zri_print = zil_prt_rec_write, | ||||||
|  | 	    .zri_print_enc = zil_prt_rec_write_enc, | ||||||
|  | 	    .zri_name = "TX_WRITE           "}, | ||||||
| 	{.zri_print = zil_prt_rec_truncate, .zri_name = "TX_TRUNCATE        "}, | 	{.zri_print = zil_prt_rec_truncate, .zri_name = "TX_TRUNCATE        "}, | ||||||
| 	{.zri_print = zil_prt_rec_setattr,  .zri_name = "TX_SETATTR         "}, | 	{.zri_print = zil_prt_rec_setattr,  .zri_name = "TX_SETATTR         "}, | ||||||
| 	{.zri_print = zil_prt_rec_acl,	    .zri_name = "TX_ACL_V0          "}, | 	{.zri_print = zil_prt_rec_acl,	    .zri_name = "TX_ACL_V0          "}, | ||||||
| @ -358,6 +411,7 @@ static zil_rec_info_t zil_rec_info[TX_MAX_TYPE] = { | |||||||
| 	{.zri_print = zil_prt_rec_rename,   .zri_name = "TX_RENAME_EXCHANGE "}, | 	{.zri_print = zil_prt_rec_rename,   .zri_name = "TX_RENAME_EXCHANGE "}, | ||||||
| 	{.zri_print = zil_prt_rec_rename,   .zri_name = "TX_RENAME_WHITEOUT "}, | 	{.zri_print = zil_prt_rec_rename,   .zri_name = "TX_RENAME_WHITEOUT "}, | ||||||
| 	{.zri_print = zil_prt_rec_clone_range, | 	{.zri_print = zil_prt_rec_clone_range, | ||||||
|  | 	    .zri_print_enc = zil_prt_rec_clone_range_enc, | ||||||
| 	    .zri_name = "TX_CLONE_RANGE     "}, | 	    .zri_name = "TX_CLONE_RANGE     "}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -384,6 +438,8 @@ print_log_record(zilog_t *zilog, const lr_t *lr, void *arg, uint64_t claim_txg) | |||||||
| 	if (txtype && verbose >= 3) { | 	if (txtype && verbose >= 3) { | ||||||
| 		if (!zilog->zl_os->os_encrypted) { | 		if (!zilog->zl_os->os_encrypted) { | ||||||
| 			zil_rec_info[txtype].zri_print(zilog, txtype, lr); | 			zil_rec_info[txtype].zri_print(zilog, txtype, lr); | ||||||
|  | 		} else if (zil_rec_info[txtype].zri_print_enc) { | ||||||
|  | 			zil_rec_info[txtype].zri_print_enc(zilog, txtype, lr); | ||||||
| 		} else { | 		} else { | ||||||
| 			(void) printf("%s(encrypted)\n", tab_prefix); | 			(void) printf("%s(encrypted)\n", tab_prefix); | ||||||
| 		} | 		} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Alexander Motin
						Alexander Motin