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; }
void resume_suspended_recovery(void) { if (recovering_work && recovering_work->suspended) { recovering_work->suspended = false; recover_next_object(recovering_work); } }
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); }
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; }