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_length); | ||||
| 
 | ||||
| 	if (txtype == TX_WRITE2 || verbose < 5) | ||||
| 	if (txtype == TX_WRITE2 || verbose < 4) | ||||
| 		return; | ||||
| 
 | ||||
| 	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"); | ||||
| 		print_log_bp(bp, tab_prefix); | ||||
| 
 | ||||
| 		if (verbose < 5) | ||||
| 			return; | ||||
| 		if (BP_IS_HOLE(bp)) { | ||||
| 			(void) printf("\t\t\tLSIZE 0x%llx\n", | ||||
| 			    (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) | ||||
| 			goto out; | ||||
| 	} else { | ||||
| 		if (verbose < 5) | ||||
| 			return; | ||||
| 
 | ||||
| 		/* data is stored after the end of the lr_write record */ | ||||
| 		data = abd_alloc(lr->lr_length, B_FALSE); | ||||
| 		abd_copy_from_buf(data, lr + 1, lr->lr_length); | ||||
| @ -217,6 +222,28 @@ out: | ||||
| 	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 | ||||
| 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; | ||||
| 	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", | ||||
| 	    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); | ||||
| 
 | ||||
| 	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++) { | ||||
| 		(void) printf("%s[%u/%llu] ", tab_prefix, i + 1, | ||||
| 		    (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 struct zil_rec_info { | ||||
| 	zil_prt_rec_func_t	zri_print; | ||||
| 	zil_prt_rec_func_t	zri_print_enc; | ||||
| 	const char		*zri_name; | ||||
| 	uint64_t		zri_count; | ||||
| } 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_link,	    .zri_name = "TX_LINK            "}, | ||||
| 	{.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_setattr,  .zri_name = "TX_SETATTR         "}, | ||||
| 	{.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_WHITEOUT "}, | ||||
| 	{.zri_print = zil_prt_rec_clone_range, | ||||
| 	    .zri_print_enc = zil_prt_rec_clone_range_enc, | ||||
| 	    .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 (!zilog->zl_os->os_encrypted) { | ||||
| 			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 { | ||||
| 			(void) printf("%s(encrypted)\n", tab_prefix); | ||||
| 		} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Alexander Motin
						Alexander Motin