Lines Matching refs:job

153 static void job_txn_add_job_locked(JobTxn *txn, Job *job)  in job_txn_add_job_locked()  argument
159 assert(!job->txn); in job_txn_add_job_locked()
160 job->txn = txn; in job_txn_add_job_locked()
162 QLIST_INSERT_HEAD(&txn->jobs, job, txn_list); in job_txn_add_job_locked()
167 static void job_txn_del_job_locked(Job *job) in job_txn_del_job_locked() argument
169 if (job->txn) { in job_txn_del_job_locked()
170 QLIST_REMOVE(job, txn_list); in job_txn_del_job_locked()
171 job_txn_unref_locked(job->txn); in job_txn_del_job_locked()
172 job->txn = NULL; in job_txn_del_job_locked()
177 static int job_txn_apply_locked(Job *job, int fn(Job *)) in job_txn_apply_locked() argument
180 JobTxn *txn = job->txn; in job_txn_apply_locked()
189 job_ref_locked(job); in job_txn_apply_locked()
198 job_unref_locked(job); in job_txn_apply_locked()
202 bool job_is_internal(Job *job) in job_is_internal() argument
204 return (job->id == NULL); in job_is_internal()
208 static void job_state_transition_locked(Job *job, JobStatus s1) in job_state_transition_locked() argument
210 JobStatus s0 = job->status; in job_state_transition_locked()
212 trace_job_state_transition(job, job->ret, in job_state_transition_locked()
216 job->status = s1; in job_state_transition_locked()
218 if (!job_is_internal(job) && s1 != s0) { in job_state_transition_locked()
219 qapi_event_send_job_status_change(job->id, job->status); in job_state_transition_locked()
223 int job_apply_verb_locked(Job *job, JobVerb verb, Error **errp) in job_apply_verb_locked() argument
225 JobStatus s0 = job->status; in job_apply_verb_locked()
227 trace_job_apply_verb(job, JobStatus_str(s0), JobVerb_str(verb), in job_apply_verb_locked()
233 job->id, JobStatus_str(s0), JobVerb_str(verb)); in job_apply_verb_locked()
237 JobType job_type(const Job *job) in job_type() argument
239 return job->driver->job_type; in job_type()
242 const char *job_type_str(const Job *job) in job_type_str() argument
244 return JobType_str(job_type(job)); in job_type_str()
247 bool job_is_cancelled_locked(Job *job) in job_is_cancelled_locked() argument
250 assert(job->cancelled || !job->force_cancel); in job_is_cancelled_locked()
251 return job->force_cancel; in job_is_cancelled_locked()
254 bool job_is_cancelled(Job *job) in job_is_cancelled() argument
257 return job_is_cancelled_locked(job); in job_is_cancelled()
261 static bool job_cancel_requested_locked(Job *job) in job_cancel_requested_locked() argument
263 return job->cancelled; in job_cancel_requested_locked()
266 bool job_cancel_requested(Job *job) in job_cancel_requested() argument
269 return job_cancel_requested_locked(job); in job_cancel_requested()
272 bool job_is_ready_locked(Job *job) in job_is_ready_locked() argument
274 switch (job->status) { in job_is_ready_locked()
294 bool job_is_ready(Job *job) in job_is_ready() argument
297 return job_is_ready_locked(job); in job_is_ready()
300 bool job_is_completed_locked(Job *job) in job_is_completed_locked() argument
302 switch (job->status) { in job_is_completed_locked()
322 static bool job_is_completed(Job *job) in job_is_completed() argument
325 return job_is_completed_locked(job); in job_is_completed()
328 static bool job_started_locked(Job *job) in job_started_locked() argument
330 return job->co; in job_started_locked()
334 static bool job_should_pause_locked(Job *job) in job_should_pause_locked() argument
336 return job->pause_count > 0; in job_should_pause_locked()
339 Job *job_next_locked(Job *job) in job_next_locked() argument
341 if (!job) { in job_next_locked()
344 return QLIST_NEXT(job, job_list); in job_next_locked()
347 Job *job_next(Job *job) in job_next() argument
350 return job_next_locked(job); in job_next()
355 Job *job; in job_get_locked() local
357 QLIST_FOREACH(job, &jobs, job_list) { in job_get_locked()
358 if (job->id && !strcmp(id, job->id)) { in job_get_locked()
359 return job; in job_get_locked()
366 void job_set_aio_context(Job *job, AioContext *ctx) in job_set_aio_context() argument
373 assert(job->paused || job_is_completed_locked(job)); in job_set_aio_context()
374 job->aio_context = ctx; in job_set_aio_context()
380 Job *job = opaque; in job_sleep_timer_cb() local
382 job_enter(job); in job_sleep_timer_cb()
389 Job *job; in job_create() local
411 job = g_malloc0(driver->instance_size); in job_create()
412 job->driver = driver; in job_create()
413 job->id = g_strdup(job_id); in job_create()
414 job->refcnt = 1; in job_create()
415 job->aio_context = ctx; in job_create()
416 job->busy = false; in job_create()
417 job->paused = true; in job_create()
418 job->pause_count = 1; in job_create()
419 job->auto_finalize = !(flags & JOB_MANUAL_FINALIZE); in job_create()
420 job->auto_dismiss = !(flags & JOB_MANUAL_DISMISS); in job_create()
421 job->cb = cb; in job_create()
422 job->opaque = opaque; in job_create()
424 progress_init(&job->progress); in job_create()
426 notifier_list_init(&job->on_finalize_cancelled); in job_create()
427 notifier_list_init(&job->on_finalize_completed); in job_create()
428 notifier_list_init(&job->on_pending); in job_create()
429 notifier_list_init(&job->on_ready); in job_create()
430 notifier_list_init(&job->on_idle); in job_create()
432 job_state_transition_locked(job, JOB_STATUS_CREATED); in job_create()
433 aio_timer_init(qemu_get_aio_context(), &job->sleep_timer, in job_create()
435 job_sleep_timer_cb, job); in job_create()
437 QLIST_INSERT_HEAD(&jobs, job, job_list); in job_create()
443 job_txn_add_job_locked(txn, job); in job_create()
446 job_txn_add_job_locked(txn, job); in job_create()
449 return job; in job_create()
452 void job_ref_locked(Job *job) in job_ref_locked() argument
454 ++job->refcnt; in job_ref_locked()
457 void job_unref_locked(Job *job) in job_unref_locked() argument
461 if (--job->refcnt == 0) { in job_unref_locked()
462 assert(job->status == JOB_STATUS_NULL); in job_unref_locked()
463 assert(!timer_pending(&job->sleep_timer)); in job_unref_locked()
464 assert(!job->txn); in job_unref_locked()
466 if (job->driver->free) { in job_unref_locked()
468 job->driver->free(job); in job_unref_locked()
472 QLIST_REMOVE(job, job_list); in job_unref_locked()
474 progress_destroy(&job->progress); in job_unref_locked()
475 error_free(job->err); in job_unref_locked()
476 g_free(job->id); in job_unref_locked()
477 g_free(job); in job_unref_locked()
481 void job_progress_update(Job *job, uint64_t done) in job_progress_update() argument
483 progress_work_done(&job->progress, done); in job_progress_update()
486 void job_progress_set_remaining(Job *job, uint64_t remaining) in job_progress_set_remaining() argument
488 progress_set_remaining(&job->progress, remaining); in job_progress_set_remaining()
491 void job_progress_increase_remaining(Job *job, uint64_t delta) in job_progress_increase_remaining() argument
493 progress_increase_remaining(&job->progress, delta); in job_progress_increase_remaining()
500 static void job_event_cancelled_locked(Job *job) in job_event_cancelled_locked() argument
502 notifier_list_notify(&job->on_finalize_cancelled, job); in job_event_cancelled_locked()
509 static void job_event_completed_locked(Job *job) in job_event_completed_locked() argument
511 notifier_list_notify(&job->on_finalize_completed, job); in job_event_completed_locked()
515 static void job_event_pending_locked(Job *job) in job_event_pending_locked() argument
517 notifier_list_notify(&job->on_pending, job); in job_event_pending_locked()
521 static void job_event_ready_locked(Job *job) in job_event_ready_locked() argument
523 notifier_list_notify(&job->on_ready, job); in job_event_ready_locked()
527 static void job_event_idle_locked(Job *job) in job_event_idle_locked() argument
529 notifier_list_notify(&job->on_idle, job); in job_event_idle_locked()
532 void job_enter_cond_locked(Job *job, bool(*fn)(Job *job)) in job_enter_cond_locked() argument
534 if (!job_started_locked(job)) { in job_enter_cond_locked()
537 if (job->deferred_to_main_loop) { in job_enter_cond_locked()
541 if (job->busy) { in job_enter_cond_locked()
545 if (fn && !fn(job)) { in job_enter_cond_locked()
549 assert(!job->deferred_to_main_loop); in job_enter_cond_locked()
550 timer_del(&job->sleep_timer); in job_enter_cond_locked()
551 job->busy = true; in job_enter_cond_locked()
553 aio_co_wake(job->co); in job_enter_cond_locked()
557 void job_enter(Job *job) in job_enter() argument
560 job_enter_cond_locked(job, NULL); in job_enter()
572 static void coroutine_fn job_do_yield_locked(Job *job, uint64_t ns) in job_do_yield_locked() argument
577 timer_mod(&job->sleep_timer, ns); in job_do_yield_locked()
579 job->busy = false; in job_do_yield_locked()
580 job_event_idle_locked(job); in job_do_yield_locked()
585 next_aio_context = job->aio_context; in job_do_yield_locked()
595 next_aio_context = job->aio_context; in job_do_yield_locked()
599 assert(job->busy); in job_do_yield_locked()
603 static void coroutine_fn job_pause_point_locked(Job *job) in job_pause_point_locked() argument
605 assert(job && job_started_locked(job)); in job_pause_point_locked()
607 if (!job_should_pause_locked(job)) { in job_pause_point_locked()
610 if (job_is_cancelled_locked(job)) { in job_pause_point_locked()
614 if (job->driver->pause) { in job_pause_point_locked()
616 job->driver->pause(job); in job_pause_point_locked()
620 if (job_should_pause_locked(job) && !job_is_cancelled_locked(job)) { in job_pause_point_locked()
621 JobStatus status = job->status; in job_pause_point_locked()
622 job_state_transition_locked(job, status == JOB_STATUS_READY in job_pause_point_locked()
625 job->paused = true; in job_pause_point_locked()
626 job_do_yield_locked(job, -1); in job_pause_point_locked()
627 job->paused = false; in job_pause_point_locked()
628 job_state_transition_locked(job, status); in job_pause_point_locked()
631 if (job->driver->resume) { in job_pause_point_locked()
633 job->driver->resume(job); in job_pause_point_locked()
638 void coroutine_fn job_pause_point(Job *job) in job_pause_point() argument
641 job_pause_point_locked(job); in job_pause_point()
644 void coroutine_fn job_yield(Job *job) in job_yield() argument
647 assert(job->busy); in job_yield()
650 if (job_is_cancelled_locked(job)) { in job_yield()
654 if (!job_should_pause_locked(job)) { in job_yield()
655 job_do_yield_locked(job, -1); in job_yield()
658 job_pause_point_locked(job); in job_yield()
661 void coroutine_fn job_sleep_ns(Job *job, int64_t ns) in job_sleep_ns() argument
664 assert(job->busy); in job_sleep_ns()
667 if (job_is_cancelled_locked(job)) { in job_sleep_ns()
671 if (!job_should_pause_locked(job)) { in job_sleep_ns()
672 job_do_yield_locked(job, qemu_clock_get_ns(QEMU_CLOCK_REALTIME) + ns); in job_sleep_ns()
675 job_pause_point_locked(job); in job_sleep_ns()
679 static bool job_timer_not_pending_locked(Job *job) in job_timer_not_pending_locked() argument
681 return !timer_pending(&job->sleep_timer); in job_timer_not_pending_locked()
684 void job_pause_locked(Job *job) in job_pause_locked() argument
686 job->pause_count++; in job_pause_locked()
687 if (!job->paused) { in job_pause_locked()
688 job_enter_cond_locked(job, NULL); in job_pause_locked()
692 void job_pause(Job *job) in job_pause() argument
695 job_pause_locked(job); in job_pause()
698 void job_resume_locked(Job *job) in job_resume_locked() argument
700 assert(job->pause_count > 0); in job_resume_locked()
701 job->pause_count--; in job_resume_locked()
702 if (job->pause_count) { in job_resume_locked()
707 job_enter_cond_locked(job, job_timer_not_pending_locked); in job_resume_locked()
710 void job_resume(Job *job) in job_resume() argument
713 job_resume_locked(job); in job_resume()
716 void job_user_pause_locked(Job *job, Error **errp) in job_user_pause_locked() argument
718 if (job_apply_verb_locked(job, JOB_VERB_PAUSE, errp)) { in job_user_pause_locked()
721 if (job->user_paused) { in job_user_pause_locked()
725 job->user_paused = true; in job_user_pause_locked()
726 job_pause_locked(job); in job_user_pause_locked()
729 bool job_user_paused_locked(Job *job) in job_user_paused_locked() argument
731 return job->user_paused; in job_user_paused_locked()
734 void job_user_resume_locked(Job *job, Error **errp) in job_user_resume_locked() argument
736 assert(job); in job_user_resume_locked()
738 if (!job->user_paused || job->pause_count <= 0) { in job_user_resume_locked()
742 if (job_apply_verb_locked(job, JOB_VERB_RESUME, errp)) { in job_user_resume_locked()
745 if (job->driver->user_resume) { in job_user_resume_locked()
747 job->driver->user_resume(job); in job_user_resume_locked()
750 job->user_paused = false; in job_user_resume_locked()
751 job_resume_locked(job); in job_user_resume_locked()
755 static void job_do_dismiss_locked(Job *job) in job_do_dismiss_locked() argument
757 assert(job); in job_do_dismiss_locked()
758 job->busy = false; in job_do_dismiss_locked()
759 job->paused = false; in job_do_dismiss_locked()
760 job->deferred_to_main_loop = true; in job_do_dismiss_locked()
762 job_txn_del_job_locked(job); in job_do_dismiss_locked()
764 job_state_transition_locked(job, JOB_STATUS_NULL); in job_do_dismiss_locked()
765 job_unref_locked(job); in job_do_dismiss_locked()
770 Job *job = *jobptr; in job_dismiss_locked() local
772 assert(job->id); in job_dismiss_locked()
773 if (job_apply_verb_locked(job, JOB_VERB_DISMISS, errp)) { in job_dismiss_locked()
777 job_do_dismiss_locked(job); in job_dismiss_locked()
781 void job_early_fail(Job *job) in job_early_fail() argument
784 assert(job->status == JOB_STATUS_CREATED); in job_early_fail()
785 job_do_dismiss_locked(job); in job_early_fail()
789 static void job_conclude_locked(Job *job) in job_conclude_locked() argument
791 job_state_transition_locked(job, JOB_STATUS_CONCLUDED); in job_conclude_locked()
792 if (job->auto_dismiss || !job_started_locked(job)) { in job_conclude_locked()
793 job_do_dismiss_locked(job); in job_conclude_locked()
798 static void job_update_rc_locked(Job *job) in job_update_rc_locked() argument
800 if (!job->ret && job_is_cancelled_locked(job)) { in job_update_rc_locked()
801 job->ret = -ECANCELED; in job_update_rc_locked()
803 if (job->ret) { in job_update_rc_locked()
804 if (!job->err) { in job_update_rc_locked()
805 error_setg(&job->err, "%s", strerror(-job->ret)); in job_update_rc_locked()
807 job_state_transition_locked(job, JOB_STATUS_ABORTING); in job_update_rc_locked()
811 static void job_commit(Job *job) in job_commit() argument
813 assert(!job->ret); in job_commit()
815 if (job->driver->commit) { in job_commit()
816 job->driver->commit(job); in job_commit()
820 static void job_abort(Job *job) in job_abort() argument
822 assert(job->ret); in job_abort()
824 if (job->driver->abort) { in job_abort()
825 job->driver->abort(job); in job_abort()
829 static void job_clean(Job *job) in job_clean() argument
832 if (job->driver->clean) { in job_clean()
833 job->driver->clean(job); in job_clean()
840 static int job_finalize_single_locked(Job *job) in job_finalize_single_locked() argument
844 assert(job_is_completed_locked(job)); in job_finalize_single_locked()
847 job_update_rc_locked(job); in job_finalize_single_locked()
849 job_ret = job->ret; in job_finalize_single_locked()
853 job_commit(job); in job_finalize_single_locked()
855 job_abort(job); in job_finalize_single_locked()
857 job_clean(job); in job_finalize_single_locked()
859 if (job->cb) { in job_finalize_single_locked()
860 job->cb(job->opaque, job_ret); in job_finalize_single_locked()
866 if (job_started_locked(job)) { in job_finalize_single_locked()
867 if (job_is_cancelled_locked(job)) { in job_finalize_single_locked()
868 job_event_cancelled_locked(job); in job_finalize_single_locked()
870 job_event_completed_locked(job); in job_finalize_single_locked()
874 job_txn_del_job_locked(job); in job_finalize_single_locked()
875 job_conclude_locked(job); in job_finalize_single_locked()
882 static void job_cancel_async_locked(Job *job, bool force) in job_cancel_async_locked() argument
885 if (job->driver->cancel) { in job_cancel_async_locked()
887 force = job->driver->cancel(job, force); in job_cancel_async_locked()
894 if (job->user_paused) { in job_cancel_async_locked()
896 if (job->driver->user_resume) { in job_cancel_async_locked()
898 job->driver->user_resume(job); in job_cancel_async_locked()
901 job->user_paused = false; in job_cancel_async_locked()
902 assert(job->pause_count > 0); in job_cancel_async_locked()
903 job->pause_count--; in job_cancel_async_locked()
913 if (force || !job->deferred_to_main_loop) { in job_cancel_async_locked()
914 job->cancelled = true; in job_cancel_async_locked()
916 job->force_cancel |= force; in job_cancel_async_locked()
923 static void job_completed_txn_abort_locked(Job *job) in job_completed_txn_abort_locked() argument
925 JobTxn *txn = job->txn; in job_completed_txn_abort_locked()
937 job_ref_locked(job); in job_completed_txn_abort_locked()
943 if (other_job != job) { in job_completed_txn_abort_locked()
961 job_unref_locked(job); in job_completed_txn_abort_locked()
966 static int job_prepare_locked(Job *job) in job_prepare_locked() argument
972 if (job->ret == 0 && job->driver->prepare) { in job_prepare_locked()
974 ret = job->driver->prepare(job); in job_prepare_locked()
976 job->ret = ret; in job_prepare_locked()
977 job_update_rc_locked(job); in job_prepare_locked()
980 return job->ret; in job_prepare_locked()
984 static int job_needs_finalize_locked(Job *job) in job_needs_finalize_locked() argument
986 return !job->auto_finalize; in job_needs_finalize_locked()
990 static void job_do_finalize_locked(Job *job) in job_do_finalize_locked() argument
993 assert(job && job->txn); in job_do_finalize_locked()
996 rc = job_txn_apply_locked(job, job_prepare_locked); in job_do_finalize_locked()
998 job_completed_txn_abort_locked(job); in job_do_finalize_locked()
1000 job_txn_apply_locked(job, job_finalize_single_locked); in job_do_finalize_locked()
1004 void job_finalize_locked(Job *job, Error **errp) in job_finalize_locked() argument
1006 assert(job && job->id); in job_finalize_locked()
1007 if (job_apply_verb_locked(job, JOB_VERB_FINALIZE, errp)) { in job_finalize_locked()
1010 job_do_finalize_locked(job); in job_finalize_locked()
1014 static int job_transition_to_pending_locked(Job *job) in job_transition_to_pending_locked() argument
1016 job_state_transition_locked(job, JOB_STATUS_PENDING); in job_transition_to_pending_locked()
1017 if (!job->auto_finalize) { in job_transition_to_pending_locked()
1018 job_event_pending_locked(job); in job_transition_to_pending_locked()
1023 void job_transition_to_ready(Job *job) in job_transition_to_ready() argument
1026 job_state_transition_locked(job, JOB_STATUS_READY); in job_transition_to_ready()
1027 job_event_ready_locked(job); in job_transition_to_ready()
1031 static void job_completed_txn_success_locked(Job *job) in job_completed_txn_success_locked() argument
1033 JobTxn *txn = job->txn; in job_completed_txn_success_locked()
1036 job_state_transition_locked(job, JOB_STATUS_WAITING); in job_completed_txn_success_locked()
1049 job_txn_apply_locked(job, job_transition_to_pending_locked); in job_completed_txn_success_locked()
1052 if (job_txn_apply_locked(job, job_needs_finalize_locked) == 0) { in job_completed_txn_success_locked()
1053 job_do_finalize_locked(job); in job_completed_txn_success_locked()
1058 static void job_completed_locked(Job *job) in job_completed_locked() argument
1060 assert(job && job->txn && !job_is_completed_locked(job)); in job_completed_locked()
1062 job_update_rc_locked(job); in job_completed_locked()
1063 trace_job_completed(job, job->ret); in job_completed_locked()
1064 if (job->ret) { in job_completed_locked()
1065 job_completed_txn_abort_locked(job); in job_completed_locked()
1067 job_completed_txn_success_locked(job); in job_completed_locked()
1077 Job *job = (Job *)opaque; in job_exit() local
1079 job_ref_locked(job); in job_exit()
1085 job->busy = false; in job_exit()
1086 job_event_idle_locked(job); in job_exit()
1088 job_completed_locked(job); in job_exit()
1089 job_unref_locked(job); in job_exit()
1098 Job *job = opaque; in job_co_entry() local
1101 assert(job && job->driver && job->driver->run); in job_co_entry()
1103 assert(job->aio_context == qemu_get_current_aio_context()); in job_co_entry()
1104 job_pause_point_locked(job); in job_co_entry()
1106 ret = job->driver->run(job, &job->err); in job_co_entry()
1108 job->ret = ret; in job_co_entry()
1109 job->deferred_to_main_loop = true; in job_co_entry()
1110 job->busy = true; in job_co_entry()
1112 aio_bh_schedule_oneshot(qemu_get_aio_context(), job_exit, job); in job_co_entry()
1115 void job_start(Job *job) in job_start() argument
1120 assert(job && !job_started_locked(job) && job->paused && in job_start()
1121 job->driver && job->driver->run); in job_start()
1122 job->co = qemu_coroutine_create(job_co_entry, job); in job_start()
1123 job->pause_count--; in job_start()
1124 job->busy = true; in job_start()
1125 job->paused = false; in job_start()
1126 job_state_transition_locked(job, JOB_STATUS_RUNNING); in job_start()
1128 aio_co_enter(job->aio_context, job->co); in job_start()
1131 void job_cancel_locked(Job *job, bool force) in job_cancel_locked() argument
1133 if (job->status == JOB_STATUS_CONCLUDED) { in job_cancel_locked()
1134 job_do_dismiss_locked(job); in job_cancel_locked()
1137 job_cancel_async_locked(job, force); in job_cancel_locked()
1138 if (!job_started_locked(job)) { in job_cancel_locked()
1139 job_completed_locked(job); in job_cancel_locked()
1140 } else if (job->deferred_to_main_loop) { in job_cancel_locked()
1151 if (job_is_cancelled_locked(job)) { in job_cancel_locked()
1152 job_completed_txn_abort_locked(job); in job_cancel_locked()
1155 job_enter_cond_locked(job, NULL); in job_cancel_locked()
1159 void job_user_cancel_locked(Job *job, bool force, Error **errp) in job_user_cancel_locked() argument
1161 if (job_apply_verb_locked(job, JOB_VERB_CANCEL, errp)) { in job_user_cancel_locked()
1164 job_cancel_locked(job, force); in job_user_cancel_locked()
1173 static void job_cancel_err_locked(Job *job, Error **errp) in job_cancel_err_locked() argument
1175 job_cancel_locked(job, false); in job_cancel_err_locked()
1182 static void job_force_cancel_err_locked(Job *job, Error **errp) in job_force_cancel_err_locked() argument
1184 job_cancel_locked(job, true); in job_force_cancel_err_locked()
1187 int job_cancel_sync_locked(Job *job, bool force) in job_cancel_sync_locked() argument
1190 return job_finish_sync_locked(job, &job_force_cancel_err_locked, NULL); in job_cancel_sync_locked()
1192 return job_finish_sync_locked(job, &job_cancel_err_locked, NULL); in job_cancel_sync_locked()
1196 int job_cancel_sync(Job *job, bool force) in job_cancel_sync() argument
1199 return job_cancel_sync_locked(job, force); in job_cancel_sync()
1204 Job *job; in job_cancel_sync_all() local
1207 while ((job = job_next_locked(NULL))) { in job_cancel_sync_all()
1208 job_cancel_sync_locked(job, true); in job_cancel_sync_all()
1212 int job_complete_sync_locked(Job *job, Error **errp) in job_complete_sync_locked() argument
1214 return job_finish_sync_locked(job, job_complete_locked, errp); in job_complete_sync_locked()
1217 void job_complete_locked(Job *job, Error **errp) in job_complete_locked() argument
1220 assert(job->id); in job_complete_locked()
1222 if (job_apply_verb_locked(job, JOB_VERB_COMPLETE, errp)) { in job_complete_locked()
1225 if (job_cancel_requested_locked(job) || !job->driver->complete) { in job_complete_locked()
1227 job->id); in job_complete_locked()
1232 job->driver->complete(job, errp); in job_complete_locked()
1236 int job_finish_sync_locked(Job *job, in job_finish_sync_locked() argument
1244 job_ref_locked(job); in job_finish_sync_locked()
1247 finish(job, &local_err); in job_finish_sync_locked()
1251 job_unref_locked(job); in job_finish_sync_locked()
1256 AIO_WAIT_WHILE_UNLOCKED(job->aio_context, in job_finish_sync_locked()
1257 (job_enter(job), !job_is_completed(job))); in job_finish_sync_locked()
1260 ret = (job_is_cancelled_locked(job) && job->ret == 0) in job_finish_sync_locked()
1261 ? -ECANCELED : job->ret; in job_finish_sync_locked()
1262 job_unref_locked(job); in job_finish_sync_locked()