Exemplo n.º 1
0
bool_t	ready_replay( replay_slot_t sn, bool_t flg_break )
{
	if( !g_flg_reg_replay[sn] )
		return FALSE;

	if( g_replay_head[sn] == NULL ){
		g_replay_head[sn] = alloc_replay();
		g_replay_cur[sn] = g_replay_head[sn];

		if( g_replay_head[sn] == NULL )
			return FALSE;

		g_replay_cur[sn]->kind = REPLAY_KIND_KEY;
	}
	if( g_replay_cur[sn] == NULL )
		g_replay_cur[sn] = g_replay_head[sn];

	if( flg_break || (g_replay_cur[sn]->n >= REPLAY_BUF_MAX_LEN) ){
		g_replay_cur[sn]->next = alloc_replay();
		if( g_replay_cur[sn]->next == NULL )
			return FALSE;

		g_replay_cur[sn]->next->kind = g_replay_cur[sn]->kind;
		g_replay_cur[sn] = g_replay_cur[sn]->next;
	}

	return TRUE;
}
Exemplo n.º 2
0
/* Prepare log info for replay and pin logblocks. */
static struct replay *replay_prepare(struct sb *sb)
{
	if(DEBUG_MODE_K==1)
	{
		printk(KERN_INFO"%25s  %25s  %4d  #in\n",__FILE__,__func__,__LINE__);
	}
	block_t logchain = be64_to_cpu(sb->super.logchain);
	unsigned i, logcount = be32_to_cpu(sb->super.logcount);
	struct replay *rp;
	struct buffer_head *buffer;
	int err;

	/* FIXME: this address array is quick hack. Rethink about log
	 * block management and log block address. */
	rp = alloc_replay(sb, logcount);
	if (IS_ERR(rp))
		return rp;

	/* FIXME: maybe, we should use bufvec to read log blocks */
	trace("load %u logblocks", logcount);
	i = logcount;
	while (i-- > 0) {
		struct logblock *log;

		buffer = blockget(mapping(sb->logmap), i);
		if (!buffer) {
			i++;
			err = -ENOMEM;
			goto error;
		}
		assert(bufindex(buffer) == i);
		err = blockio(READ, sb, buffer, logchain);
		if (err)
			goto error;

		err = replay_check_log(rp, buffer);
		if (err)
			goto error;

		/* Store index => blocknr map */
		rp->blocknrs[bufindex(buffer)] = logchain;

		log = bufdata(buffer);
		logchain = be64_to_cpu(log->logchain);
	}

	return rp;

error:
	free_replay(rp);
	replay_unpin_logblocks(sb, i, logcount);

	return ERR_PTR(err);
}