Lines Matching +full:bl +full:- +full:name

4  * Copyright (C) 2016-2017 Red Hat, Inc.
29 #include "qemu/config-file.h"
30 #include "block/block-io.h"
35 #include "qapi/qapi-visit-block-core.h"
39 #include "qapi/qobject-input-visitor.h"
42 /* All APIs are thread-safe */
116 .name = "inject-error",
120 .name = "event",
124 .name = "state",
128 .name = "iotype",
132 .name = "errno",
136 .name = "sector",
140 .name = "once",
144 .name = "immediately",
152 .name = "set-state",
156 .name = "event",
160 .name = "state",
164 .name = "new_state",
185 BDRVBlkdebugState *s = d->s; in add_rule()
196 error_setg(errp, "Missing event name for rule"); in add_rule()
197 return -1; in add_rule()
199 event = qapi_enum_parse(&BlkdebugEvent_lookup, event_name, -1, errp); in add_rule()
201 return -1; in add_rule()
208 .action = d->action, in add_rule()
212 /* Parse action-specific options */ in add_rule()
213 switch (d->action) { in add_rule()
215 rule->options.inject.error = qemu_opt_get_number(opts, "errno", EIO); in add_rule()
216 rule->options.inject.once = qemu_opt_get_bool(opts, "once", 0); in add_rule()
217 rule->options.inject.immediately = in add_rule()
219 sector = qemu_opt_get_number(opts, "sector", -1); in add_rule()
220 rule->options.inject.offset = in add_rule()
221 sector == -1 ? -1 : sector * BDRV_SECTOR_SIZE; in add_rule()
229 return -1; in add_rule()
232 rule->options.inject.iotype_mask = (1ull << iotype); in add_rule()
235 rule->options.inject.iotype_mask = in add_rule()
246 rule->options.set_state.new_state = in add_rule()
251 rule->options.suspend.tag = in add_rule()
257 qemu_mutex_lock(&s->lock); in add_rule()
258 QLIST_INSERT_HEAD(&s->rules[event], rule, next); in add_rule()
259 qemu_mutex_unlock(&s->lock); in add_rule()
267 switch (rule->action) { in remove_rule()
272 g_free(rule->options.suspend.tag); in remove_rule()
292 return -errno; in read_config()
302 ret = -EINVAL; in read_config()
311 ret = -EINVAL; in read_config()
319 ret = -EINVAL; in read_config()
343 qdict_put_str(options, "x-image", filename); in blkdebug_parse_filename()
356 config_path = qstring_from_substr(filename, 0, c - filename); in blkdebug_parse_filename()
360 /* TODO Allow multi-level nesting and set file.filename here */ in blkdebug_parse_filename()
362 qdict_put_str(options, "x-image", filename); in blkdebug_parse_filename()
383 ret = -EINVAL; in blkdebug_parse_perm_list()
389 ret = -EINVAL; in blkdebug_parse_perm_list()
393 for (element = perm_list; element; element = element->next) { in blkdebug_parse_perm_list()
394 *dest |= bdrv_qapi_perm_to_blk_perm(element->value); in blkdebug_parse_perm_list()
410 ret = blkdebug_parse_perm_list(&s->take_child_perms, options, in blkdebug_parse_perms()
411 "take-child-perms.", errp); in blkdebug_parse_perms()
416 ret = blkdebug_parse_perm_list(&s->unshare_child_perms, options, in blkdebug_parse_perms()
417 "unshare-child-perms.", errp); in blkdebug_parse_perms()
426 .name = "blkdebug",
430 .name = "config",
435 .name = "x-image",
440 .name = "align",
445 .name = "max-transfer",
450 .name = "opt-write-zero",
455 .name = "max-write-zero",
460 .name = "opt-discard",
465 .name = "max-discard",
476 BDRVBlkdebugState *s = bs->opaque; in blkdebug_open()
481 qemu_mutex_init(&s->lock); in blkdebug_open()
484 ret = -EINVAL; in blkdebug_open()
489 s->config_file = g_strdup(qemu_opt_get(opts, "config")); in blkdebug_open()
490 ret = read_config(s, s->config_file, options, errp); in blkdebug_open()
496 s->state = 1; in blkdebug_open()
505 ret = bdrv_open_file_child(qemu_opt_get(opts, "x-image"), options, "image", in blkdebug_open()
513 bs->supported_write_flags = BDRV_REQ_WRITE_UNCHANGED | in blkdebug_open()
514 (BDRV_REQ_FUA & bs->file->bs->supported_write_flags); in blkdebug_open()
515 bs->supported_zero_flags = BDRV_REQ_WRITE_UNCHANGED | in blkdebug_open()
517 bs->file->bs->supported_zero_flags); in blkdebug_open()
518 ret = -EINVAL; in blkdebug_open()
521 s->align = qemu_opt_get_size(opts, "align", 0); in blkdebug_open()
522 if (s->align && (s->align >= INT_MAX || !is_power_of_2(s->align))) { in blkdebug_open()
524 s->align); in blkdebug_open()
527 align = MAX(s->align, bs->file->bs->bl.request_alignment); in blkdebug_open()
529 s->max_transfer = qemu_opt_get_size(opts, "max-transfer", 0); in blkdebug_open()
530 if (s->max_transfer && in blkdebug_open()
531 (s->max_transfer >= INT_MAX || in blkdebug_open()
532 !QEMU_IS_ALIGNED(s->max_transfer, align))) { in blkdebug_open()
533 error_setg(errp, "Cannot meet constraints with max-transfer %" PRIu64, in blkdebug_open()
534 s->max_transfer); in blkdebug_open()
538 s->opt_write_zero = qemu_opt_get_size(opts, "opt-write-zero", 0); in blkdebug_open()
539 if (s->opt_write_zero && in blkdebug_open()
540 (s->opt_write_zero >= INT_MAX || in blkdebug_open()
541 !QEMU_IS_ALIGNED(s->opt_write_zero, align))) { in blkdebug_open()
542 error_setg(errp, "Cannot meet constraints with opt-write-zero %" PRIu64, in blkdebug_open()
543 s->opt_write_zero); in blkdebug_open()
547 s->max_write_zero = qemu_opt_get_size(opts, "max-write-zero", 0); in blkdebug_open()
548 if (s->max_write_zero && in blkdebug_open()
549 (s->max_write_zero >= INT_MAX || in blkdebug_open()
550 !QEMU_IS_ALIGNED(s->max_write_zero, in blkdebug_open()
551 MAX(s->opt_write_zero, align)))) { in blkdebug_open()
552 error_setg(errp, "Cannot meet constraints with max-write-zero %" PRIu64, in blkdebug_open()
553 s->max_write_zero); in blkdebug_open()
557 s->opt_discard = qemu_opt_get_size(opts, "opt-discard", 0); in blkdebug_open()
558 if (s->opt_discard && in blkdebug_open()
559 (s->opt_discard >= INT_MAX || in blkdebug_open()
560 !QEMU_IS_ALIGNED(s->opt_discard, align))) { in blkdebug_open()
561 error_setg(errp, "Cannot meet constraints with opt-discard %" PRIu64, in blkdebug_open()
562 s->opt_discard); in blkdebug_open()
566 s->max_discard = qemu_opt_get_size(opts, "max-discard", 0); in blkdebug_open()
567 if (s->max_discard && in blkdebug_open()
568 (s->max_discard >= INT_MAX || in blkdebug_open()
569 !QEMU_IS_ALIGNED(s->max_discard, in blkdebug_open()
570 MAX(s->opt_discard, align)))) { in blkdebug_open()
571 error_setg(errp, "Cannot meet constraints with max-discard %" PRIu64, in blkdebug_open()
572 s->max_discard); in blkdebug_open()
583 qemu_mutex_destroy(&s->lock); in blkdebug_open()
584 g_free(s->config_file); in blkdebug_open()
593 BDRVBlkdebugState *s = bs->opaque; in rule_check()
598 qemu_mutex_lock(&s->lock); in rule_check()
599 QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { in rule_check()
600 uint64_t inject_offset = rule->options.inject.offset; in rule_check()
602 if ((inject_offset == -1 || in rule_check()
605 (rule->options.inject.iotype_mask & (1ull << iotype))) in rule_check()
611 if (!rule || !rule->options.inject.error) { in rule_check()
612 qemu_mutex_unlock(&s->lock); in rule_check()
616 immediately = rule->options.inject.immediately; in rule_check()
617 error = rule->options.inject.error; in rule_check()
619 if (rule->options.inject.once) { in rule_check()
620 QSIMPLEQ_REMOVE(&s->active_rules, rule, BlkdebugRule, active_next); in rule_check()
624 qemu_mutex_unlock(&s->lock); in rule_check()
630 return -error; in rule_check()
640 assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); in blkdebug_co_preadv()
641 assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment)); in blkdebug_co_preadv()
642 if (bs->bl.max_transfer) { in blkdebug_co_preadv()
643 assert(bytes <= bs->bl.max_transfer); in blkdebug_co_preadv()
651 return bdrv_co_preadv(bs->file, offset, bytes, qiov, flags); in blkdebug_co_preadv()
661 assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); in blkdebug_co_pwritev()
662 assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment)); in blkdebug_co_pwritev()
663 if (bs->bl.max_transfer) { in blkdebug_co_pwritev()
664 assert(bytes <= bs->bl.max_transfer); in blkdebug_co_pwritev()
672 return bdrv_co_pwritev(bs->file, offset, bytes, qiov, flags); in blkdebug_co_pwritev()
683 return bdrv_co_flush(bs->file->bs); in blkdebug_co_flush()
690 uint32_t align = MAX(bs->bl.request_alignment, in blkdebug_co_pwrite_zeroes()
691 bs->bl.pwrite_zeroes_alignment); in blkdebug_co_pwrite_zeroes()
703 return -ENOTSUP; in blkdebug_co_pwrite_zeroes()
707 if (bs->bl.max_pwrite_zeroes) { in blkdebug_co_pwrite_zeroes()
708 assert(bytes <= bs->bl.max_pwrite_zeroes); in blkdebug_co_pwrite_zeroes()
716 return bdrv_co_pwrite_zeroes(bs->file, offset, bytes, flags); in blkdebug_co_pwrite_zeroes()
722 uint32_t align = bs->bl.pdiscard_alignment; in blkdebug_co_pdiscard()
728 if (bytes < bs->bl.request_alignment) { in blkdebug_co_pdiscard()
733 return -ENOTSUP; in blkdebug_co_pdiscard()
735 assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); in blkdebug_co_pdiscard()
736 assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment)); in blkdebug_co_pdiscard()
741 if (bs->bl.max_pdiscard) { in blkdebug_co_pdiscard()
742 assert(bytes <= bs->bl.max_pdiscard); in blkdebug_co_pdiscard()
750 return bdrv_co_pdiscard(bs->file, offset, bytes); in blkdebug_co_pdiscard()
760 assert(QEMU_IS_ALIGNED(offset | bytes, bs->bl.request_alignment)); in blkdebug_co_block_status()
767 assert(bs->file && bs->file->bs); in blkdebug_co_block_status()
770 *file = bs->file->bs; in blkdebug_co_block_status()
776 BDRVBlkdebugState *s = bs->opaque; in blkdebug_close()
781 QLIST_FOREACH_SAFE(rule, &s->rules[i], next, next) { in blkdebug_close()
786 g_free(s->config_file); in blkdebug_close()
787 qemu_mutex_destroy(&s->lock); in blkdebug_close()
793 BDRVBlkdebugState *s = bs->opaque; in suspend_request()
798 r->co = qemu_coroutine_self(); in suspend_request()
799 r->tag = g_strdup(rule->options.suspend.tag); in suspend_request()
802 QLIST_INSERT_HEAD(&s->suspended_reqs, r, next); in suspend_request()
805 printf("blkdebug: Suspended request '%s'\n", r->tag); in suspend_request()
813 BDRVBlkdebugState *s = bs->opaque; in process_rule()
816 if (rule->state && rule->state != s->state) { in process_rule()
821 action_count[rule->action]++; in process_rule()
822 switch (rule->action) { in process_rule()
825 QSIMPLEQ_INIT(&s->active_rules); in process_rule()
827 QSIMPLEQ_INSERT_HEAD(&s->active_rules, rule, active_next); in process_rule()
831 *new_state = rule->options.set_state.new_state; in process_rule()
843 BDRVBlkdebugState *s = bs->opaque; in blkdebug_co_debug_event()
850 WITH_QEMU_LOCK_GUARD(&s->lock) { in blkdebug_co_debug_event()
851 new_state = s->state; in blkdebug_co_debug_event()
852 QLIST_FOREACH_SAFE(rule, &s->rules[event], next, next) { in blkdebug_co_debug_event()
855 s->state = new_state; in blkdebug_co_debug_event()
860 actions_count[ACTION_SUSPEND]--; in blkdebug_co_debug_event()
867 BDRVBlkdebugState *s = bs->opaque; in blkdebug_debug_breakpoint()
871 blkdebug_event = qapi_enum_parse(&BlkdebugEvent_lookup, event, -1, NULL); in blkdebug_debug_breakpoint()
873 return -ENOENT; in blkdebug_debug_breakpoint()
884 qemu_mutex_lock(&s->lock); in blkdebug_debug_breakpoint()
885 QLIST_INSERT_HEAD(&s->rules[blkdebug_event], rule, next); in blkdebug_debug_breakpoint()
886 qemu_mutex_unlock(&s->lock); in blkdebug_debug_breakpoint()
902 QLIST_FOREACH(r, &s->suspended_reqs, next) { in resume_req_by_tag()
903 if (!strcmp(r->tag, tag)) { in resume_req_by_tag()
904 Coroutine *co = r->co; in resume_req_by_tag()
907 printf("blkdebug: Resuming request '%s'\n", r->tag); in resume_req_by_tag()
911 g_free(r->tag); in resume_req_by_tag()
914 qemu_mutex_unlock(&s->lock); in resume_req_by_tag()
916 qemu_mutex_lock(&s->lock); in resume_req_by_tag()
924 return -ENOENT; in resume_req_by_tag()
929 BDRVBlkdebugState *s = bs->opaque; in blkdebug_debug_resume()
930 QEMU_LOCK_GUARD(&s->lock); in blkdebug_debug_resume()
937 BDRVBlkdebugState *s = bs->opaque; in blkdebug_debug_remove_breakpoint()
939 int i, ret = -ENOENT; in blkdebug_debug_remove_breakpoint()
941 QEMU_LOCK_GUARD(&s->lock); in blkdebug_debug_remove_breakpoint()
943 QLIST_FOREACH_SAFE(rule, &s->rules[i], next, next) { in blkdebug_debug_remove_breakpoint()
944 if (rule->action == ACTION_SUSPEND && in blkdebug_debug_remove_breakpoint()
945 !strcmp(rule->options.suspend.tag, tag)) { in blkdebug_debug_remove_breakpoint()
959 BDRVBlkdebugState *s = bs->opaque; in blkdebug_debug_is_suspended()
962 QEMU_LOCK_GUARD(&s->lock); in blkdebug_debug_is_suspended()
963 QLIST_FOREACH(r, &s->suspended_reqs, next) { in blkdebug_debug_is_suspended()
964 if (!strcmp(r->tag, tag)) { in blkdebug_debug_is_suspended()
974 return bdrv_co_getlength(bs->file->bs); in blkdebug_co_getlength()
979 BDRVBlkdebugState *s = bs->opaque; in blkdebug_refresh_filename()
983 if (!bs->file->bs->exact_filename[0]) { in blkdebug_refresh_filename()
987 for (e = qdict_first(bs->full_open_options); e; in blkdebug_refresh_filename()
988 e = qdict_next(bs->full_open_options, e)) in blkdebug_refresh_filename()
990 /* Real child options are under "image", but "x-image" may in blkdebug_refresh_filename()
994 strcmp(qdict_entry_key(e), "x-image") && in blkdebug_refresh_filename()
1001 ret = snprintf(bs->exact_filename, sizeof(bs->exact_filename), in blkdebug_refresh_filename()
1003 s->config_file ?: "", bs->file->bs->exact_filename); in blkdebug_refresh_filename()
1004 if (ret >= sizeof(bs->exact_filename)) { in blkdebug_refresh_filename()
1006 bs->exact_filename[0] = 0; in blkdebug_refresh_filename()
1012 BDRVBlkdebugState *s = bs->opaque; in blkdebug_refresh_limits()
1014 if (s->align) { in blkdebug_refresh_limits()
1015 bs->bl.request_alignment = s->align; in blkdebug_refresh_limits()
1017 if (s->max_transfer) { in blkdebug_refresh_limits()
1018 bs->bl.max_transfer = s->max_transfer; in blkdebug_refresh_limits()
1020 if (s->opt_write_zero) { in blkdebug_refresh_limits()
1021 bs->bl.pwrite_zeroes_alignment = s->opt_write_zero; in blkdebug_refresh_limits()
1023 if (s->max_write_zero) { in blkdebug_refresh_limits()
1024 bs->bl.max_pwrite_zeroes = s->max_write_zero; in blkdebug_refresh_limits()
1026 if (s->opt_discard) { in blkdebug_refresh_limits()
1027 bs->bl.pdiscard_alignment = s->opt_discard; in blkdebug_refresh_limits()
1029 if (s->max_discard) { in blkdebug_refresh_limits()
1030 bs->bl.max_pdiscard = s->max_discard; in blkdebug_refresh_limits()
1046 BDRVBlkdebugState *s = bs->opaque; in blkdebug_child_perm()
1051 *nperm |= s->take_child_perms; in blkdebug_child_perm()
1052 *nshared &= ~s->unshare_child_perms; in blkdebug_child_perm()
1057 "inject-error.",
1058 "set-state.",
1060 "max-transfer",
1061 "opt-write-zero",
1062 "max-write-zero",
1063 "opt-discard",
1064 "max-discard",