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
86239a5b9c
commit
f9765b182e
|
@ -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