Lines Matching refs:devip

606 				  struct sdebug_dev_info *devip);
1065 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdev->hostdata; in sdebug_err_add() local
1068 spin_lock(&devip->list_lock); in sdebug_err_add()
1069 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_err_add()
1076 list_add_tail_rcu(&new->list, &devip->inject_err_list); in sdebug_err_add()
1077 spin_unlock(&devip->list_lock); in sdebug_err_add()
1082 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdev->hostdata; in sdebug_err_remove() local
1092 spin_lock(&devip->list_lock); in sdebug_err_remove()
1093 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_err_remove()
1097 spin_unlock(&devip->list_lock); in sdebug_err_remove()
1102 spin_unlock(&devip->list_lock); in sdebug_err_remove()
1111 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdev->hostdata; in sdebug_error_show() local
1117 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_error_show()
1527 static void clear_luns_changed_on_target(struct sdebug_dev_info *devip) in clear_luns_changed_on_target() argument
1529 struct sdebug_host_info *sdhp = devip->sdbg_host; in clear_luns_changed_on_target()
1533 if ((devip->sdbg_host == dp->sdbg_host) && in clear_luns_changed_on_target()
1534 (devip->target == dp->target)) { in clear_luns_changed_on_target()
1540 static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in make_ua() argument
1544 k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS); in make_ua()
1603 clear_luns_changed_on_target(devip); in make_ua()
1622 clear_bit(k, devip->uas_bm); in make_ua()
1993 static int inquiry_vpd_b1(struct sdebug_dev_info *devip, unsigned char *arr) in inquiry_vpd_b1() argument
2024 static int inquiry_vpd_b6(struct sdebug_dev_info *devip, unsigned char *arr) in inquiry_vpd_b6() argument
2036 if (sdeb_zbc_model == BLK_ZONED_HM && devip->max_open) in inquiry_vpd_b6()
2037 put_unaligned_be32(devip->max_open, &arr[12]); in inquiry_vpd_b6()
2040 if (devip->zcap < devip->zsize) { in inquiry_vpd_b6()
2042 put_unaligned_be64(devip->zsize, &arr[20]); in inquiry_vpd_b6()
2065 static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_inquiry() argument
2085 is_zbc = devip->zoned; in resp_inquiry()
2090 else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL)) in resp_inquiry()
2104 int host_no = devip->sdbg_host->shost->host_no; in resp_inquiry()
2108 (devip->channel & 0x7f); in resp_inquiry()
2112 (devip->target * 1000) + devip->lun); in resp_inquiry()
2114 (devip->target * 1000) - 3; in resp_inquiry()
2144 &devip->lu_name); in resp_inquiry()
2176 arr[3] = inquiry_vpd_b1(devip, &arr[4]); in resp_inquiry()
2180 arr[3] = inquiry_vpd_b6(devip, &arr[4]); in resp_inquiry()
2236 struct sdebug_dev_info *devip) in resp_requests() argument
2243 int stopped_state = atomic_read(&devip->stopped); in resp_requests()
2289 static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_start_stop() argument
2301 stopped_state = atomic_read(&devip->stopped); in resp_start_stop()
2305 if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) { in resp_start_stop()
2306 u64 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts)); in resp_start_stop()
2310 atomic_set(&devip->stopped, 0); in resp_start_stop()
2325 atomic_xchg(&devip->stopped, want_stop); in resp_start_stop()
2329 set_bit(SDEBUG_UA_NOT_READY_TO_READY, devip->uas_bm); /* not legal! */ in resp_start_stop()
2331 devip->tape_location[i] = 0; in resp_start_stop()
2332 devip->tape_partition = 0; in resp_start_stop()
2353 struct sdebug_dev_info *devip) in resp_readcap() argument
2372 struct sdebug_dev_info *devip) in resp_readcap16() argument
2401 if (devip->zoned) in resp_readcap16()
2418 struct sdebug_dev_info *devip) in resp_report_tgtpgs() argument
2422 int host_no = devip->sdbg_host->shost->host_no; in resp_report_tgtpgs()
2440 (devip->channel & 0x7f); in resp_report_tgtpgs()
2442 (devip->channel & 0x7f) + 0x80; in resp_report_tgtpgs()
2495 struct sdebug_dev_info *devip) in resp_rsup_opcodes() argument
2647 struct sdebug_dev_info *devip) in resp_rsup_tmfs() argument
2896 static int process_medium_part_m_pg(struct sdebug_dev_info *devip, in process_medium_part_m_pg() argument
2903 devip->tape_pending_nbr_partitions = TAPE_MAX_PARTITIONS; in process_medium_part_m_pg()
2904 devip->tape_pending_part_0_size = TAPE_UNITS - TAPE_PARTITION_1_UNITS; in process_medium_part_m_pg()
2905 devip->tape_pending_part_1_size = TAPE_PARTITION_1_UNITS; in process_medium_part_m_pg()
2931 devip->tape_pending_nbr_partitions = new_nbr; in process_medium_part_m_pg()
2932 devip->tape_pending_part_0_size = p0_size; in process_medium_part_m_pg()
2933 devip->tape_pending_part_1_size = p1_size; in process_medium_part_m_pg()
2935 devip->tape_pending_nbr_partitions = new_nbr; in process_medium_part_m_pg()
2961 struct sdebug_dev_info *devip) in resp_mode_sense() argument
2983 is_zbc = devip->zoned; in resp_mode_sense()
2994 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) + in resp_mode_sense()
2995 (devip->target * 1000) - 3; in resp_mode_sense()
3024 ap[0] = devip->tape_density; in resp_mode_sense()
3025 put_unaligned_be16(devip->tape_blksize, ap + 6); in resp_mode_sense()
3100 len = resp_compression_m_pg(ap, pcontrol, target, devip->tape_dce); in resp_mode_sense()
3173 struct sdebug_dev_info *devip) in resp_mode_select() argument
3219 devip->tape_density = arr[off]; in resp_mode_select()
3220 devip->tape_blksize = blksize; in resp_mode_select()
3267 devip->tape_dce = (arr[off + 2] & 0x80) != 0; in resp_mode_select()
3275 fld = process_medium_part_m_pg(devip, &arr[off], pg_len); in resp_mode_select()
3295 set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm); in resp_mode_select()
3344 struct sdebug_dev_info *devip) in resp_log_sense() argument
3445 struct sdebug_dev_info *devip) in resp_read_blklimits() argument
3456 struct sdebug_dev_info *devip) in resp_locate() argument
3464 if (cmd[8] >= devip->tape_nbr_partitions) { in resp_locate()
3468 devip->tape_partition = cmd[8]; in resp_locate()
3471 partition = devip->tape_partition; in resp_locate()
3473 for (i = 0, blp = devip->tape_blocks[partition]; in resp_locate()
3474 i < pos && i < devip->tape_eop[partition]; i++, blp++) in resp_locate()
3478 devip->tape_location[partition] = i; in resp_locate()
3482 devip->tape_location[partition] = pos; in resp_locate()
3488 struct sdebug_dev_info *devip) in resp_write_filemarks() argument
3493 int partition = devip->tape_partition; in resp_write_filemarks()
3501 for (i = 0, pos = devip->tape_location[partition]; i < count; i++, pos++) { in resp_write_filemarks()
3502 if (pos >= devip->tape_eop[partition] - 1) { /* don't overwrite EOD */ in resp_write_filemarks()
3503 devip->tape_location[partition] = devip->tape_eop[partition] - 1; in resp_write_filemarks()
3508 (devip->tape_blocks[partition] + pos)->fl_size = data; in resp_write_filemarks()
3510 (devip->tape_blocks[partition] + pos)->fl_size = in resp_write_filemarks()
3512 devip->tape_location[partition] = pos; in resp_write_filemarks()
3518 struct sdebug_dev_info *devip) in resp_space() argument
3523 int partition = devip->tape_partition; in resp_space()
3530 pos = devip->tape_location[partition]; in resp_space()
3535 for (i = 0, blp = devip->tape_blocks[partition] + pos; i < count; in resp_space()
3547 for (i = 0, blp = devip->tape_blocks[partition] + pos; i < count; in resp_space()
3555 if (pos >= devip->tape_eop[partition]) in resp_space()
3565 for (i = 0, blp = devip->tape_blocks[partition] + pos; in resp_space()
3576 for (i = 0, blp = devip->tape_blocks[partition] + pos; in resp_space()
3580 pos < devip->tape_eop[partition]; in resp_space()
3585 if (pos >= devip->tape_eop[partition]) in resp_space()
3590 for (blp = devip->tape_blocks[partition] + pos; in resp_space()
3591 !IS_TAPE_BLOCK_EOD(blp->fl_size) && pos < devip->tape_eop[partition]; in resp_space()
3594 if (pos >= devip->tape_eop[partition]) in resp_space()
3601 devip->tape_location[partition] = pos; in resp_space()
3605 devip->tape_location[partition] = pos; in resp_space()
3612 devip->tape_location[partition] = pos; in resp_space()
3619 devip->tape_location[partition] = 0; in resp_space()
3623 devip->tape_location[partition] = 0; in resp_space()
3627 devip->tape_location[partition] = devip->tape_eop[partition] - 1; in resp_space()
3636 struct sdebug_dev_info *devip) in resp_read_position() argument
3651 arr[1] = devip->tape_partition; in resp_read_position()
3652 pos = devip->tape_location[devip->tape_partition]; in resp_read_position()
3659 struct sdebug_dev_info *devip) in resp_rewind() argument
3661 devip->tape_location[devip->tape_partition] = 0; in resp_rewind()
3666 static int partition_tape(struct sdebug_dev_info *devip, int nbr_partitions, in partition_tape() argument
3673 devip->tape_eop[0] = part_0_size; in partition_tape()
3674 devip->tape_blocks[0]->fl_size = TAPE_BLOCK_EOD_FLAG; in partition_tape()
3675 devip->tape_eop[1] = part_1_size; in partition_tape()
3676 devip->tape_blocks[1] = devip->tape_blocks[0] + in partition_tape()
3677 devip->tape_eop[0]; in partition_tape()
3678 devip->tape_blocks[1]->fl_size = TAPE_BLOCK_EOD_FLAG; in partition_tape()
3681 devip->tape_location[i] = 0; in partition_tape()
3683 devip->tape_nbr_partitions = nbr_partitions; in partition_tape()
3684 devip->tape_partition = 0; in partition_tape()
3687 put_unaligned_be16(devip->tape_eop[0], partition_pg + 8); in partition_tape()
3688 put_unaligned_be16(devip->tape_eop[1], partition_pg + 10); in partition_tape()
3694 struct sdebug_dev_info *devip) in resp_format_medium() argument
3704 if (devip->tape_pending_nbr_partitions > 0) { in resp_format_medium()
3705 res = partition_tape(devip, in resp_format_medium()
3706 devip->tape_pending_nbr_partitions, in resp_format_medium()
3707 devip->tape_pending_part_0_size, in resp_format_medium()
3708 devip->tape_pending_part_1_size); in resp_format_medium()
3710 res = partition_tape(devip, devip->tape_nbr_partitions, in resp_format_medium()
3711 devip->tape_eop[0], devip->tape_eop[1]); in resp_format_medium()
3713 res = partition_tape(devip, 1, TAPE_UNITS, 0); in resp_format_medium()
3717 devip->tape_pending_nbr_partitions = -1; in resp_format_medium()
3723 struct sdebug_dev_info *devip) in resp_erase() argument
3725 int partition = devip->tape_partition; in resp_erase()
3726 int pos = devip->tape_location[partition]; in resp_erase()
3729 blp = devip->tape_blocks[partition] + pos; in resp_erase()
3735 static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip) in sdebug_dev_is_zoned() argument
3737 return devip->nr_zones != 0; in sdebug_dev_is_zoned()
3740 static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip, in zbc_zone() argument
3743 u32 zno = lba >> devip->zsize_shift; in zbc_zone()
3746 if (devip->zcap == devip->zsize || zno < devip->nr_conv_zones) in zbc_zone()
3747 return &devip->zstate[zno]; in zbc_zone()
3753 zno = 2 * zno - devip->nr_conv_zones; in zbc_zone()
3754 WARN_ONCE(zno >= devip->nr_zones, "%u > %u\n", zno, devip->nr_zones); in zbc_zone()
3755 zsp = &devip->zstate[zno]; in zbc_zone()
3777 static void zbc_close_zone(struct sdebug_dev_info *devip, in zbc_close_zone() argument
3790 devip->nr_imp_open--; in zbc_close_zone()
3792 devip->nr_exp_open--; in zbc_close_zone()
3798 devip->nr_closed++; in zbc_close_zone()
3802 static void zbc_close_imp_open_zone(struct sdebug_dev_info *devip) in zbc_close_imp_open_zone() argument
3804 struct sdeb_zone_state *zsp = &devip->zstate[0]; in zbc_close_imp_open_zone()
3807 for (i = 0; i < devip->nr_zones; i++, zsp++) { in zbc_close_imp_open_zone()
3809 zbc_close_zone(devip, zsp); in zbc_close_imp_open_zone()
3815 static void zbc_open_zone(struct sdebug_dev_info *devip, in zbc_open_zone() argument
3830 zbc_close_zone(devip, zsp); in zbc_open_zone()
3831 else if (devip->max_open && in zbc_open_zone()
3832 devip->nr_imp_open + devip->nr_exp_open >= devip->max_open) in zbc_open_zone()
3833 zbc_close_imp_open_zone(devip); in zbc_open_zone()
3836 devip->nr_closed--; in zbc_open_zone()
3839 devip->nr_exp_open++; in zbc_open_zone()
3842 devip->nr_imp_open++; in zbc_open_zone()
3846 static inline void zbc_set_zone_full(struct sdebug_dev_info *devip, in zbc_set_zone_full() argument
3851 devip->nr_imp_open--; in zbc_set_zone_full()
3854 devip->nr_exp_open--; in zbc_set_zone_full()
3864 static void zbc_inc_wp(struct sdebug_dev_info *devip, in zbc_inc_wp() argument
3867 struct sdeb_zone_state *zsp = zbc_zone(devip, lba); in zbc_inc_wp()
3876 zbc_set_zone_full(devip, zsp); in zbc_inc_wp()
3895 zbc_set_zone_full(devip, zsp); in zbc_inc_wp()
3910 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in check_zbc_access_params() local
3911 struct sdeb_zone_state *zsp = zbc_zone(devip, lba); in check_zbc_access_params()
3912 struct sdeb_zone_state *zsp_end = zbc_zone(devip, lba + num - 1); in check_zbc_access_params()
3968 if (devip->max_open && in check_zbc_access_params()
3969 devip->nr_exp_open >= devip->max_open) { in check_zbc_access_params()
3975 zbc_open_zone(devip, zsp, false); in check_zbc_access_params()
3986 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in check_device_access_params() local
4002 if (sdebug_dev_is_zoned(devip)) in check_device_access_params()
4014 static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip, in devip2sip() argument
4021 return xa_load(per_store_ap, devip->sdbg_host->si_idx); in devip2sip()
4468 static int resp_read_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_read_tape() argument
4473 int partition = devip->tape_partition; in resp_read_tape()
4474 u32 pos = devip->tape_location[partition]; in resp_read_tape()
4492 size = devip->tape_blksize; in resp_read_tape()
4503 for (i = 0, blp = devip->tape_blocks[partition] + pos; in resp_read_tape()
4504 i < num && pos < devip->tape_eop[partition]; in resp_read_tape()
4506 devip->tape_location[partition] = pos + 1; in resp_read_tape()
4519 devip->tape_location[partition] = pos; in resp_read_tape()
4528 if (blp->fl_size != devip->tape_blksize) { in resp_read_tape()
4548 if (pos >= devip->tape_eop[partition]) { in resp_read_tape()
4552 devip->tape_location[partition] = pos - 1; in resp_read_tape()
4555 devip->tape_location[partition] = pos; in resp_read_tape()
4560 static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_read_dt0() argument
4567 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_read_dt0()
4651 if (sdebug_dev_is_zoned(devip) || in resp_read_dt0()
4867 static int resp_write_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_write_tape() argument
4872 int partition = devip->tape_partition; in resp_write_tape()
4873 int pos = devip->tape_location[partition]; in resp_write_tape()
4886 size = devip->tape_blksize; in resp_write_tape()
4898 for (i = 0, blp = devip->tape_blocks[partition] + pos, ew = false; in resp_write_tape()
4899 i < num && pos < devip->tape_eop[partition] - 1; i++, pos++, blp++) { in resp_write_tape()
4905 ew |= (pos == devip->tape_eop[partition] - TAPE_EW); in resp_write_tape()
4908 devip->tape_location[partition] = pos; in resp_write_tape()
4910 if (pos >= devip->tape_eop[partition] - 1) { in resp_write_tape()
4928 static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_write_dt0() argument
4936 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_write_dt0()
4997 if (sdebug_dev_is_zoned(devip) || in resp_write_dt0()
5044 if (sdebug_dev_is_zoned(devip)) in resp_write_dt0()
5045 zbc_inc_wp(devip, lba, num); in resp_write_dt0()
5082 struct sdebug_dev_info *devip) in resp_write_scat() argument
5087 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_write_scat()
5208 if (sdebug_dev_is_zoned(devip)) in resp_write_scat()
5209 zbc_inc_wp(devip, lba, num); in resp_write_scat()
5255 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in resp_write_same() local
5266 if (sdebug_dev_is_zoned(devip) || scsi_debug_lbp()) { in resp_write_same()
5308 if (sdebug_dev_is_zoned(devip)) in resp_write_same()
5309 zbc_inc_wp(devip, lba, num); in resp_write_same()
5319 struct sdebug_dev_info *devip) in resp_write_same_10() argument
5344 struct sdebug_dev_info *devip) in resp_write_same_16() argument
5375 struct sdebug_dev_info *devip) in resp_write_buffer() argument
5386 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in resp_write_buffer()
5387 set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm); in resp_write_buffer()
5390 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm); in resp_write_buffer()
5395 &devip->sdbg_host->dev_info_list, in resp_write_buffer()
5399 if (devip != dp) in resp_write_buffer()
5407 &devip->sdbg_host->dev_info_list, in resp_write_buffer()
5421 struct sdebug_dev_info *devip) in resp_comp_write() argument
5425 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_comp_write()
5492 static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_unmap() argument
5496 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_unmap()
5550 struct sdebug_dev_info *devip) in resp_get_lba_status() argument
5569 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_get_lba_status()
5592 struct sdebug_dev_info *devip) in resp_get_stream_status() argument
5637 struct sdebug_dev_info *devip) in resp_sync_cache() argument
5672 struct sdebug_dev_info *devip) in resp_pre_fetch() argument
5679 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_pre_fetch()
5725 struct sdebug_dev_info *devip) in resp_report_luns() argument
5741 clear_luns_changed_on_target(devip); in resp_report_luns()
5817 static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_verify() argument
5827 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_verify()
5897 struct sdebug_dev_info *devip) in resp_report_zones() argument
5907 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_report_zones()
5909 if (!sdebug_dev_is_zoned(devip)) { in resp_report_zones()
5939 if (WARN_ONCE(zbc_zone(devip, lba) == zsp, "lba = %llu\n", lba)) in resp_report_zones()
5941 zsp = zbc_zone(devip, lba); in resp_report_zones()
6025 if (devip->zcap < devip->zsize) in resp_report_zones()
6026 put_unaligned_be64(devip->zsize, arr + 16); in resp_report_zones()
6038 struct sdebug_dev_info *devip) in resp_atomic_write() argument
6051 sip = devip2sip(devip, true); in resp_atomic_write()
6097 static void zbc_open_all(struct sdebug_dev_info *devip) in zbc_open_all() argument
6099 struct sdeb_zone_state *zsp = &devip->zstate[0]; in zbc_open_all()
6102 for (i = 0; i < devip->nr_zones; i++, zsp++) { in zbc_open_all()
6104 zbc_open_zone(devip, &devip->zstate[i], true); in zbc_open_all()
6108 static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_open_zone() argument
6116 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_open_zone()
6118 if (!sdebug_dev_is_zoned(devip)) { in resp_open_zone()
6126 if (devip->max_open && in resp_open_zone()
6127 devip->nr_exp_open + devip->nr_closed > devip->max_open) { in resp_open_zone()
6134 zbc_open_all(devip); in resp_open_zone()
6146 zsp = zbc_zone(devip, z_id); in resp_open_zone()
6162 if (devip->max_open && devip->nr_exp_open >= devip->max_open) { in resp_open_zone()
6169 zbc_open_zone(devip, zsp, true); in resp_open_zone()
6175 static void zbc_close_all(struct sdebug_dev_info *devip) in zbc_close_all() argument
6179 for (i = 0; i < devip->nr_zones; i++) in zbc_close_all()
6180 zbc_close_zone(devip, &devip->zstate[i]); in zbc_close_all()
6184 struct sdebug_dev_info *devip) in resp_close_zone() argument
6191 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_close_zone()
6193 if (!sdebug_dev_is_zoned(devip)) { in resp_close_zone()
6201 zbc_close_all(devip); in resp_close_zone()
6213 zsp = zbc_zone(devip, z_id); in resp_close_zone()
6225 zbc_close_zone(devip, zsp); in resp_close_zone()
6231 static void zbc_finish_zone(struct sdebug_dev_info *devip, in zbc_finish_zone() argument
6239 zbc_close_zone(devip, zsp); in zbc_finish_zone()
6241 devip->nr_closed--; in zbc_finish_zone()
6247 static void zbc_finish_all(struct sdebug_dev_info *devip) in zbc_finish_all() argument
6251 for (i = 0; i < devip->nr_zones; i++) in zbc_finish_all()
6252 zbc_finish_zone(devip, &devip->zstate[i], false); in zbc_finish_all()
6256 struct sdebug_dev_info *devip) in resp_finish_zone() argument
6263 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_finish_zone()
6265 if (!sdebug_dev_is_zoned(devip)) { in resp_finish_zone()
6273 zbc_finish_all(devip); in resp_finish_zone()
6285 zsp = zbc_zone(devip, z_id); in resp_finish_zone()
6297 zbc_finish_zone(devip, zsp, true); in resp_finish_zone()
6303 static void zbc_rwp_zone(struct sdebug_dev_info *devip, in zbc_rwp_zone() argument
6307 struct sdeb_store_info *sip = devip2sip(devip, false); in zbc_rwp_zone()
6314 zbc_close_zone(devip, zsp); in zbc_rwp_zone()
6317 devip->nr_closed--; in zbc_rwp_zone()
6328 static void zbc_rwp_all(struct sdebug_dev_info *devip) in zbc_rwp_all() argument
6332 for (i = 0; i < devip->nr_zones; i++) in zbc_rwp_all()
6333 zbc_rwp_zone(devip, &devip->zstate[i]); in zbc_rwp_all()
6336 static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_rwp_zone() argument
6343 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_rwp_zone()
6345 if (!sdebug_dev_is_zoned(devip)) { in resp_rwp_zone()
6353 zbc_rwp_all(devip); in resp_rwp_zone()
6364 zsp = zbc_zone(devip, z_id); in resp_rwp_zone()
6376 zbc_rwp_zone(devip, zsp); in resp_rwp_zone()
6443 static int sdebug_device_create_zones(struct sdebug_dev_info *devip) in sdebug_device_create_zones() argument
6458 devip->zsize = (DEF_ZBC_ZONE_SIZE_MB * SZ_1M) in sdebug_device_create_zones()
6460 while (capacity < devip->zsize << 2 && devip->zsize >= 2) in sdebug_device_create_zones()
6461 devip->zsize >>= 1; in sdebug_device_create_zones()
6462 if (devip->zsize < 2) { in sdebug_device_create_zones()
6471 devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M) in sdebug_device_create_zones()
6473 if (devip->zsize >= capacity) { in sdebug_device_create_zones()
6479 devip->zsize_shift = ilog2(devip->zsize); in sdebug_device_create_zones()
6480 devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift; in sdebug_device_create_zones()
6483 devip->zcap = devip->zsize; in sdebug_device_create_zones()
6485 devip->zcap = (sdeb_zbc_zone_cap_mb * SZ_1M) >> in sdebug_device_create_zones()
6487 if (devip->zcap > devip->zsize) { in sdebug_device_create_zones()
6493 conv_capacity = (sector_t)sdeb_zbc_nr_conv << devip->zsize_shift; in sdebug_device_create_zones()
6498 devip->nr_conv_zones = sdeb_zbc_nr_conv; in sdebug_device_create_zones()
6499 devip->nr_seq_zones = ALIGN(capacity - conv_capacity, devip->zsize) >> in sdebug_device_create_zones()
6500 devip->zsize_shift; in sdebug_device_create_zones()
6501 devip->nr_zones = devip->nr_conv_zones + devip->nr_seq_zones; in sdebug_device_create_zones()
6504 if (devip->zcap < devip->zsize) in sdebug_device_create_zones()
6505 devip->nr_zones += devip->nr_seq_zones; in sdebug_device_create_zones()
6507 if (devip->zoned) { in sdebug_device_create_zones()
6509 if (sdeb_zbc_max_open >= devip->nr_zones - 1) in sdebug_device_create_zones()
6510 devip->max_open = (devip->nr_zones - 1) / 2; in sdebug_device_create_zones()
6512 devip->max_open = sdeb_zbc_max_open; in sdebug_device_create_zones()
6515 devip->zstate = kcalloc(devip->nr_zones, in sdebug_device_create_zones()
6517 if (!devip->zstate) in sdebug_device_create_zones()
6520 for (i = 0; i < devip->nr_zones; i++) { in sdebug_device_create_zones()
6521 zsp = &devip->zstate[i]; in sdebug_device_create_zones()
6525 if (i < devip->nr_conv_zones) { in sdebug_device_create_zones()
6530 min_t(u64, devip->zsize, capacity - zstart); in sdebug_device_create_zones()
6531 } else if ((zstart & (devip->zsize - 1)) == 0) { in sdebug_device_create_zones()
6532 if (devip->zoned) in sdebug_device_create_zones()
6539 min_t(u64, devip->zcap, capacity - zstart); in sdebug_device_create_zones()
6544 zsp->z_size = min_t(u64, devip->zsize - devip->zcap, in sdebug_device_create_zones()
6558 struct sdebug_dev_info *devip; in sdebug_device_create() local
6560 devip = kzalloc(sizeof(*devip), flags); in sdebug_device_create()
6561 if (devip) { in sdebug_device_create()
6563 uuid_gen(&devip->lu_name); in sdebug_device_create()
6566 devip->lu_name = shared_uuid; in sdebug_device_create()
6570 devip->lu_name = shared_uuid; in sdebug_device_create()
6573 devip->sdbg_host = sdbg_host; in sdebug_device_create()
6575 devip->zoned = sdeb_zbc_model == BLK_ZONED_HM; in sdebug_device_create()
6576 if (sdebug_device_create_zones(devip)) { in sdebug_device_create()
6577 kfree(devip); in sdebug_device_create()
6581 devip->zoned = false; in sdebug_device_create()
6584 devip->tape_density = TAPE_DEF_DENSITY; in sdebug_device_create()
6585 devip->tape_blksize = TAPE_DEF_BLKSIZE; in sdebug_device_create()
6587 devip->create_ts = ktime_get_boottime(); in sdebug_device_create()
6588 atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0)); in sdebug_device_create()
6589 spin_lock_init(&devip->list_lock); in sdebug_device_create()
6590 INIT_LIST_HEAD(&devip->inject_err_list); in sdebug_device_create()
6591 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list); in sdebug_device_create()
6593 return devip; in sdebug_device_create()
6600 struct sdebug_dev_info *devip; in find_build_dev_info() local
6604 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) { in find_build_dev_info()
6605 if ((devip->used) && (devip->channel == sdev->channel) && in find_build_dev_info()
6606 (devip->target == sdev->id) && in find_build_dev_info()
6607 (devip->lun == sdev->lun)) in find_build_dev_info()
6608 return devip; in find_build_dev_info()
6610 if ((!devip->used) && (!open_devip)) in find_build_dev_info()
6611 open_devip = devip; in find_build_dev_info()
6643 struct sdebug_dev_info *devip = in scsi_debug_sdev_configure() local
6652 if (devip == NULL) { in scsi_debug_sdev_configure()
6653 devip = find_build_dev_info(sdp); in scsi_debug_sdev_configure()
6654 if (devip == NULL) in scsi_debug_sdev_configure()
6658 if (!devip->tape_blocks[0]) { in scsi_debug_sdev_configure()
6659 devip->tape_blocks[0] = in scsi_debug_sdev_configure()
6662 if (!devip->tape_blocks[0]) in scsi_debug_sdev_configure()
6665 devip->tape_pending_nbr_partitions = -1; in scsi_debug_sdev_configure()
6666 if (partition_tape(devip, 1, TAPE_UNITS, 0) < 0) { in scsi_debug_sdev_configure()
6667 kfree(devip->tape_blocks[0]); in scsi_debug_sdev_configure()
6668 devip->tape_blocks[0] = NULL; in scsi_debug_sdev_configure()
6672 sdp->hostdata = devip; in scsi_debug_sdev_configure()
6680 devip->debugfs_entry = debugfs_create_dir(dev_name(&sdp->sdev_dev), in scsi_debug_sdev_configure()
6682 if (IS_ERR_OR_NULL(devip->debugfs_entry)) in scsi_debug_sdev_configure()
6686 dentry = debugfs_create_file("error", 0600, devip->debugfs_entry, sdp, in scsi_debug_sdev_configure()
6697 struct sdebug_dev_info *devip = in scsi_debug_sdev_destroy() local
6705 if (!devip) in scsi_debug_sdev_destroy()
6708 spin_lock(&devip->list_lock); in scsi_debug_sdev_destroy()
6709 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in scsi_debug_sdev_destroy()
6713 spin_unlock(&devip->list_lock); in scsi_debug_sdev_destroy()
6715 debugfs_remove(devip->debugfs_entry); in scsi_debug_sdev_destroy()
6718 kfree(devip->tape_blocks[0]); in scsi_debug_sdev_destroy()
6719 devip->tape_blocks[0] = NULL; in scsi_debug_sdev_destroy()
6723 devip->used = false; in scsi_debug_sdev_destroy()
6804 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_abort() local
6809 if (devip == NULL) in sdebug_fail_abort()
6813 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_abort()
6878 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_lun_reset() local
6883 if (devip == NULL) in sdebug_fail_lun_reset()
6887 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_lun_reset()
6903 static void scsi_tape_reset_clear(struct sdebug_dev_info *devip) in scsi_tape_reset_clear() argument
6907 devip->tape_blksize = TAPE_DEF_BLKSIZE; in scsi_tape_reset_clear()
6908 devip->tape_density = TAPE_DEF_DENSITY; in scsi_tape_reset_clear()
6909 devip->tape_partition = 0; in scsi_tape_reset_clear()
6910 devip->tape_dce = 0; in scsi_tape_reset_clear()
6912 devip->tape_location[i] = 0; in scsi_tape_reset_clear()
6913 devip->tape_pending_nbr_partitions = -1; in scsi_tape_reset_clear()
6920 struct sdebug_dev_info *devip = sdp->hostdata; in scsi_debug_device_reset() local
6930 if (devip) { in scsi_debug_device_reset()
6931 set_bit(SDEBUG_UA_POR, devip->uas_bm); in scsi_debug_device_reset()
6933 scsi_tape_reset_clear(devip); in scsi_debug_device_reset()
6960 struct sdebug_dev_info *devip; in scsi_debug_target_reset() local
6969 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) { in scsi_debug_target_reset()
6970 if (devip->target == sdp->id) { in scsi_debug_target_reset()
6971 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in scsi_debug_target_reset()
6973 scsi_tape_reset_clear(devip); in scsi_debug_target_reset()
6995 struct sdebug_dev_info *devip; in scsi_debug_bus_reset() local
7003 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) { in scsi_debug_bus_reset()
7004 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in scsi_debug_bus_reset()
7006 scsi_tape_reset_clear(devip); in scsi_debug_bus_reset()
7019 struct sdebug_dev_info *devip; in scsi_debug_host_reset() local
7027 list_for_each_entry(devip, &sdbg_host->dev_info_list, in scsi_debug_host_reset()
7029 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in scsi_debug_host_reset()
7031 scsi_tape_reset_clear(devip); in scsi_debug_host_reset()
7153 static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, in schedule_resp() argument
7167 if (unlikely(devip == NULL)) { in schedule_resp()
7201 cmnd->result = pfp ? pfp(cmnd, devip) : 0; in schedule_resp()
7297 cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0; in schedule_resp()
8948 struct sdebug_dev_info *devip = sdev->hostdata; in sdebug_change_qdepth() local
8950 if (!devip) in sdebug_change_qdepth()
8990 static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_not_ready() argument
8997 stopped_state = atomic_read(&devip->stopped); in resp_not_ready()
8999 if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) { in resp_not_ready()
9000 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts)); in resp_not_ready()
9003 atomic_set(&devip->stopped, 0); in resp_not_ready()
9135 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_timeout_cmd() local
9140 if (devip == NULL) in sdebug_timeout_cmd()
9144 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_timeout_cmd()
9163 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_queue_cmd() local
9168 if (devip == NULL) in sdebug_fail_queue_cmd()
9172 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_queue_cmd()
9192 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_cmd() local
9198 if (devip == NULL) in sdebug_fail_cmd()
9202 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_cmd()
9225 *retval = schedule_resp(cmnd, devip, result, NULL, 0, 0); in sdebug_fail_cmd()
9237 struct sdebug_dev_info *devip; in scsi_debug_queuecommand() local
9285 devip = (struct sdebug_dev_info *)sdp->hostdata; in scsi_debug_queuecommand()
9286 if (unlikely(!devip)) { in scsi_debug_queuecommand()
9287 devip = find_build_dev_info(sdp); in scsi_debug_queuecommand()
9288 if (NULL == devip) in scsi_debug_queuecommand()
9377 find_first_bit(devip->uas_bm, in scsi_debug_queuecommand()
9379 errsts = make_ua(scp, devip); in scsi_debug_queuecommand()
9384 atomic_read(&devip->stopped))) { in scsi_debug_queuecommand()
9385 errsts = resp_not_ready(scp, devip); in scsi_debug_queuecommand()
9402 return schedule_resp(scp, devip, errsts, pfp, 0, 0); in scsi_debug_queuecommand()
9415 return schedule_resp(scp, devip, errsts, pfp, jdelay, 0); in scsi_debug_queuecommand()
9417 return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay, in scsi_debug_queuecommand()
9420 return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0); in scsi_debug_queuecommand()