Lines Matching refs:devip

594 				  struct sdebug_dev_info *devip);
1028 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdev->hostdata; in sdebug_err_add() local
1031 spin_lock(&devip->list_lock); in sdebug_err_add()
1032 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_err_add()
1039 list_add_tail_rcu(&new->list, &devip->inject_err_list); in sdebug_err_add()
1040 spin_unlock(&devip->list_lock); in sdebug_err_add()
1045 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdev->hostdata; in sdebug_err_remove() local
1055 spin_lock(&devip->list_lock); in sdebug_err_remove()
1056 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_err_remove()
1060 spin_unlock(&devip->list_lock); in sdebug_err_remove()
1065 spin_unlock(&devip->list_lock); in sdebug_err_remove()
1074 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdev->hostdata; in sdebug_error_show() local
1080 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_error_show()
1490 static void clear_luns_changed_on_target(struct sdebug_dev_info *devip) in clear_luns_changed_on_target() argument
1492 struct sdebug_host_info *sdhp = devip->sdbg_host; in clear_luns_changed_on_target()
1496 if ((devip->sdbg_host == dp->sdbg_host) && in clear_luns_changed_on_target()
1497 (devip->target == dp->target)) { in clear_luns_changed_on_target()
1503 static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in make_ua() argument
1507 k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS); in make_ua()
1566 clear_luns_changed_on_target(devip); in make_ua()
1585 clear_bit(k, devip->uas_bm); in make_ua()
1956 static int inquiry_vpd_b1(struct sdebug_dev_info *devip, unsigned char *arr) in inquiry_vpd_b1() argument
1987 static int inquiry_vpd_b6(struct sdebug_dev_info *devip, unsigned char *arr) in inquiry_vpd_b6() argument
1999 if (sdeb_zbc_model == BLK_ZONED_HM && devip->max_open) in inquiry_vpd_b6()
2000 put_unaligned_be32(devip->max_open, &arr[12]); in inquiry_vpd_b6()
2003 if (devip->zcap < devip->zsize) { in inquiry_vpd_b6()
2005 put_unaligned_be64(devip->zsize, &arr[20]); in inquiry_vpd_b6()
2028 static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_inquiry() argument
2042 is_zbc = devip->zoned; in resp_inquiry()
2047 else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL)) in resp_inquiry()
2060 int host_no = devip->sdbg_host->shost->host_no; in resp_inquiry()
2064 (devip->channel & 0x7f); in resp_inquiry()
2068 (devip->target * 1000) + devip->lun); in resp_inquiry()
2070 (devip->target * 1000) - 3; in resp_inquiry()
2100 &devip->lu_name); in resp_inquiry()
2132 arr[3] = inquiry_vpd_b1(devip, &arr[4]); in resp_inquiry()
2136 arr[3] = inquiry_vpd_b6(devip, &arr[4]); in resp_inquiry()
2192 struct sdebug_dev_info *devip) in resp_requests() argument
2199 int stopped_state = atomic_read(&devip->stopped); in resp_requests()
2245 static int resp_start_stop(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_start_stop() argument
2257 stopped_state = atomic_read(&devip->stopped); in resp_start_stop()
2261 if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) { in resp_start_stop()
2262 u64 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts)); in resp_start_stop()
2266 atomic_set(&devip->stopped, 0); in resp_start_stop()
2281 atomic_xchg(&devip->stopped, want_stop); in resp_start_stop()
2285 set_bit(SDEBUG_UA_NOT_READY_TO_READY, devip->uas_bm); /* not legal! */ in resp_start_stop()
2287 devip->tape_location[i] = 0; in resp_start_stop()
2288 devip->tape_partition = 0; in resp_start_stop()
2309 struct sdebug_dev_info *devip) in resp_readcap() argument
2328 struct sdebug_dev_info *devip) in resp_readcap16() argument
2357 if (devip->zoned) in resp_readcap16()
2374 struct sdebug_dev_info *devip) in resp_report_tgtpgs() argument
2378 int host_no = devip->sdbg_host->shost->host_no; in resp_report_tgtpgs()
2396 (devip->channel & 0x7f); in resp_report_tgtpgs()
2398 (devip->channel & 0x7f) + 0x80; in resp_report_tgtpgs()
2451 struct sdebug_dev_info *devip) in resp_rsup_opcodes() argument
2602 struct sdebug_dev_info *devip) in resp_rsup_tmfs() argument
2833 static int process_medium_part_m_pg(struct sdebug_dev_info *devip, in process_medium_part_m_pg() argument
2840 devip->tape_pending_nbr_partitions = TAPE_MAX_PARTITIONS; in process_medium_part_m_pg()
2841 devip->tape_pending_part_0_size = TAPE_UNITS - TAPE_PARTITION_1_UNITS; in process_medium_part_m_pg()
2842 devip->tape_pending_part_1_size = TAPE_PARTITION_1_UNITS; in process_medium_part_m_pg()
2868 devip->tape_pending_nbr_partitions = new_nbr; in process_medium_part_m_pg()
2869 devip->tape_pending_part_0_size = p0_size; in process_medium_part_m_pg()
2870 devip->tape_pending_part_1_size = p1_size; in process_medium_part_m_pg()
2872 devip->tape_pending_nbr_partitions = new_nbr; in process_medium_part_m_pg()
2896 struct sdebug_dev_info *devip) in resp_mode_sense() argument
2918 is_zbc = devip->zoned; in resp_mode_sense()
2929 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) + in resp_mode_sense()
2930 (devip->target * 1000) - 3; in resp_mode_sense()
2959 ap[0] = devip->tape_density; in resp_mode_sense()
2960 put_unaligned_be16(devip->tape_blksize, ap + 6); in resp_mode_sense()
3035 len = resp_compression_m_pg(ap, pcontrol, target, devip->tape_dce); in resp_mode_sense()
3108 struct sdebug_dev_info *devip) in resp_mode_select() argument
3154 devip->tape_density = arr[off]; in resp_mode_select()
3155 devip->tape_blksize = blksize; in resp_mode_select()
3202 devip->tape_dce = (arr[off + 2] & 0x80) != 0; in resp_mode_select()
3210 fld = process_medium_part_m_pg(devip, &arr[off], pg_len); in resp_mode_select()
3230 set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm); in resp_mode_select()
3276 struct sdebug_dev_info *devip) in resp_log_sense() argument
3377 struct sdebug_dev_info *devip) in resp_read_blklimits() argument
3388 struct sdebug_dev_info *devip) in resp_locate() argument
3396 if (cmd[8] >= devip->tape_nbr_partitions) { in resp_locate()
3400 devip->tape_partition = cmd[8]; in resp_locate()
3403 partition = devip->tape_partition; in resp_locate()
3405 for (i = 0, blp = devip->tape_blocks[partition]; in resp_locate()
3406 i < pos && i < devip->tape_eop[partition]; i++, blp++) in resp_locate()
3410 devip->tape_location[partition] = i; in resp_locate()
3414 devip->tape_location[partition] = pos; in resp_locate()
3420 struct sdebug_dev_info *devip) in resp_write_filemarks() argument
3425 int partition = devip->tape_partition; in resp_write_filemarks()
3433 for (i = 0, pos = devip->tape_location[partition]; i < count; i++, pos++) { in resp_write_filemarks()
3434 if (pos >= devip->tape_eop[partition] - 1) { /* don't overwrite EOD */ in resp_write_filemarks()
3435 devip->tape_location[partition] = devip->tape_eop[partition] - 1; in resp_write_filemarks()
3440 (devip->tape_blocks[partition] + pos)->fl_size = data; in resp_write_filemarks()
3442 (devip->tape_blocks[partition] + pos)->fl_size = in resp_write_filemarks()
3444 devip->tape_location[partition] = pos; in resp_write_filemarks()
3450 struct sdebug_dev_info *devip) in resp_space() argument
3455 int partition = devip->tape_partition; in resp_space()
3462 pos = devip->tape_location[partition]; in resp_space()
3467 for (i = 0, blp = devip->tape_blocks[partition] + pos; i < count; in resp_space()
3479 for (i = 0, blp = devip->tape_blocks[partition] + pos; i < count; in resp_space()
3487 if (pos >= devip->tape_eop[partition]) in resp_space()
3497 for (i = 0, blp = devip->tape_blocks[partition] + pos; in resp_space()
3508 for (i = 0, blp = devip->tape_blocks[partition] + pos; in resp_space()
3512 pos < devip->tape_eop[partition]; in resp_space()
3517 if (pos >= devip->tape_eop[partition]) in resp_space()
3522 for (blp = devip->tape_blocks[partition] + pos; in resp_space()
3523 !IS_TAPE_BLOCK_EOD(blp->fl_size) && pos < devip->tape_eop[partition]; in resp_space()
3526 if (pos >= devip->tape_eop[partition]) in resp_space()
3533 devip->tape_location[partition] = pos; in resp_space()
3537 devip->tape_location[partition] = pos; in resp_space()
3544 devip->tape_location[partition] = pos; in resp_space()
3551 devip->tape_location[partition] = 0; in resp_space()
3555 devip->tape_location[partition] = 0; in resp_space()
3559 devip->tape_location[partition] = devip->tape_eop[partition] - 1; in resp_space()
3567 struct sdebug_dev_info *devip) in resp_rewind() argument
3569 devip->tape_location[devip->tape_partition] = 0; in resp_rewind()
3574 static int partition_tape(struct sdebug_dev_info *devip, int nbr_partitions, in partition_tape() argument
3581 devip->tape_eop[0] = part_0_size; in partition_tape()
3582 devip->tape_blocks[0]->fl_size = TAPE_BLOCK_EOD_FLAG; in partition_tape()
3583 devip->tape_eop[1] = part_1_size; in partition_tape()
3584 devip->tape_blocks[1] = devip->tape_blocks[0] + in partition_tape()
3585 devip->tape_eop[0]; in partition_tape()
3586 devip->tape_blocks[1]->fl_size = TAPE_BLOCK_EOD_FLAG; in partition_tape()
3589 devip->tape_location[i] = 0; in partition_tape()
3591 devip->tape_nbr_partitions = nbr_partitions; in partition_tape()
3592 devip->tape_partition = 0; in partition_tape()
3595 put_unaligned_be16(devip->tape_eop[0], partition_pg + 8); in partition_tape()
3596 put_unaligned_be16(devip->tape_eop[1], partition_pg + 10); in partition_tape()
3602 struct sdebug_dev_info *devip) in resp_format_medium() argument
3616 if (devip->tape_pending_nbr_partitions > 0) { in resp_format_medium()
3617 res = partition_tape(devip, in resp_format_medium()
3618 devip->tape_pending_nbr_partitions, in resp_format_medium()
3619 devip->tape_pending_part_0_size, in resp_format_medium()
3620 devip->tape_pending_part_1_size); in resp_format_medium()
3622 res = partition_tape(devip, devip->tape_nbr_partitions, in resp_format_medium()
3623 devip->tape_eop[0], devip->tape_eop[1]); in resp_format_medium()
3625 res = partition_tape(devip, 1, TAPE_UNITS, 0); in resp_format_medium()
3629 devip->tape_pending_nbr_partitions = -1; in resp_format_medium()
3634 static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip) in sdebug_dev_is_zoned() argument
3636 return devip->nr_zones != 0; in sdebug_dev_is_zoned()
3639 static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip, in zbc_zone() argument
3642 u32 zno = lba >> devip->zsize_shift; in zbc_zone()
3645 if (devip->zcap == devip->zsize || zno < devip->nr_conv_zones) in zbc_zone()
3646 return &devip->zstate[zno]; in zbc_zone()
3652 zno = 2 * zno - devip->nr_conv_zones; in zbc_zone()
3653 WARN_ONCE(zno >= devip->nr_zones, "%u > %u\n", zno, devip->nr_zones); in zbc_zone()
3654 zsp = &devip->zstate[zno]; in zbc_zone()
3676 static void zbc_close_zone(struct sdebug_dev_info *devip, in zbc_close_zone() argument
3689 devip->nr_imp_open--; in zbc_close_zone()
3691 devip->nr_exp_open--; in zbc_close_zone()
3697 devip->nr_closed++; in zbc_close_zone()
3701 static void zbc_close_imp_open_zone(struct sdebug_dev_info *devip) in zbc_close_imp_open_zone() argument
3703 struct sdeb_zone_state *zsp = &devip->zstate[0]; in zbc_close_imp_open_zone()
3706 for (i = 0; i < devip->nr_zones; i++, zsp++) { in zbc_close_imp_open_zone()
3708 zbc_close_zone(devip, zsp); in zbc_close_imp_open_zone()
3714 static void zbc_open_zone(struct sdebug_dev_info *devip, in zbc_open_zone() argument
3729 zbc_close_zone(devip, zsp); in zbc_open_zone()
3730 else if (devip->max_open && in zbc_open_zone()
3731 devip->nr_imp_open + devip->nr_exp_open >= devip->max_open) in zbc_open_zone()
3732 zbc_close_imp_open_zone(devip); in zbc_open_zone()
3735 devip->nr_closed--; in zbc_open_zone()
3738 devip->nr_exp_open++; in zbc_open_zone()
3741 devip->nr_imp_open++; in zbc_open_zone()
3745 static inline void zbc_set_zone_full(struct sdebug_dev_info *devip, in zbc_set_zone_full() argument
3750 devip->nr_imp_open--; in zbc_set_zone_full()
3753 devip->nr_exp_open--; in zbc_set_zone_full()
3763 static void zbc_inc_wp(struct sdebug_dev_info *devip, in zbc_inc_wp() argument
3766 struct sdeb_zone_state *zsp = zbc_zone(devip, lba); in zbc_inc_wp()
3775 zbc_set_zone_full(devip, zsp); in zbc_inc_wp()
3794 zbc_set_zone_full(devip, zsp); in zbc_inc_wp()
3809 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in check_zbc_access_params() local
3810 struct sdeb_zone_state *zsp = zbc_zone(devip, lba); in check_zbc_access_params()
3811 struct sdeb_zone_state *zsp_end = zbc_zone(devip, lba + num - 1); in check_zbc_access_params()
3867 if (devip->max_open && in check_zbc_access_params()
3868 devip->nr_exp_open >= devip->max_open) { in check_zbc_access_params()
3874 zbc_open_zone(devip, zsp, false); in check_zbc_access_params()
3885 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in check_device_access_params() local
3901 if (sdebug_dev_is_zoned(devip)) in check_device_access_params()
3913 static inline struct sdeb_store_info *devip2sip(struct sdebug_dev_info *devip, in devip2sip() argument
3920 return xa_load(per_store_ap, devip->sdbg_host->si_idx); in devip2sip()
4367 static int resp_read_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_read_tape() argument
4372 int partition = devip->tape_partition; in resp_read_tape()
4373 u32 pos = devip->tape_location[partition]; in resp_read_tape()
4391 size = devip->tape_blksize; in resp_read_tape()
4402 for (i = 0, blp = devip->tape_blocks[partition] + pos; in resp_read_tape()
4403 i < num && pos < devip->tape_eop[partition]; in resp_read_tape()
4405 devip->tape_location[partition] = pos + 1; in resp_read_tape()
4418 devip->tape_location[partition] = pos; in resp_read_tape()
4427 if (blp->fl_size != devip->tape_blksize) { in resp_read_tape()
4447 if (pos >= devip->tape_eop[partition]) { in resp_read_tape()
4451 devip->tape_location[partition] = pos - 1; in resp_read_tape()
4454 devip->tape_location[partition] = pos; in resp_read_tape()
4459 static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_read_dt0() argument
4466 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_read_dt0()
4471 return resp_read_tape(scp, devip); in resp_read_dt0()
4553 if (sdebug_dev_is_zoned(devip) || in resp_read_dt0()
4769 static int resp_write_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_write_tape() argument
4774 int partition = devip->tape_partition; in resp_write_tape()
4775 int pos = devip->tape_location[partition]; in resp_write_tape()
4788 size = devip->tape_blksize; in resp_write_tape()
4800 for (i = 0, blp = devip->tape_blocks[partition] + pos, ew = false; in resp_write_tape()
4801 i < num && pos < devip->tape_eop[partition] - 1; i++, pos++, blp++) { in resp_write_tape()
4807 ew |= (pos == devip->tape_eop[partition] - TAPE_EW); in resp_write_tape()
4810 devip->tape_location[partition] = pos; in resp_write_tape()
4812 if (pos >= devip->tape_eop[partition] - 1) { in resp_write_tape()
4830 static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_write_dt0() argument
4838 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_write_dt0()
4843 return resp_write_tape(scp, devip); in resp_write_dt0()
4902 if (sdebug_dev_is_zoned(devip) || in resp_write_dt0()
4949 if (sdebug_dev_is_zoned(devip)) in resp_write_dt0()
4950 zbc_inc_wp(devip, lba, num); in resp_write_dt0()
4987 struct sdebug_dev_info *devip) in resp_write_scat() argument
4992 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_write_scat()
5113 if (sdebug_dev_is_zoned(devip)) in resp_write_scat()
5114 zbc_inc_wp(devip, lba, num); in resp_write_scat()
5160 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in resp_write_same() local
5171 if (sdebug_dev_is_zoned(devip) || scsi_debug_lbp()) { in resp_write_same()
5213 if (sdebug_dev_is_zoned(devip)) in resp_write_same()
5214 zbc_inc_wp(devip, lba, num); in resp_write_same()
5224 struct sdebug_dev_info *devip) in resp_write_same_10() argument
5249 struct sdebug_dev_info *devip) in resp_write_same_16() argument
5280 struct sdebug_dev_info *devip) in resp_write_buffer() argument
5291 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in resp_write_buffer()
5292 set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm); in resp_write_buffer()
5295 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm); in resp_write_buffer()
5300 &devip->sdbg_host->dev_info_list, in resp_write_buffer()
5304 if (devip != dp) in resp_write_buffer()
5312 &devip->sdbg_host->dev_info_list, in resp_write_buffer()
5326 struct sdebug_dev_info *devip) in resp_comp_write() argument
5330 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_comp_write()
5397 static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_unmap() argument
5401 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_unmap()
5455 struct sdebug_dev_info *devip) in resp_get_lba_status() argument
5474 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_get_lba_status()
5497 struct sdebug_dev_info *devip) in resp_get_stream_status() argument
5542 struct sdebug_dev_info *devip) in resp_sync_cache() argument
5578 struct sdebug_dev_info *devip) in resp_pre_fetch() argument
5585 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_pre_fetch()
5602 arr[1] = devip->tape_partition; in resp_pre_fetch()
5603 pos = devip->tape_location[devip->tape_partition]; in resp_pre_fetch()
5656 struct sdebug_dev_info *devip) in resp_report_luns() argument
5672 clear_luns_changed_on_target(devip); in resp_report_luns()
5748 static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_verify() argument
5758 struct sdeb_store_info *sip = devip2sip(devip, true); in resp_verify()
5828 struct sdebug_dev_info *devip) in resp_report_zones() argument
5838 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_report_zones()
5840 if (!sdebug_dev_is_zoned(devip)) { in resp_report_zones()
5870 if (WARN_ONCE(zbc_zone(devip, lba) == zsp, "lba = %llu\n", lba)) in resp_report_zones()
5872 zsp = zbc_zone(devip, lba); in resp_report_zones()
5956 if (devip->zcap < devip->zsize) in resp_report_zones()
5957 put_unaligned_be64(devip->zsize, arr + 16); in resp_report_zones()
5969 struct sdebug_dev_info *devip) in resp_atomic_write() argument
5982 sip = devip2sip(devip, true); in resp_atomic_write()
6028 static void zbc_open_all(struct sdebug_dev_info *devip) in zbc_open_all() argument
6030 struct sdeb_zone_state *zsp = &devip->zstate[0]; in zbc_open_all()
6033 for (i = 0; i < devip->nr_zones; i++, zsp++) { in zbc_open_all()
6035 zbc_open_zone(devip, &devip->zstate[i], true); in zbc_open_all()
6039 static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_open_zone() argument
6047 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_open_zone()
6049 if (!sdebug_dev_is_zoned(devip)) { in resp_open_zone()
6057 if (devip->max_open && in resp_open_zone()
6058 devip->nr_exp_open + devip->nr_closed > devip->max_open) { in resp_open_zone()
6065 zbc_open_all(devip); in resp_open_zone()
6077 zsp = zbc_zone(devip, z_id); in resp_open_zone()
6093 if (devip->max_open && devip->nr_exp_open >= devip->max_open) { in resp_open_zone()
6100 zbc_open_zone(devip, zsp, true); in resp_open_zone()
6106 static void zbc_close_all(struct sdebug_dev_info *devip) in zbc_close_all() argument
6110 for (i = 0; i < devip->nr_zones; i++) in zbc_close_all()
6111 zbc_close_zone(devip, &devip->zstate[i]); in zbc_close_all()
6115 struct sdebug_dev_info *devip) in resp_close_zone() argument
6122 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_close_zone()
6124 if (!sdebug_dev_is_zoned(devip)) { in resp_close_zone()
6132 zbc_close_all(devip); in resp_close_zone()
6144 zsp = zbc_zone(devip, z_id); in resp_close_zone()
6156 zbc_close_zone(devip, zsp); in resp_close_zone()
6162 static void zbc_finish_zone(struct sdebug_dev_info *devip, in zbc_finish_zone() argument
6170 zbc_close_zone(devip, zsp); in zbc_finish_zone()
6172 devip->nr_closed--; in zbc_finish_zone()
6178 static void zbc_finish_all(struct sdebug_dev_info *devip) in zbc_finish_all() argument
6182 for (i = 0; i < devip->nr_zones; i++) in zbc_finish_all()
6183 zbc_finish_zone(devip, &devip->zstate[i], false); in zbc_finish_all()
6187 struct sdebug_dev_info *devip) in resp_finish_zone() argument
6194 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_finish_zone()
6196 if (!sdebug_dev_is_zoned(devip)) { in resp_finish_zone()
6204 zbc_finish_all(devip); in resp_finish_zone()
6216 zsp = zbc_zone(devip, z_id); in resp_finish_zone()
6228 zbc_finish_zone(devip, zsp, true); in resp_finish_zone()
6234 static void zbc_rwp_zone(struct sdebug_dev_info *devip, in zbc_rwp_zone() argument
6238 struct sdeb_store_info *sip = devip2sip(devip, false); in zbc_rwp_zone()
6245 zbc_close_zone(devip, zsp); in zbc_rwp_zone()
6248 devip->nr_closed--; in zbc_rwp_zone()
6259 static void zbc_rwp_all(struct sdebug_dev_info *devip) in zbc_rwp_all() argument
6263 for (i = 0; i < devip->nr_zones; i++) in zbc_rwp_all()
6264 zbc_rwp_zone(devip, &devip->zstate[i]); in zbc_rwp_all()
6267 static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_rwp_zone() argument
6274 struct sdeb_store_info *sip = devip2sip(devip, false); in resp_rwp_zone()
6276 if (!sdebug_dev_is_zoned(devip)) { in resp_rwp_zone()
6284 zbc_rwp_all(devip); in resp_rwp_zone()
6295 zsp = zbc_zone(devip, z_id); in resp_rwp_zone()
6307 zbc_rwp_zone(devip, zsp); in resp_rwp_zone()
6374 static int sdebug_device_create_zones(struct sdebug_dev_info *devip) in sdebug_device_create_zones() argument
6389 devip->zsize = (DEF_ZBC_ZONE_SIZE_MB * SZ_1M) in sdebug_device_create_zones()
6391 while (capacity < devip->zsize << 2 && devip->zsize >= 2) in sdebug_device_create_zones()
6392 devip->zsize >>= 1; in sdebug_device_create_zones()
6393 if (devip->zsize < 2) { in sdebug_device_create_zones()
6402 devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M) in sdebug_device_create_zones()
6404 if (devip->zsize >= capacity) { in sdebug_device_create_zones()
6410 devip->zsize_shift = ilog2(devip->zsize); in sdebug_device_create_zones()
6411 devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift; in sdebug_device_create_zones()
6414 devip->zcap = devip->zsize; in sdebug_device_create_zones()
6416 devip->zcap = (sdeb_zbc_zone_cap_mb * SZ_1M) >> in sdebug_device_create_zones()
6418 if (devip->zcap > devip->zsize) { in sdebug_device_create_zones()
6424 conv_capacity = (sector_t)sdeb_zbc_nr_conv << devip->zsize_shift; in sdebug_device_create_zones()
6429 devip->nr_conv_zones = sdeb_zbc_nr_conv; in sdebug_device_create_zones()
6430 devip->nr_seq_zones = ALIGN(capacity - conv_capacity, devip->zsize) >> in sdebug_device_create_zones()
6431 devip->zsize_shift; in sdebug_device_create_zones()
6432 devip->nr_zones = devip->nr_conv_zones + devip->nr_seq_zones; in sdebug_device_create_zones()
6435 if (devip->zcap < devip->zsize) in sdebug_device_create_zones()
6436 devip->nr_zones += devip->nr_seq_zones; in sdebug_device_create_zones()
6438 if (devip->zoned) { in sdebug_device_create_zones()
6440 if (sdeb_zbc_max_open >= devip->nr_zones - 1) in sdebug_device_create_zones()
6441 devip->max_open = (devip->nr_zones - 1) / 2; in sdebug_device_create_zones()
6443 devip->max_open = sdeb_zbc_max_open; in sdebug_device_create_zones()
6446 devip->zstate = kcalloc(devip->nr_zones, in sdebug_device_create_zones()
6448 if (!devip->zstate) in sdebug_device_create_zones()
6451 for (i = 0; i < devip->nr_zones; i++) { in sdebug_device_create_zones()
6452 zsp = &devip->zstate[i]; in sdebug_device_create_zones()
6456 if (i < devip->nr_conv_zones) { in sdebug_device_create_zones()
6461 min_t(u64, devip->zsize, capacity - zstart); in sdebug_device_create_zones()
6462 } else if ((zstart & (devip->zsize - 1)) == 0) { in sdebug_device_create_zones()
6463 if (devip->zoned) in sdebug_device_create_zones()
6470 min_t(u64, devip->zcap, capacity - zstart); in sdebug_device_create_zones()
6475 zsp->z_size = min_t(u64, devip->zsize - devip->zcap, in sdebug_device_create_zones()
6489 struct sdebug_dev_info *devip; in sdebug_device_create() local
6491 devip = kzalloc(sizeof(*devip), flags); in sdebug_device_create()
6492 if (devip) { in sdebug_device_create()
6494 uuid_gen(&devip->lu_name); in sdebug_device_create()
6497 devip->lu_name = shared_uuid; in sdebug_device_create()
6501 devip->lu_name = shared_uuid; in sdebug_device_create()
6504 devip->sdbg_host = sdbg_host; in sdebug_device_create()
6506 devip->zoned = sdeb_zbc_model == BLK_ZONED_HM; in sdebug_device_create()
6507 if (sdebug_device_create_zones(devip)) { in sdebug_device_create()
6508 kfree(devip); in sdebug_device_create()
6512 devip->zoned = false; in sdebug_device_create()
6515 devip->tape_density = TAPE_DEF_DENSITY; in sdebug_device_create()
6516 devip->tape_blksize = TAPE_DEF_BLKSIZE; in sdebug_device_create()
6518 devip->create_ts = ktime_get_boottime(); in sdebug_device_create()
6519 atomic_set(&devip->stopped, (sdeb_tur_ms_to_ready > 0 ? 2 : 0)); in sdebug_device_create()
6520 spin_lock_init(&devip->list_lock); in sdebug_device_create()
6521 INIT_LIST_HEAD(&devip->inject_err_list); in sdebug_device_create()
6522 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list); in sdebug_device_create()
6524 return devip; in sdebug_device_create()
6531 struct sdebug_dev_info *devip; in find_build_dev_info() local
6535 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) { in find_build_dev_info()
6536 if ((devip->used) && (devip->channel == sdev->channel) && in find_build_dev_info()
6537 (devip->target == sdev->id) && in find_build_dev_info()
6538 (devip->lun == sdev->lun)) in find_build_dev_info()
6539 return devip; in find_build_dev_info()
6541 if ((!devip->used) && (!open_devip)) in find_build_dev_info()
6542 open_devip = devip; in find_build_dev_info()
6574 struct sdebug_dev_info *devip = in scsi_debug_sdev_configure() local
6583 if (devip == NULL) { in scsi_debug_sdev_configure()
6584 devip = find_build_dev_info(sdp); in scsi_debug_sdev_configure()
6585 if (devip == NULL) in scsi_debug_sdev_configure()
6589 if (!devip->tape_blocks[0]) { in scsi_debug_sdev_configure()
6590 devip->tape_blocks[0] = in scsi_debug_sdev_configure()
6593 if (!devip->tape_blocks[0]) in scsi_debug_sdev_configure()
6596 devip->tape_pending_nbr_partitions = -1; in scsi_debug_sdev_configure()
6597 if (partition_tape(devip, 1, TAPE_UNITS, 0) < 0) { in scsi_debug_sdev_configure()
6598 kfree(devip->tape_blocks[0]); in scsi_debug_sdev_configure()
6599 devip->tape_blocks[0] = NULL; in scsi_debug_sdev_configure()
6603 sdp->hostdata = devip; in scsi_debug_sdev_configure()
6611 devip->debugfs_entry = debugfs_create_dir(dev_name(&sdp->sdev_dev), in scsi_debug_sdev_configure()
6613 if (IS_ERR_OR_NULL(devip->debugfs_entry)) in scsi_debug_sdev_configure()
6617 dentry = debugfs_create_file("error", 0600, devip->debugfs_entry, sdp, in scsi_debug_sdev_configure()
6628 struct sdebug_dev_info *devip = in scsi_debug_sdev_destroy() local
6636 if (!devip) in scsi_debug_sdev_destroy()
6639 spin_lock(&devip->list_lock); in scsi_debug_sdev_destroy()
6640 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in scsi_debug_sdev_destroy()
6644 spin_unlock(&devip->list_lock); in scsi_debug_sdev_destroy()
6646 debugfs_remove(devip->debugfs_entry); in scsi_debug_sdev_destroy()
6649 kfree(devip->tape_blocks[0]); in scsi_debug_sdev_destroy()
6650 devip->tape_blocks[0] = NULL; in scsi_debug_sdev_destroy()
6654 devip->used = false; in scsi_debug_sdev_destroy()
6735 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_abort() local
6740 if (devip == NULL) in sdebug_fail_abort()
6744 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_abort()
6809 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_lun_reset() local
6814 if (devip == NULL) in sdebug_fail_lun_reset()
6818 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_lun_reset()
6834 static void scsi_tape_reset_clear(struct sdebug_dev_info *devip) in scsi_tape_reset_clear() argument
6839 devip->tape_blksize = TAPE_DEF_BLKSIZE; in scsi_tape_reset_clear()
6840 devip->tape_density = TAPE_DEF_DENSITY; in scsi_tape_reset_clear()
6841 devip->tape_partition = 0; in scsi_tape_reset_clear()
6842 devip->tape_dce = 0; in scsi_tape_reset_clear()
6844 devip->tape_location[i] = 0; in scsi_tape_reset_clear()
6845 devip->tape_pending_nbr_partitions = -1; in scsi_tape_reset_clear()
6853 struct sdebug_dev_info *devip = sdp->hostdata; in scsi_debug_device_reset() local
6863 if (devip) { in scsi_debug_device_reset()
6864 set_bit(SDEBUG_UA_POR, devip->uas_bm); in scsi_debug_device_reset()
6865 scsi_tape_reset_clear(devip); in scsi_debug_device_reset()
6892 struct sdebug_dev_info *devip; in scsi_debug_target_reset() local
6901 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) { in scsi_debug_target_reset()
6902 if (devip->target == sdp->id) { in scsi_debug_target_reset()
6903 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in scsi_debug_target_reset()
6904 scsi_tape_reset_clear(devip); in scsi_debug_target_reset()
6926 struct sdebug_dev_info *devip; in scsi_debug_bus_reset() local
6934 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) { in scsi_debug_bus_reset()
6935 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in scsi_debug_bus_reset()
6936 scsi_tape_reset_clear(devip); in scsi_debug_bus_reset()
6949 struct sdebug_dev_info *devip; in scsi_debug_host_reset() local
6957 list_for_each_entry(devip, &sdbg_host->dev_info_list, in scsi_debug_host_reset()
6959 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm); in scsi_debug_host_reset()
6960 scsi_tape_reset_clear(devip); in scsi_debug_host_reset()
7082 static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip, in schedule_resp() argument
7096 if (unlikely(devip == NULL)) { in schedule_resp()
7130 cmnd->result = pfp ? pfp(cmnd, devip) : 0; in schedule_resp()
7226 cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0; in schedule_resp()
8877 struct sdebug_dev_info *devip = sdev->hostdata; in sdebug_change_qdepth() local
8879 if (!devip) in sdebug_change_qdepth()
8919 static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip) in resp_not_ready() argument
8926 stopped_state = atomic_read(&devip->stopped); in resp_not_ready()
8928 if (ktime_to_ns(now_ts) > ktime_to_ns(devip->create_ts)) { in resp_not_ready()
8929 diff_ns = ktime_to_ns(ktime_sub(now_ts, devip->create_ts)); in resp_not_ready()
8932 atomic_set(&devip->stopped, 0); in resp_not_ready()
9064 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_timeout_cmd() local
9069 if (devip == NULL) in sdebug_timeout_cmd()
9073 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_timeout_cmd()
9092 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_queue_cmd() local
9097 if (devip == NULL) in sdebug_fail_queue_cmd()
9101 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_queue_cmd()
9121 struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata; in sdebug_fail_cmd() local
9127 if (devip == NULL) in sdebug_fail_cmd()
9131 list_for_each_entry_rcu(err, &devip->inject_err_list, list) { in sdebug_fail_cmd()
9154 *retval = schedule_resp(cmnd, devip, result, NULL, 0, 0); in sdebug_fail_cmd()
9166 struct sdebug_dev_info *devip; in scsi_debug_queuecommand() local
9213 devip = (struct sdebug_dev_info *)sdp->hostdata; in scsi_debug_queuecommand()
9214 if (unlikely(!devip)) { in scsi_debug_queuecommand()
9215 devip = find_build_dev_info(sdp); in scsi_debug_queuecommand()
9216 if (NULL == devip) in scsi_debug_queuecommand()
9303 find_first_bit(devip->uas_bm, in scsi_debug_queuecommand()
9305 errsts = make_ua(scp, devip); in scsi_debug_queuecommand()
9310 atomic_read(&devip->stopped))) { in scsi_debug_queuecommand()
9311 errsts = resp_not_ready(scp, devip); in scsi_debug_queuecommand()
9328 return schedule_resp(scp, devip, errsts, pfp, 0, 0); in scsi_debug_queuecommand()
9341 return schedule_resp(scp, devip, errsts, pfp, jdelay, 0); in scsi_debug_queuecommand()
9343 return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay, in scsi_debug_queuecommand()
9346 return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0); in scsi_debug_queuecommand()