Beispiel #1
0
static void finish_object_list(struct work *work)
{
	struct recovery_work *rw = container_of(work, struct recovery_work,
						work);
	rw->state = RW_RUN;
	if (next_rw) {
		run_next_rw(rw);
		return;
	}
	if (!rw->count) {
		finish_recovery(rw);
		return;
	}
	/*
	 * We have got the object list to be recovered locally, most of
	 * objects are actually already being there, so let's resume
	 * requests in the hope that most requests will be processed
	 * without any problem.
	 */
	resume_wait_recovery_requests();
	rw->work.fn = recover_object_work;
	rw->work.done = recover_object_main;
	recover_next_object(rw);
	return;
}
Beispiel #2
0
void resume_suspended_recovery(void)
{
	if (recovering_work && recovering_work->suspended) {
		recovering_work->suspended = false;
		recover_next_object(recovering_work);
	}
}
Beispiel #3
0
static void recover_object_main(struct work *work)
{
	struct recovery_work *rw = container_of(work, struct recovery_work,
						work);
	if (next_rw) {
		run_next_rw(rw);
		return;
	}

	if (rw->stop) {
		/*
		 * Stop this recovery process and wait for epoch to be
		 * lifted and flush wait_obj queue to requeue those
		 * requests
		 */
		flush_wait_obj_requests();
		sd_dprintf("recovery is stopped");
		return;
	}

	resume_wait_obj_requests(rw->oids[rw->done++]);

	if (rw->done < rw->count) {
		recover_next_object(rw);
		return;
	}

	finish_recovery(rw);
}
Beispiel #4
0
static void finish_object_list(struct work *work)
{
	struct recovery_work *rw = container_of(work, struct recovery_work,
						work);
	rw->state = RW_RUN;
	if (next_rw) {
		run_next_rw(rw);
		return;
	}
	if (!rw->count) {
		finish_recovery(rw);
		return;
	}
	rw->work.fn = recover_object_work;
	rw->work.done = recover_object_main;
	recover_next_object(rw);
	return;
}