Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}