/** * Read logpack header sector from log device. * * @fd log device fd opened. * @super_sectp super sector. * @lsid logpack lsid to read. * @logh_sect buffer to store logpack header data. * This allocated size must be sector size. * @salt log checksum salt. * * RETURN: * ture in success, or false. */ bool read_logpack_header_from_wldev( int fd, const struct walb_super_sector* super_sectp, u64 lsid, u32 salt, struct sector_data *logh_sect) { /* calc offset in the ring buffer */ u64 ring_buffer_offset = get_ring_buffer_offset_2(super_sectp); u64 ring_buffer_size = super_sectp->ring_buffer_size; u64 off = ring_buffer_offset + lsid % ring_buffer_size; struct walb_logpack_header *logh = get_logpack_header(logh_sect); /* read sector */ if (!sector_read(fd, off, logh_sect)) { LOGe("read logpack header (lsid %"PRIu64") failed.\n", lsid); return false; } /* check lsid */ if (lsid != logh->logpack_lsid) { LOGe("lsid (given %"PRIu64" read %"PRIu64") is invalid.\n", lsid, logh->logpack_lsid); return false; } if (!is_valid_logpack_header_with_checksum( logh, super_sectp->physical_bs, salt)) { LOGe("check logpack header failed.\n"); return false; } return true; }
/** * Print super sector for debug. * This will be obsolute. Use print_super_sector() instead. */ void print_super_sector_raw(const struct walb_super_sector* super_sect) { ASSERT(super_sect); printf("checksum: %08x\n" "logical_bs: %u\n" "physical_bs: %u\n" "metadata_size: %u\n" "log_checksum_salt: %"PRIu32"\n", super_sect->checksum, super_sect->logical_bs, super_sect->physical_bs, super_sect->metadata_size, super_sect->log_checksum_salt); printf("uuid: "); print_uuid(super_sect->uuid); printf("\n" "name: \"%s\"\n" "ring_buffer_size: %lu\n" "oldest_lsid: %lu\n" "written_lsid: %lu\n" "device_size: %lu\n", super_sect->name, super_sect->ring_buffer_size, super_sect->oldest_lsid, super_sect->written_lsid, super_sect->device_size); printf("ring_buffer_offset: %lu\n", get_ring_buffer_offset_2(super_sect)); }