log_misc.c | log_misc.c | |||
---|---|---|---|---|
skipping to change at line 28 | skipping to change at line 28 | |||
#include "logprint.h" | #include "logprint.h" | |||
#define CLEARED_BLKS (-5) | #define CLEARED_BLKS (-5) | |||
#define ZEROED_LOG (-4) | #define ZEROED_LOG (-4) | |||
#define FULL_READ (-3) | #define FULL_READ (-3) | |||
#define PARTIAL_READ (-2) | #define PARTIAL_READ (-2) | |||
#define BAD_HEADER (-1) | #define BAD_HEADER (-1) | |||
#define NO_ERROR (0) | #define NO_ERROR (0) | |||
#define XLOG_SET(f,b) (((f) & (b)) == (b)) | ||||
static int logBBsize; | static int logBBsize; | |||
char *trans_type[] = { | char *trans_type[] = { | |||
"", | "", | |||
"SETATTR", | "SETATTR", | |||
"SETATTR_SIZE", | "SETATTR_SIZE", | |||
"INACTIVE", | "INACTIVE", | |||
"CREATE", | "CREATE", | |||
"CREATE_TRUNC", | "CREATE_TRUNC", | |||
"TRUNCATE_FILE", | "TRUNCATE_FILE", | |||
"REMOVE", | "REMOVE", | |||
skipping to change at line 591 | skipping to change at line 589 | |||
memmove(&ino, &(sfep->inumber), sizeof(ino)); | memmove(&ino, &(sfep->inumber), sizeof(ino)); | |||
memmove(namebuf, (sfep->name), sfep->namelen); | memmove(namebuf, (sfep->name), sfep->namelen); | |||
namebuf[sfep->namelen] = '\0'; | namebuf[sfep->namelen] = '\0'; | |||
printf(_("%s ino 0x%llx namelen %d\n"), | printf(_("%s ino 0x%llx namelen %d\n"), | |||
namebuf, (unsigned long long)ino, sfep->namelen); | namebuf, (unsigned long long)ino, sfep->namelen); | |||
sfep = xfs_dir_sf_nextentry(sfep); | sfep = xfs_dir_sf_nextentry(sfep); | |||
} | } | |||
} | } | |||
int | int | |||
xlog_print_trans_inode(xfs_caddr_t *ptr, int len, int *i, int num_ops) | xlog_print_trans_inode(xfs_caddr_t *ptr, | |||
int len, | ||||
int *i, | ||||
int num_ops, | ||||
boolean_t continued) | ||||
{ | { | |||
xfs_icdinode_t dino; | xfs_icdinode_t dino; | |||
xlog_op_header_t *op_head; | xlog_op_header_t *op_head; | |||
xfs_inode_log_format_t dst_lbuf; | xfs_inode_log_format_t dst_lbuf; | |||
xfs_inode_log_format_64_t src_lbuf; /* buffer of biggest one */ | xfs_inode_log_format_64_t src_lbuf; /* buffer of biggest one */ | |||
xfs_inode_log_format_t *f; | xfs_inode_log_format_t *f; | |||
int mode; | int mode; | |||
int size; | int size; | |||
/* | /* | |||
skipping to change at line 613 | skipping to change at line 615 | |||
* | * | |||
* memmove to ensure 8-byte alignment for the long longs in | * memmove to ensure 8-byte alignment for the long longs in | |||
* xfs_inode_log_format_t structure | * xfs_inode_log_format_t structure | |||
* | * | |||
* len can be smaller than xfs_inode_log_format_32|64_t | * len can be smaller than xfs_inode_log_format_32|64_t | |||
* if format data is split over operations | * if format data is split over operations | |||
*/ | */ | |||
memmove(&src_lbuf, *ptr, MIN(sizeof(xfs_inode_log_format_64_t), len)); | memmove(&src_lbuf, *ptr, MIN(sizeof(xfs_inode_log_format_64_t), len)); | |||
(*i)++; /* bump index */ | (*i)++; /* bump index */ | |||
*ptr += len; | *ptr += len; | |||
if (len == sizeof(xfs_inode_log_format_32_t) || | if (!continued && | |||
len == sizeof(xfs_inode_log_format_64_t)) { | (len == sizeof(xfs_inode_log_format_32_t) || | |||
len == sizeof(xfs_inode_log_format_64_t))) { | ||||
f = xfs_inode_item_format_convert((char*)&src_lbuf, len, &dst_lbuf); | f = xfs_inode_item_format_convert((char*)&src_lbuf, len, &dst_lbuf); | |||
printf(_("INODE: ")); | printf(_("INODE: ")); | |||
printf(_("#regs: %d ino: 0x%llx flags: 0x%x dsize: %d\n"), | printf(_("#regs: %d ino: 0x%llx flags: 0x%x dsize: %d\n"), | |||
f->ilf_size, (unsigned long long)f->ilf_ino, | f->ilf_size, (unsigned long long)f->ilf_ino, | |||
f->ilf_fields, f->ilf_dsize); | f->ilf_fields, f->ilf_dsize); | |||
printf(_(" blkno: %lld len: %d boff: %d\n"), | printf(_(" blkno: %lld len: %d boff: %d\n"), | |||
(long long)f->ilf_blkno, f->ilf_len, f->ilf_boffset); | (long long)f->ilf_blkno, f->ilf_len, f->ilf_boffset); | |||
} else { | } else { | |||
ASSERT(len >= 4); /* must have at least 4 bytes if != 0 */ | ASSERT(len >= 4); /* must have at least 4 bytes if != 0 */ | |||
f = (xfs_inode_log_format_t *)&src_lbuf; | f = (xfs_inode_log_format_t *)&src_lbuf; | |||
skipping to change at line 637 | skipping to change at line 640 | |||
return f->ilf_size; | return f->ilf_size; | |||
} | } | |||
if (*i >= num_ops) /* end of LR */ | if (*i >= num_ops) /* end of LR */ | |||
return f->ilf_size-1; | return f->ilf_size-1; | |||
/* core inode comes 2nd */ | /* core inode comes 2nd */ | |||
op_head = (xlog_op_header_t *)*ptr; | op_head = (xlog_op_header_t *)*ptr; | |||
xlog_print_op_header(op_head, *i, ptr); | xlog_print_op_header(op_head, *i, ptr); | |||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | if (op_head->oh_flags & XLOG_CONTINUE_TRANS) { | |||
return f->ilf_size-1; | return f->ilf_size-1; | |||
} | } | |||
memmove(&dino, *ptr, sizeof(dino)); | memmove(&dino, *ptr, sizeof(dino)); | |||
mode = dino.di_mode & S_IFMT; | mode = dino.di_mode & S_IFMT; | |||
size = (int)dino.di_size; | size = (int)dino.di_size; | |||
xlog_print_trans_inode_core(&dino); | xlog_print_trans_inode_core(&dino); | |||
*ptr += sizeof(xfs_icdinode_t); | *ptr += sizeof(xfs_icdinode_t); | |||
if (*i == num_ops-1 && f->ilf_size == 3) { | if (*i == num_ops-1 && f->ilf_size == 3) { | |||
return 1; | return 1; | |||
} | } | |||
/* does anything come next */ | /* does anything come next */ | |||
op_head = (xlog_op_header_t *)*ptr; | op_head = (xlog_op_header_t *)*ptr; | |||
switch (f->ilf_fields & XFS_ILOG_NONCORE) { | ||||
case XFS_ILOG_DEXT: { | switch (f->ilf_fields & (XFS_ILOG_DEV | XFS_ILOG_UUID)) { | |||
ASSERT(f->ilf_size == 3); | case XFS_ILOG_DEV: | |||
(*i)++; | printf(_("DEV inode: no extra region\n")); | |||
xlog_print_op_header(op_head, *i, ptr); | break; | |||
printf(_("EXTENTS inode data\n")); | case XFS_ILOG_UUID: | |||
*ptr += be32_to_cpu(op_head->oh_len); | printf(_("UUID inode: no extra region\n")); | |||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | break; | |||
return 1; | } | |||
} | ||||
break; | /* Only the inode core is logged */ | |||
} | if (f->ilf_size == 2) | |||
case XFS_ILOG_DBROOT: { | return 0; | |||
ASSERT(f->ilf_size == 3); | ||||
(*i)++; | ASSERT(f->ilf_size <= 4); | |||
xlog_print_op_header(op_head, *i, ptr); | ASSERT((f->ilf_size == 3) || (f->ilf_fields & XFS_ILOG_AFORK)); | |||
printf(_("BTREE inode data\n")); | ||||
*ptr += be32_to_cpu(op_head->oh_len); | if (f->ilf_fields & XFS_ILOG_DFORK) { | |||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | ||||
return 1; | ||||
} | ||||
break; | ||||
} | ||||
case XFS_ILOG_DDATA: { | ||||
ASSERT(f->ilf_size == 3); | ||||
(*i)++; | ||||
xlog_print_op_header(op_head, *i, ptr); | ||||
printf(_("LOCAL inode data\n")); | ||||
if (mode == S_IFDIR) { | ||||
xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); | ||||
} | ||||
*ptr += be32_to_cpu(op_head->oh_len); | ||||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | ||||
return 1; | ||||
} | ||||
break; | ||||
} | ||||
case XFS_ILOG_AEXT: { | ||||
ASSERT(f->ilf_size == 3); | ||||
(*i)++; | (*i)++; | |||
xlog_print_op_header(op_head, *i, ptr); | xlog_print_op_header(op_head, *i, ptr); | |||
printf(_("EXTENTS inode attr\n")); | ||||
*ptr += be32_to_cpu(op_head->oh_len); | switch (f->ilf_fields & XFS_ILOG_DFORK) { | |||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | case XFS_ILOG_DEXT: | |||
return 1; | printf(_("EXTENTS inode data\n")); | |||
break; | ||||
case XFS_ILOG_DBROOT: | ||||
printf(_("BTREE inode data\n")); | ||||
break; | ||||
case XFS_ILOG_DDATA: | ||||
printf(_("LOCAL inode data\n")); | ||||
if (mode == S_IFDIR) | ||||
xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); | ||||
break; | ||||
default: | ||||
ASSERT((f->ilf_fields & XFS_ILOG_DFORK) == 0); | ||||
break; | ||||
} | } | |||
break; | ||||
} | ||||
case XFS_ILOG_ABROOT: { | ||||
ASSERT(f->ilf_size == 3); | ||||
(*i)++; | ||||
xlog_print_op_header(op_head, *i, ptr); | ||||
printf(_("BTREE inode attr\n")); | ||||
*ptr += be32_to_cpu(op_head->oh_len); | *ptr += be32_to_cpu(op_head->oh_len); | |||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | if (op_head->oh_flags & XLOG_CONTINUE_TRANS) | |||
return 1; | return 1; | |||
} | op_head = (xlog_op_header_t *)*ptr; | |||
break; | } | |||
} | ||||
case XFS_ILOG_ADATA: { | if (f->ilf_fields & XFS_ILOG_AFORK) { | |||
ASSERT(f->ilf_size == 3); | ||||
(*i)++; | (*i)++; | |||
xlog_print_op_header(op_head, *i, ptr); | xlog_print_op_header(op_head, *i, ptr); | |||
printf(_("LOCAL inode attr\n")); | ||||
if (mode == S_IFDIR) { | switch (f->ilf_fields & XFS_ILOG_AFORK) { | |||
xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); | case XFS_ILOG_AEXT: | |||
printf(_("EXTENTS attr data\n")); | ||||
break; | ||||
case XFS_ILOG_ABROOT: | ||||
printf(_("BTREE attr data\n")); | ||||
break; | ||||
case XFS_ILOG_ADATA: | ||||
printf(_("LOCAL attr data\n")); | ||||
if (mode == S_IFDIR) | ||||
xlog_print_dir_sf((xfs_dir_shortform_t*)*ptr, size); | ||||
break; | ||||
default: | ||||
ASSERT((f->ilf_fields & XFS_ILOG_AFORK) == 0); | ||||
break; | ||||
} | } | |||
*ptr += be32_to_cpu(op_head->oh_len); | *ptr += be32_to_cpu(op_head->oh_len); | |||
if (XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) { | if (op_head->oh_flags & XLOG_CONTINUE_TRANS) | |||
return 1; | return 1; | |||
} | op_head = (xlog_op_header_t *)*ptr; | |||
break; | ||||
} | ||||
case XFS_ILOG_DEV: { | ||||
ASSERT(f->ilf_size == 2); | ||||
printf(_("DEV inode: no extra region\n")); | ||||
break; | ||||
} | ||||
case XFS_ILOG_UUID: { | ||||
ASSERT(f->ilf_size == 2); | ||||
printf(_("UUID inode: no extra region\n")); | ||||
break; | ||||
} | ||||
case 0: { | ||||
ASSERT(f->ilf_size == 2); | ||||
break; | ||||
} | ||||
default: { | ||||
xlog_panic(_("xlog_print_trans_inode: illegal inode type")); | ||||
} | ||||
} | } | |||
return 0; | return 0; | |||
} /* xlog_print_trans_inode */ | } /* xlog_print_trans_inode */ | |||
int | int | |||
xlog_print_trans_dquot(xfs_caddr_t *ptr, int len, int *i, int num_ops) | xlog_print_trans_dquot(xfs_caddr_t *ptr, int len, int *i, int num_ops) | |||
{ | { | |||
xfs_dq_logformat_t *f; | xfs_dq_logformat_t *f; | |||
xfs_dq_logformat_t lbuf = {0}; | xfs_dq_logformat_t lbuf = {0}; | |||
xfs_disk_dquot_t ddq; | xfs_disk_dquot_t ddq; | |||
xlog_op_header_t *head = NULL; | xlog_op_header_t *head = NULL; | |||
skipping to change at line 937 | skipping to change at line 919 | |||
/* from extra headers */ | /* from extra headers */ | |||
j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | j = i / (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | |||
k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | k = i % (XLOG_HEADER_CYCLE_SIZE / BBSIZE); | |||
*(__be32 *)ptr = xhdrs[j-1].xh_cycle_data[k]; | *(__be32 *)ptr = xhdrs[j-1].xh_cycle_data[k]; | |||
} | } | |||
} | } | |||
ptr = buf; | ptr = buf; | |||
for (i=0; i<num_ops; i++) { | for (i=0; i<num_ops; i++) { | |||
int continued; | ||||
xlog_op_header_t *op_head = (xlog_op_header_t *)ptr; | xlog_op_header_t *op_head = (xlog_op_header_t *)ptr; | |||
print_xlog_op_line(); | print_xlog_op_line(); | |||
xlog_print_op_header(op_head, i, &ptr); | xlog_print_op_header(op_head, i, &ptr); | |||
continued = ((op_head->oh_flags & XLOG_WAS_CONT_TRANS) || | ||||
(op_head->oh_flags & XLOG_CONTINUE_TRANS)); | ||||
/* print transaction data */ | /* print transaction data */ | |||
if (print_no_data || | if (print_no_data || | |||
((XLOG_SET(op_head->oh_flags, XLOG_WAS_CONT_TRANS) || | (continued && be32_to_cpu(op_head->oh_len) == 0)) { | |||
XLOG_SET(op_head->oh_flags, XLOG_CONTINUE_TRANS)) && | ||||
be32_to_cpu(op_head->oh_len) == 0)) { | ||||
for (n = 0; n < be32_to_cpu(op_head->oh_len); n++) { | for (n = 0; n < be32_to_cpu(op_head->oh_len); n++) { | |||
printf("%c", *ptr); | printf("%c", *ptr); | |||
ptr++; | ptr++; | |||
} | } | |||
printf("\n"); | printf("\n"); | |||
continue; | continue; | |||
} | } | |||
if (xlog_print_find_tid(be32_to_cpu(op_head->oh_tid), | if (xlog_print_find_tid(be32_to_cpu(op_head->oh_tid), | |||
op_head->oh_flags & XLOG_WAS_CONT_TRANS)) { | op_head->oh_flags & XLOG_WAS_CONT_TRANS)) { | |||
printf(_("Left over region from split log item\n")); | printf(_("Left over region from split log item\n")); | |||
skipping to change at line 975 | skipping to change at line 959 | |||
switch (*(unsigned short *)ptr) { | switch (*(unsigned short *)ptr) { | |||
case XFS_LI_BUF: { | case XFS_LI_BUF: { | |||
skip = xlog_print_trans_buffer(&ptr, | skip = xlog_print_trans_buffer(&ptr, | |||
be32_to_cpu(op_head->oh_len), | be32_to_cpu(op_head->oh_len), | |||
&i, num_ops); | &i, num_ops); | |||
break; | break; | |||
} | } | |||
case XFS_LI_INODE: { | case XFS_LI_INODE: { | |||
skip = xlog_print_trans_inode(&ptr, | skip = xlog_print_trans_inode(&ptr, | |||
be32_to_cpu(op_head->oh_len), | be32_to_cpu(op_head->oh_len), | |||
&i, num_ops); | &i, num_ops, continued); | |||
break; | break; | |||
} | } | |||
case XFS_LI_DQUOT: { | case XFS_LI_DQUOT: { | |||
skip = xlog_print_trans_dquot(&ptr, | skip = xlog_print_trans_dquot(&ptr, | |||
be32_to_cpu(op_head->oh_len), | be32_to_cpu(op_head->oh_len), | |||
&i, num_ops); | &i, num_ops); | |||
break; | break; | |||
} | } | |||
case XFS_LI_EFI: { | case XFS_LI_EFI: { | |||
skip = xlog_print_trans_efi(&ptr, | skip = xlog_print_trans_efi(&ptr, | |||
End of changes. 17 change blocks. | ||||
90 lines changed or deleted | 74 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |