int get_bat(server *srv, chunkqueue *cq, vhd_state_t *state, off_t *curr_off) { int err; vhd_context_t *vhd = &state->vhd; err = fill(srv, cq, vhd->bat.bat, state->bat_buf_size, vhd->header.table_offset, curr_off); if (((off_t)(*curr_off)) < vhd->header.table_offset + state->bat_buf_size) return 0; DEBUGLOG("s", "BAT all in"); vhd_bat_in(&vhd->bat); state->vhd_ready = 1; return 0; }
static int vhd_journal_read_bat(vhd_journal_t *j, vhd_bat_t *bat) { int err; size_t size; vhd_context_t *vhd; vhd_journal_entry_t entry; void *_bat; vhd = &j->vhd; size = vhd_bytes_padded(vhd->header.max_bat_size * sizeof(uint32_t)); err = vhd_journal_read_entry(j, &entry); if (err) return err; if (entry.type != VHD_JOURNAL_ENTRY_TYPE_BAT) return -EINVAL; if (entry.size != size) return -EINVAL; if (entry.offset != vhd->header.table_offset) return -EINVAL; err = posix_memalign(&_bat, VHD_SECTOR_SIZE, size); if (err) return -err; bat->bat = _bat; err = vhd_journal_read(j, bat->bat, entry.size); if (err) goto fail; bat->spb = vhd->header.block_size >> VHD_SECTOR_SHIFT; bat->entries = vhd->header.max_bat_size; vhd_bat_in(bat); return 0; fail: free(bat->bat); bat->bat = NULL; return err; }