return 1;
}
+static void
+dump_pptr(
+ const char *tag,
+ const void *name_ptr,
+ unsigned int name_len,
+ const void *value_ptr,
+ unsigned int value_len)
+{
+ const struct xfs_parent_rec *rec = value_ptr;
+
+ if (value_len < sizeof(struct xfs_parent_rec)) {
+ printf("PPTR: %s CORRUPT\n", tag);
+ return;
+ }
+
+ printf("PPTR: %s attr_namelen %u attr_valuelen %u\n", tag, name_len, value_len);
+ printf("PPTR: %s parent_ino %llu parent_gen %u name '%.*s'\n",
+ tag,
+ (unsigned long long)be64_to_cpu(rec->p_ino),
+ (unsigned int)be32_to_cpu(rec->p_gen),
+ name_len,
+ (char *)name_ptr);
+}
+
+static void
+dump_pptr_update(
+ const void *name_ptr,
+ unsigned int name_len,
+ const void *new_name_ptr,
+ unsigned int new_name_len,
+ const void *value_ptr,
+ unsigned int value_len,
+ const void *new_value_ptr,
+ unsigned int new_value_len)
+{
+ if (new_name_ptr && name_ptr) {
+ dump_pptr("OLDNAME", name_ptr, name_len, value_ptr, value_len);
+ dump_pptr("NEWNAME", new_name_ptr, new_name_len, new_value_ptr,
+ new_value_len);
+ return;
+ }
+
+ if (name_ptr)
+ dump_pptr("NAME", name_ptr, name_len, value_ptr, value_len);
+ if (new_name_ptr)
+ dump_pptr("NEWNAME", new_name_ptr, new_name_len, new_value_ptr,
+ new_value_len);
+}
+
static inline unsigned int
xfs_attr_log_item_op(const struct xfs_attri_log_format *attrp)
{
{
struct xfs_attri_log_format *src_f = NULL;
xlog_op_header_t *head = NULL;
+ void *name_ptr = NULL;
+ void *new_name_ptr = NULL;
+ void *value_ptr = NULL;
+ void *new_value_ptr = NULL;
uint dst_len;
unsigned int name_len = 0;
unsigned int new_name_len = 0;
(*i)++;
head = (xlog_op_header_t *)*ptr;
xlog_print_op_header(head, *i, ptr);
+ name_ptr = *ptr;
error = xlog_print_trans_attri_name(ptr,
be32_to_cpu(head->oh_len), "name");
if (error)
(*i)++;
head = (xlog_op_header_t *)*ptr;
xlog_print_op_header(head, *i, ptr);
+ new_name_ptr = *ptr;
error = xlog_print_trans_attri_name(ptr,
be32_to_cpu(head->oh_len), "newname");
if (error)
(*i)++;
head = (xlog_op_header_t *)*ptr;
xlog_print_op_header(head, *i, ptr);
+ value_ptr = *ptr;
error = xlog_print_trans_attri_value(ptr,
be32_to_cpu(head->oh_len), value_len, "value");
if (error)
(*i)++;
head = (xlog_op_header_t *)*ptr;
xlog_print_op_header(head, *i, ptr);
+ new_value_ptr = *ptr;
error = xlog_print_trans_attri_value(ptr,
be32_to_cpu(head->oh_len), new_value_len,
"newvalue");
if (error)
goto error;
}
+
+ if (src_f->alfi_attr_filter & XFS_ATTR_PARENT)
+ dump_pptr_update(name_ptr, name_len,
+ new_name_ptr, new_name_len,
+ value_ptr, value_len,
+ new_value_ptr, new_value_len);
error:
free(src_f);
struct xlog_recover_item *item)
{
struct xfs_attri_log_format *f, *src_f = NULL;
+ void *name_ptr = NULL;
+ void *new_name_ptr = NULL;
+ void *value_ptr = NULL;
+ void *new_value_ptr = NULL;
uint src_len, dst_len;
unsigned int name_len = 0;
unsigned int new_name_len = 0;
printf(_("ATTRI: name len:%u\n"), name_len);
print_or_dump((char *)item->ri_buf[region].i_addr,
name_len);
+ name_ptr = item->ri_buf[region].i_addr;
}
if (new_name_len > 0) {
printf(_("ATTRI: newname len:%u\n"), new_name_len);
print_or_dump((char *)item->ri_buf[region].i_addr,
new_name_len);
+ new_name_ptr = item->ri_buf[region].i_addr;
}
if (value_len > 0) {
region++;
printf(_("ATTRI: value len:%u\n"), value_len);
print_or_dump((char *)item->ri_buf[region].i_addr, len);
+ value_ptr = item->ri_buf[region].i_addr;
}
if (new_value_len > 0) {
region++;
printf(_("ATTRI: newvalue len:%u\n"), new_value_len);
print_or_dump((char *)item->ri_buf[region].i_addr, len);
+ new_value_ptr = item->ri_buf[region].i_addr;
}
+ if (src_f->alfi_attr_filter & XFS_ATTR_PARENT)
+ dump_pptr_update(name_ptr, name_len,
+ new_name_ptr, new_name_len,
+ value_ptr, value_len,
+ new_value_ptr, new_value_len);
+
out:
free(f);