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/