Lines Matching +full:max +full:- +full:adj

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2014-2021 Alexander Motin <mav@FreeBSD.org>
67 #define TPC_MAX_IO_SIZE (8 * MIN(1024 * 1024, MAX(128 * 1024, maxphys)))
164 STAILQ_FOREACH(lun, &softc->lun_list, links) { in tpc_timeout()
165 mtx_lock(&lun->lun_lock); in tpc_timeout()
166 TAILQ_FOREACH_SAFE(list, &lun->tpc_lists, links, tlist) { in tpc_timeout()
167 if (!list->completed || time_uptime < list->last_active + in tpc_timeout()
170 TAILQ_REMOVE(&lun->tpc_lists, list, links); in tpc_timeout()
173 mtx_unlock(&lun->lun_lock); in tpc_timeout()
177 mtx_lock(&softc->tpc_lock); in tpc_timeout()
178 TAILQ_FOREACH_SAFE(token, &softc->tpc_tokens, links, ttoken) { in tpc_timeout()
179 if (token->active || in tpc_timeout()
180 time_uptime < token->last_active + token->timeout + 1) in tpc_timeout()
182 TAILQ_REMOVE(&softc->tpc_tokens, token, links); in tpc_timeout()
183 free(token->params, M_CTL); in tpc_timeout()
186 mtx_unlock(&softc->tpc_lock); in tpc_timeout()
187 callout_schedule_sbt(&softc->tpc_timeout, SBT_1S, SBT_1S, 0); in tpc_timeout()
194 mtx_init(&softc->tpc_lock, "CTL TPC mutex", NULL, MTX_DEF); in ctl_tpc_init()
195 TAILQ_INIT(&softc->tpc_tokens); in ctl_tpc_init()
196 callout_init_mtx(&softc->tpc_timeout, &softc->ctl_lock, 0); in ctl_tpc_init()
197 callout_reset_sbt(&softc->tpc_timeout, SBT_1S, SBT_1S, in ctl_tpc_init()
206 callout_drain(&softc->tpc_timeout); in ctl_tpc_shutdown()
209 mtx_lock(&softc->tpc_lock); in ctl_tpc_shutdown()
210 while ((token = TAILQ_FIRST(&softc->tpc_tokens)) != NULL) { in ctl_tpc_shutdown()
211 TAILQ_REMOVE(&softc->tpc_tokens, token, links); in ctl_tpc_shutdown()
212 free(token->params, M_CTL); in ctl_tpc_shutdown()
215 mtx_unlock(&softc->tpc_lock); in ctl_tpc_shutdown()
216 mtx_destroy(&softc->tpc_lock); in ctl_tpc_shutdown()
223 TAILQ_INIT(&lun->tpc_lists); in ctl_tpc_lun_init()
231 TAILQ_FOREACH_SAFE(list, &lun->tpc_lists, links, tlist) { in ctl_tpc_lun_clear()
232 if (initidx != -1 && list->init_idx != initidx) in ctl_tpc_lun_clear()
234 if (!list->completed) in ctl_tpc_lun_clear()
236 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_tpc_lun_clear()
244 struct ctl_softc *softc = lun->ctl_softc; in ctl_tpc_lun_shutdown()
249 while ((list = TAILQ_FIRST(&lun->tpc_lists)) != NULL) { in ctl_tpc_lun_shutdown()
250 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_tpc_lun_shutdown()
251 KASSERT(list->completed, in ctl_tpc_lun_shutdown()
257 mtx_lock(&softc->tpc_lock); in ctl_tpc_lun_shutdown()
258 TAILQ_FOREACH_SAFE(token, &softc->tpc_tokens, links, ttoken) { in ctl_tpc_lun_shutdown()
259 if (token->lun != lun->lun || token->active) in ctl_tpc_lun_shutdown()
261 TAILQ_REMOVE(&softc->tpc_tokens, token, links); in ctl_tpc_lun_shutdown()
262 free(token->params, M_CTL); in ctl_tpc_lun_shutdown()
265 mtx_unlock(&softc->tpc_lock); in ctl_tpc_lun_shutdown()
300 ctsio->kern_data_ptr = malloc(data_len, M_CTL, M_WAITOK | M_ZERO); in ctl_inquiry_evpd_tpc()
301 tpc_ptr = (struct scsi_vpd_tpc *)ctsio->kern_data_ptr; in ctl_inquiry_evpd_tpc()
302 ctsio->kern_rel_offset = 0; in ctl_inquiry_evpd_tpc()
303 ctsio->kern_sg_entries = 0; in ctl_inquiry_evpd_tpc()
304 ctsio->kern_data_len = min(data_len, alloc_len); in ctl_inquiry_evpd_tpc()
305 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_inquiry_evpd_tpc()
312 tpc_ptr->device = (SID_QUAL_LU_CONNECTED << 5) | in ctl_inquiry_evpd_tpc()
313 lun->be_lun->lun_type; in ctl_inquiry_evpd_tpc()
315 tpc_ptr->device = (SID_QUAL_LU_OFFLINE << 5) | T_DIRECT; in ctl_inquiry_evpd_tpc()
316 tpc_ptr->page_code = SVPD_SCSI_TPC; in ctl_inquiry_evpd_tpc()
317 scsi_ulto2b(data_len - 4, tpc_ptr->page_length); in ctl_inquiry_evpd_tpc()
320 d_ptr = (struct scsi_vpd_tpc_descriptor *)&tpc_ptr->descr[0]; in ctl_inquiry_evpd_tpc()
322 scsi_ulto2b(SVPD_TPC_BDRL, bdrl_ptr->desc_type); in ctl_inquiry_evpd_tpc()
323 scsi_ulto2b(sizeof(*bdrl_ptr) - 4, bdrl_ptr->desc_length); in ctl_inquiry_evpd_tpc()
324 scsi_ulto2b(TPC_MAX_SEGS, bdrl_ptr->maximum_ranges); in ctl_inquiry_evpd_tpc()
326 bdrl_ptr->maximum_inactivity_timeout); in ctl_inquiry_evpd_tpc()
328 bdrl_ptr->default_inactivity_timeout); in ctl_inquiry_evpd_tpc()
329 scsi_u64to8b(0, bdrl_ptr->maximum_token_transfer_size); in ctl_inquiry_evpd_tpc()
330 scsi_u64to8b(0, bdrl_ptr->optimal_transfer_count); in ctl_inquiry_evpd_tpc()
334 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
336 scsi_ulto2b(SVPD_TPC_SC, sc_ptr->desc_type); in ctl_inquiry_evpd_tpc()
337 sc_ptr->list_length = 2 * sizeof(*scd_ptr) + 11; in ctl_inquiry_evpd_tpc()
338 scsi_ulto2b(roundup2(1 + sc_ptr->list_length, 4), sc_ptr->desc_length); in ctl_inquiry_evpd_tpc()
339 scd_ptr = &sc_ptr->descr[0]; in ctl_inquiry_evpd_tpc()
340 scd_ptr->opcode = EXTENDED_COPY; in ctl_inquiry_evpd_tpc()
341 scd_ptr->sa_length = 5; in ctl_inquiry_evpd_tpc()
342 scd_ptr->supported_service_actions[0] = EC_EC_LID1; in ctl_inquiry_evpd_tpc()
343 scd_ptr->supported_service_actions[1] = EC_EC_LID4; in ctl_inquiry_evpd_tpc()
344 scd_ptr->supported_service_actions[2] = EC_PT; in ctl_inquiry_evpd_tpc()
345 scd_ptr->supported_service_actions[3] = EC_WUT; in ctl_inquiry_evpd_tpc()
346 scd_ptr->supported_service_actions[4] = EC_COA; in ctl_inquiry_evpd_tpc()
348 &scd_ptr->supported_service_actions[scd_ptr->sa_length]; in ctl_inquiry_evpd_tpc()
349 scd_ptr->opcode = RECEIVE_COPY_STATUS; in ctl_inquiry_evpd_tpc()
350 scd_ptr->sa_length = 6; in ctl_inquiry_evpd_tpc()
351 scd_ptr->supported_service_actions[0] = RCS_RCS_LID1; in ctl_inquiry_evpd_tpc()
352 scd_ptr->supported_service_actions[1] = RCS_RCFD; in ctl_inquiry_evpd_tpc()
353 scd_ptr->supported_service_actions[2] = RCS_RCS_LID4; in ctl_inquiry_evpd_tpc()
354 scd_ptr->supported_service_actions[3] = RCS_RCOP; in ctl_inquiry_evpd_tpc()
355 scd_ptr->supported_service_actions[4] = RCS_RRTI; in ctl_inquiry_evpd_tpc()
356 scd_ptr->supported_service_actions[5] = RCS_RART; in ctl_inquiry_evpd_tpc()
360 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
362 scsi_ulto2b(SVPD_TPC_PD, pd_ptr->desc_type); in ctl_inquiry_evpd_tpc()
363 scsi_ulto2b(sizeof(*pd_ptr) - 4, pd_ptr->desc_length); in ctl_inquiry_evpd_tpc()
364 scsi_ulto2b(TPC_MAX_CSCDS, pd_ptr->maximum_cscd_descriptor_count); in ctl_inquiry_evpd_tpc()
365 scsi_ulto2b(TPC_MAX_SEGS, pd_ptr->maximum_segment_descriptor_count); in ctl_inquiry_evpd_tpc()
366 scsi_ulto4b(TPC_MAX_LIST, pd_ptr->maximum_descriptor_list_length); in ctl_inquiry_evpd_tpc()
367 scsi_ulto4b(TPC_MAX_INLINE, pd_ptr->maximum_inline_data_length); in ctl_inquiry_evpd_tpc()
371 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
373 scsi_ulto2b(SVPD_TPC_SD, sd_ptr->desc_type); in ctl_inquiry_evpd_tpc()
374 scsi_ulto2b(roundup2(sizeof(*sd_ptr) - 4 + 4, 4), sd_ptr->desc_length); in ctl_inquiry_evpd_tpc()
375 sd_ptr->list_length = 4; in ctl_inquiry_evpd_tpc()
376 sd_ptr->supported_descriptor_codes[0] = EC_SEG_B2B; in ctl_inquiry_evpd_tpc()
377 sd_ptr->supported_descriptor_codes[1] = EC_SEG_VERIFY; in ctl_inquiry_evpd_tpc()
378 sd_ptr->supported_descriptor_codes[2] = EC_SEG_REGISTER_KEY; in ctl_inquiry_evpd_tpc()
379 sd_ptr->supported_descriptor_codes[3] = EC_CSCD_ID; in ctl_inquiry_evpd_tpc()
383 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
385 scsi_ulto2b(SVPD_TPC_SDID, sdid_ptr->desc_type); in ctl_inquiry_evpd_tpc()
386 scsi_ulto2b(roundup2(sizeof(*sdid_ptr) - 4 + 2, 4), sdid_ptr->desc_length); in ctl_inquiry_evpd_tpc()
387 scsi_ulto2b(2, sdid_ptr->list_length); in ctl_inquiry_evpd_tpc()
388 scsi_ulto2b(0xffff, &sdid_ptr->supported_descriptor_ids[0]); in ctl_inquiry_evpd_tpc()
392 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
394 scsi_ulto2b(SVPD_TPC_RTF, rtf_ptr->desc_type); in ctl_inquiry_evpd_tpc()
395 scsi_ulto2b(sizeof(*rtf_ptr) - 4 + sizeof(*rtfb_ptr), rtf_ptr->desc_length); in ctl_inquiry_evpd_tpc()
396 rtf_ptr->remote_tokens = 0; in ctl_inquiry_evpd_tpc()
397 scsi_ulto4b(TPC_MIN_TOKEN_TIMEOUT, rtf_ptr->minimum_token_lifetime); in ctl_inquiry_evpd_tpc()
398 scsi_ulto4b(UINT32_MAX, rtf_ptr->maximum_token_lifetime); in ctl_inquiry_evpd_tpc()
400 rtf_ptr->maximum_token_inactivity_timeout); in ctl_inquiry_evpd_tpc()
401 scsi_ulto2b(sizeof(*rtfb_ptr), rtf_ptr->type_specific_features_length); in ctl_inquiry_evpd_tpc()
403 &rtf_ptr->type_specific_features; in ctl_inquiry_evpd_tpc()
404 rtfb_ptr->type_format = SVPD_TPC_RTF_BLOCK; in ctl_inquiry_evpd_tpc()
405 scsi_ulto2b(sizeof(*rtfb_ptr) - 4, rtfb_ptr->desc_length); in ctl_inquiry_evpd_tpc()
406 scsi_ulto2b(0, rtfb_ptr->optimal_length_granularity); in ctl_inquiry_evpd_tpc()
407 scsi_u64to8b(0, rtfb_ptr->maximum_bytes); in ctl_inquiry_evpd_tpc()
408 scsi_u64to8b(0, rtfb_ptr->optimal_bytes); in ctl_inquiry_evpd_tpc()
409 scsi_u64to8b(UINT64_MAX, rtfb_ptr->optimal_bytes_to_token_per_segment); in ctl_inquiry_evpd_tpc()
411 rtfb_ptr->optimal_bytes_from_token_per_segment); in ctl_inquiry_evpd_tpc()
415 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
417 scsi_ulto2b(SVPD_TPC_SRT, srt_ptr->desc_type); in ctl_inquiry_evpd_tpc()
418 scsi_ulto2b(sizeof(*srt_ptr) - 4 + 2*sizeof(*srtd_ptr), srt_ptr->desc_length); in ctl_inquiry_evpd_tpc()
419 scsi_ulto2b(2*sizeof(*srtd_ptr), srt_ptr->rod_type_descriptors_length); in ctl_inquiry_evpd_tpc()
421 &srt_ptr->rod_type_descriptors; in ctl_inquiry_evpd_tpc()
422 scsi_ulto4b(ROD_TYPE_AUR, srtd_ptr->rod_type); in ctl_inquiry_evpd_tpc()
423 srtd_ptr->flags = SVPD_TPC_SRTD_TIN | SVPD_TPC_SRTD_TOUT; in ctl_inquiry_evpd_tpc()
424 scsi_ulto2b(0, srtd_ptr->preference_indicator); in ctl_inquiry_evpd_tpc()
426 scsi_ulto4b(ROD_TYPE_BLOCK_ZERO, srtd_ptr->rod_type); in ctl_inquiry_evpd_tpc()
427 srtd_ptr->flags = SVPD_TPC_SRTD_TIN; in ctl_inquiry_evpd_tpc()
428 scsi_ulto2b(0, srtd_ptr->preference_indicator); in ctl_inquiry_evpd_tpc()
432 (&d_ptr->parameters[0] + scsi_2btoul(d_ptr->desc_length)); in ctl_inquiry_evpd_tpc()
434 scsi_ulto2b(SVPD_TPC_GCO, gco_ptr->desc_type); in ctl_inquiry_evpd_tpc()
435 scsi_ulto2b(sizeof(*gco_ptr) - 4, gco_ptr->desc_length); in ctl_inquiry_evpd_tpc()
436 scsi_ulto4b(TPC_MAX_LISTS, gco_ptr->total_concurrent_copies); in ctl_inquiry_evpd_tpc()
437 scsi_ulto4b(TPC_MAX_LISTS, gco_ptr->maximum_identified_concurrent_copies); in ctl_inquiry_evpd_tpc()
438 scsi_ulto4b(TPC_MAX_SEG, gco_ptr->maximum_segment_length); in ctl_inquiry_evpd_tpc()
439 gco_ptr->data_segment_granularity = 0; in ctl_inquiry_evpd_tpc()
440 gco_ptr->inline_data_granularity = 0; in ctl_inquiry_evpd_tpc()
443 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_inquiry_evpd_tpc()
444 ctsio->be_move_done = ctl_config_move_done; in ctl_inquiry_evpd_tpc()
460 cdb = (struct scsi_receive_copy_operating_parameters *)ctsio->cdb; in ctl_receive_copy_operating_parameters()
465 alloc_len = scsi_4btoul(cdb->length); in ctl_receive_copy_operating_parameters()
467 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO); in ctl_receive_copy_operating_parameters()
468 ctsio->kern_sg_entries = 0; in ctl_receive_copy_operating_parameters()
469 ctsio->kern_rel_offset = 0; in ctl_receive_copy_operating_parameters()
470 ctsio->kern_data_len = min(total_len, alloc_len); in ctl_receive_copy_operating_parameters()
471 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_receive_copy_operating_parameters()
473 data = (struct scsi_receive_copy_operating_parameters_data *)ctsio->kern_data_ptr; in ctl_receive_copy_operating_parameters()
474 scsi_ulto4b(sizeof(*data) - 4 + 4, data->length); in ctl_receive_copy_operating_parameters()
475 data->snlid = RCOP_SNLID; in ctl_receive_copy_operating_parameters()
476 scsi_ulto2b(TPC_MAX_CSCDS, data->maximum_cscd_descriptor_count); in ctl_receive_copy_operating_parameters()
477 scsi_ulto2b(TPC_MAX_SEGS, data->maximum_segment_descriptor_count); in ctl_receive_copy_operating_parameters()
478 scsi_ulto4b(TPC_MAX_LIST, data->maximum_descriptor_list_length); in ctl_receive_copy_operating_parameters()
479 scsi_ulto4b(TPC_MAX_SEG, data->maximum_segment_length); in ctl_receive_copy_operating_parameters()
480 scsi_ulto4b(TPC_MAX_INLINE, data->maximum_inline_data_length); in ctl_receive_copy_operating_parameters()
481 scsi_ulto4b(0, data->held_data_limit); in ctl_receive_copy_operating_parameters()
482 scsi_ulto4b(0, data->maximum_stream_device_transfer_size); in ctl_receive_copy_operating_parameters()
483 scsi_ulto2b(TPC_MAX_LISTS, data->total_concurrent_copies); in ctl_receive_copy_operating_parameters()
484 data->maximum_concurrent_copies = TPC_MAX_LISTS; in ctl_receive_copy_operating_parameters()
485 data->data_segment_granularity = 0; in ctl_receive_copy_operating_parameters()
486 data->inline_data_granularity = 0; in ctl_receive_copy_operating_parameters()
487 data->held_data_granularity = 0; in ctl_receive_copy_operating_parameters()
488 data->implemented_descriptor_list_length = 4; in ctl_receive_copy_operating_parameters()
489 data->list_of_implemented_descriptor_type_codes[0] = EC_SEG_B2B; in ctl_receive_copy_operating_parameters()
490 data->list_of_implemented_descriptor_type_codes[1] = EC_SEG_VERIFY; in ctl_receive_copy_operating_parameters()
491 data->list_of_implemented_descriptor_type_codes[2] = EC_SEG_REGISTER_KEY; in ctl_receive_copy_operating_parameters()
492 data->list_of_implemented_descriptor_type_codes[3] = EC_CSCD_ID; in ctl_receive_copy_operating_parameters()
495 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_receive_copy_operating_parameters()
496 ctsio->be_move_done = ctl_config_move_done; in ctl_receive_copy_operating_parameters()
506 mtx_assert(&lun->lun_lock, MA_OWNED); in tpc_find_list()
507 TAILQ_FOREACH(list, &lun->tpc_lists, links) { in tpc_find_list()
508 if ((list->flags & EC_LIST_ID_USAGE_MASK) != in tpc_find_list()
509 EC_LIST_ID_USAGE_NONE && list->list_id == list_id && in tpc_find_list()
510 list->init_idx == init_idx) in tpc_find_list()
530 cdb = (struct scsi_receive_copy_status_lid1 *)ctsio->cdb; in ctl_receive_copy_status_lid1()
533 list_id = cdb->list_identifier; in ctl_receive_copy_status_lid1()
534 mtx_lock(&lun->lun_lock); in ctl_receive_copy_status_lid1()
536 ctl_get_initindex(&ctsio->io_hdr.nexus)); in ctl_receive_copy_status_lid1()
538 mtx_unlock(&lun->lun_lock); in ctl_receive_copy_status_lid1()
546 if (list->completed) { in ctl_receive_copy_status_lid1()
547 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_receive_copy_status_lid1()
550 mtx_unlock(&lun->lun_lock); in ctl_receive_copy_status_lid1()
553 alloc_len = scsi_4btoul(cdb->length); in ctl_receive_copy_status_lid1()
555 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO); in ctl_receive_copy_status_lid1()
556 ctsio->kern_sg_entries = 0; in ctl_receive_copy_status_lid1()
557 ctsio->kern_rel_offset = 0; in ctl_receive_copy_status_lid1()
558 ctsio->kern_data_len = min(total_len, alloc_len); in ctl_receive_copy_status_lid1()
559 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_receive_copy_status_lid1()
561 data = (struct scsi_receive_copy_status_lid1_data *)ctsio->kern_data_ptr; in ctl_receive_copy_status_lid1()
562 scsi_ulto4b(sizeof(*data) - 4, data->available_data); in ctl_receive_copy_status_lid1()
565 data->copy_command_status = RCS_CCS_ERROR; in ctl_receive_copy_status_lid1()
567 data->copy_command_status = RCS_CCS_COMPLETED; in ctl_receive_copy_status_lid1()
569 data->copy_command_status = RCS_CCS_INPROG; in ctl_receive_copy_status_lid1()
570 scsi_ulto2b(list_copy.curseg, data->segments_processed); in ctl_receive_copy_status_lid1()
572 data->transfer_count_units = RCS_TC_BYTES; in ctl_receive_copy_status_lid1()
573 scsi_ulto4b(list_copy.curbytes, data->transfer_count); in ctl_receive_copy_status_lid1()
575 data->transfer_count_units = RCS_TC_MBYTES; in ctl_receive_copy_status_lid1()
576 scsi_ulto4b(list_copy.curbytes >> 20, data->transfer_count); in ctl_receive_copy_status_lid1()
580 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_receive_copy_status_lid1()
581 ctsio->be_move_done = ctl_config_move_done; in ctl_receive_copy_status_lid1()
600 cdb = (struct scsi_receive_copy_failure_details *)ctsio->cdb; in ctl_receive_copy_failure_details()
603 list_id = cdb->list_identifier; in ctl_receive_copy_failure_details()
604 mtx_lock(&lun->lun_lock); in ctl_receive_copy_failure_details()
606 ctl_get_initindex(&ctsio->io_hdr.nexus)); in ctl_receive_copy_failure_details()
607 if (list == NULL || !list->completed) { in ctl_receive_copy_failure_details()
608 mtx_unlock(&lun->lun_lock); in ctl_receive_copy_failure_details()
616 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_receive_copy_failure_details()
618 mtx_unlock(&lun->lun_lock); in ctl_receive_copy_failure_details()
621 alloc_len = scsi_4btoul(cdb->length); in ctl_receive_copy_failure_details()
623 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO); in ctl_receive_copy_failure_details()
624 ctsio->kern_sg_entries = 0; in ctl_receive_copy_failure_details()
625 ctsio->kern_rel_offset = 0; in ctl_receive_copy_failure_details()
626 ctsio->kern_data_len = min(total_len, alloc_len); in ctl_receive_copy_failure_details()
627 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_receive_copy_failure_details()
629 data = (struct scsi_receive_copy_failure_details_data *)ctsio->kern_data_ptr; in ctl_receive_copy_failure_details()
631 scsi_ulto4b(sizeof(*data) - 4 + list_copy.sense_len, in ctl_receive_copy_failure_details()
632 data->available_data); in ctl_receive_copy_failure_details()
633 data->copy_command_status = RCS_CCS_ERROR; in ctl_receive_copy_failure_details()
635 scsi_ulto4b(0, data->available_data); in ctl_receive_copy_failure_details()
636 scsi_ulto2b(list_copy.sense_len, data->sense_data_length); in ctl_receive_copy_failure_details()
637 memcpy(data->sense_data, &list_copy.sense_data, list_copy.sense_len); in ctl_receive_copy_failure_details()
640 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_receive_copy_failure_details()
641 ctsio->be_move_done = ctl_config_move_done; in ctl_receive_copy_failure_details()
660 cdb = (struct scsi_receive_copy_status_lid4 *)ctsio->cdb; in ctl_receive_copy_status_lid4()
663 list_id = scsi_4btoul(cdb->list_identifier); in ctl_receive_copy_status_lid4()
664 mtx_lock(&lun->lun_lock); in ctl_receive_copy_status_lid4()
666 ctl_get_initindex(&ctsio->io_hdr.nexus)); in ctl_receive_copy_status_lid4()
668 mtx_unlock(&lun->lun_lock); in ctl_receive_copy_status_lid4()
676 if (list->completed) { in ctl_receive_copy_status_lid4()
677 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_receive_copy_status_lid4()
680 mtx_unlock(&lun->lun_lock); in ctl_receive_copy_status_lid4()
683 alloc_len = scsi_4btoul(cdb->length); in ctl_receive_copy_status_lid4()
685 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO); in ctl_receive_copy_status_lid4()
686 ctsio->kern_sg_entries = 0; in ctl_receive_copy_status_lid4()
687 ctsio->kern_rel_offset = 0; in ctl_receive_copy_status_lid4()
688 ctsio->kern_data_len = min(total_len, alloc_len); in ctl_receive_copy_status_lid4()
689 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_receive_copy_status_lid4()
691 data = (struct scsi_receive_copy_status_lid4_data *)ctsio->kern_data_ptr; in ctl_receive_copy_status_lid4()
692 scsi_ulto4b(sizeof(*data) - 4 + list_copy.sense_len, in ctl_receive_copy_status_lid4()
693 data->available_data); in ctl_receive_copy_status_lid4()
694 data->response_to_service_action = list_copy.service_action; in ctl_receive_copy_status_lid4()
697 data->copy_command_status = RCS_CCS_ERROR; in ctl_receive_copy_status_lid4()
699 data->copy_command_status = RCS_CCS_ABORTED; in ctl_receive_copy_status_lid4()
701 data->copy_command_status = RCS_CCS_COMPLETED; in ctl_receive_copy_status_lid4()
703 data->copy_command_status = RCS_CCS_INPROG_FG; in ctl_receive_copy_status_lid4()
704 scsi_ulto2b(list_copy.curops, data->operation_counter); in ctl_receive_copy_status_lid4()
705 scsi_ulto4b(UINT32_MAX, data->estimated_status_update_delay); in ctl_receive_copy_status_lid4()
706 data->transfer_count_units = RCS_TC_BYTES; in ctl_receive_copy_status_lid4()
707 scsi_u64to8b(list_copy.curbytes, data->transfer_count); in ctl_receive_copy_status_lid4()
708 scsi_ulto2b(list_copy.curseg, data->segments_processed); in ctl_receive_copy_status_lid4()
709 data->length_of_the_sense_data_field = list_copy.sense_len; in ctl_receive_copy_status_lid4()
710 data->sense_data_length = list_copy.sense_len; in ctl_receive_copy_status_lid4()
711 memcpy(data->sense_data, &list_copy.sense_data, list_copy.sense_len); in ctl_receive_copy_status_lid4()
714 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_receive_copy_status_lid4()
715 ctsio->be_move_done = ctl_config_move_done; in ctl_receive_copy_status_lid4()
731 cdb = (struct scsi_copy_operation_abort *)ctsio->cdb; in ctl_copy_operation_abort()
734 list_id = scsi_4btoul(cdb->list_identifier); in ctl_copy_operation_abort()
735 mtx_lock(&lun->lun_lock); in ctl_copy_operation_abort()
737 ctl_get_initindex(&ctsio->io_hdr.nexus)); in ctl_copy_operation_abort()
739 mtx_unlock(&lun->lun_lock); in ctl_copy_operation_abort()
746 list->abort = 1; in ctl_copy_operation_abort()
747 mtx_unlock(&lun->lun_lock); in ctl_copy_operation_abort()
761 *ss = list->lun->be_lun->blocksize; in tpc_resolve()
763 *pb = list->lun->be_lun->blocksize << in tpc_resolve()
764 list->lun->be_lun->pblockexp; in tpc_resolve()
766 *pbo = list->lun->be_lun->blocksize * in tpc_resolve()
767 list->lun->be_lun->pblockoff; in tpc_resolve()
768 return (list->lun->lun); in tpc_resolve()
770 if (idx >= list->ncscd) in tpc_resolve()
772 return (tpcl_resolve(list->lun->ctl_softc, in tpc_resolve()
773 list->init_port, &list->cscd[idx], ss, pb, pbo)); in tpc_resolve()
784 scsi_ulto4b(list->curseg, csi); in tpc_set_io_error_sense()
785 if (list->fwd_cscd <= 0x07ff) { in tpc_set_io_error_sense()
787 scsi_ulto2b((uint8_t *)&list->cscd[list->fwd_cscd] - in tpc_set_io_error_sense()
788 list->params, &sks[1]); in tpc_set_io_error_sense()
791 if (list->fwd_scsi_status) { in tpc_set_io_error_sense()
793 fbuf[2] = list->fwd_target; in tpc_set_io_error_sense()
794 flen = list->fwd_sense_len; in tpc_set_io_error_sense()
800 fbuf[3] = list->fwd_scsi_status; in tpc_set_io_error_sense()
801 bcopy(&list->fwd_sense_data, &fbuf[4], flen); in tpc_set_io_error_sense()
805 ctl_set_sense(list->ctsio, /*current_error*/ 1, in tpc_set_io_error_sense()
824 uint32_t srcblock, dstblock, pb, pbo, adj; in tpc_process_b2b() local
828 scsi_ulto4b(list->curseg, csi); in tpc_process_b2b()
829 if (list->stage == 1) { in tpc_process_b2b()
830 while ((tior = TAILQ_FIRST(&list->allio)) != NULL) { in tpc_process_b2b()
831 TAILQ_REMOVE(&list->allio, tior, links); in tpc_process_b2b()
832 ctl_free_io(tior->io); in tpc_process_b2b()
833 free(tior->buf, M_CTL); in tpc_process_b2b()
836 if (list->abort) { in tpc_process_b2b()
837 ctl_set_task_aborted(list->ctsio); in tpc_process_b2b()
839 } else if (list->error) { in tpc_process_b2b()
843 list->cursectors += list->segsectors; in tpc_process_b2b()
844 list->curbytes += list->segbytes; in tpc_process_b2b()
848 TAILQ_INIT(&list->allio); in tpc_process_b2b()
849 seg = (struct scsi_ec_segment_b2b *)list->seg[list->curseg]; in tpc_process_b2b()
850 scscd = scsi_2btoul(seg->src_cscd); in tpc_process_b2b()
851 dcscd = scsi_2btoul(seg->dst_cscd); in tpc_process_b2b()
855 ctl_set_sense(list->ctsio, /*current_error*/ 1, in tpc_process_b2b()
863 pbo = pb - pbo; in tpc_process_b2b()
864 sdstp = &list->cscd[scscd].dtsp; in tpc_process_b2b()
865 if (scsi_3btoul(sdstp->block_length) != 0) in tpc_process_b2b()
866 srcblock = scsi_3btoul(sdstp->block_length); in tpc_process_b2b()
867 ddstp = &list->cscd[dcscd].dtsp; in tpc_process_b2b()
868 if (scsi_3btoul(ddstp->block_length) != 0) in tpc_process_b2b()
869 dstblock = scsi_3btoul(ddstp->block_length); in tpc_process_b2b()
870 numlba = scsi_2btoul(seg->number_of_blocks); in tpc_process_b2b()
871 if (seg->flags & EC_SEG_DC) in tpc_process_b2b()
875 srclba = scsi_8btou64(seg->src_lba); in tpc_process_b2b()
876 dstlba = scsi_8btou64(seg->dst_lba); in tpc_process_b2b()
879 // (uintmax_t)numbytes, sl, scsi_8btou64(seg->src_lba), in tpc_process_b2b()
880 // dl, scsi_8btou64(seg->dst_lba)); in tpc_process_b2b()
886 ctl_set_sense(list->ctsio, /*current_error*/ 1, in tpc_process_b2b()
894 list->segbytes = numbytes; in tpc_process_b2b()
895 list->segsectors = numbytes / dstblock; in tpc_process_b2b()
898 list->tbdio = 0; in tpc_process_b2b()
900 roundbytes = numbytes - donebytes; in tpc_process_b2b()
903 roundbytes -= roundbytes % dstblock; in tpc_process_b2b()
905 adj = (dstlba * dstblock + roundbytes - pbo) % pb; in tpc_process_b2b()
906 if (roundbytes > adj) in tpc_process_b2b()
907 roundbytes -= adj; in tpc_process_b2b()
912 TAILQ_INIT(&tior->run); in tpc_process_b2b()
913 tior->buf = malloc(roundbytes, M_CTL, M_WAITOK); in tpc_process_b2b()
914 tior->list = list; in tpc_process_b2b()
915 TAILQ_INSERT_TAIL(&list->allio, tior, links); in tpc_process_b2b()
916 tior->io = tpcl_alloc_io(); in tpc_process_b2b()
917 ctl_scsi_read_write(tior->io, in tpc_process_b2b()
918 /*data_ptr*/ tior->buf, in tpc_process_b2b()
927 tior->io->io_hdr.retries = 3; in tpc_process_b2b()
928 tior->target = SSD_FORWARDED_SDS_EXSRC; in tpc_process_b2b()
929 tior->cscd = scscd; in tpc_process_b2b()
930 tior->lun = sl; in tpc_process_b2b()
931 tior->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tior; in tpc_process_b2b()
934 TAILQ_INIT(&tiow->run); in tpc_process_b2b()
935 tiow->list = list; in tpc_process_b2b()
936 TAILQ_INSERT_TAIL(&list->allio, tiow, links); in tpc_process_b2b()
937 tiow->io = tpcl_alloc_io(); in tpc_process_b2b()
938 ctl_scsi_read_write(tiow->io, in tpc_process_b2b()
939 /*data_ptr*/ tior->buf, in tpc_process_b2b()
948 tiow->io->io_hdr.retries = 3; in tpc_process_b2b()
949 tiow->target = SSD_FORWARDED_SDS_EXDST; in tpc_process_b2b()
950 tiow->cscd = dcscd; in tpc_process_b2b()
951 tiow->lun = dl; in tpc_process_b2b()
952 tiow->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tiow; in tpc_process_b2b()
954 TAILQ_INSERT_TAIL(&tior->run, tiow, rlinks); in tpc_process_b2b()
956 list->tbdio++; in tpc_process_b2b()
964 if (tpcl_queue(tior->io, tior->lun) != CTL_RETVAL_COMPLETE) in tpc_process_b2b()
968 list->stage++; in tpc_process_b2b()
981 scsi_ulto4b(list->curseg, csi); in tpc_process_verify()
982 if (list->stage == 1) { in tpc_process_verify()
983 while ((tio = TAILQ_FIRST(&list->allio)) != NULL) { in tpc_process_verify()
984 TAILQ_REMOVE(&list->allio, tio, links); in tpc_process_verify()
985 ctl_free_io(tio->io); in tpc_process_verify()
988 if (list->abort) { in tpc_process_verify()
989 ctl_set_task_aborted(list->ctsio); in tpc_process_verify()
991 } else if (list->error) { in tpc_process_verify()
998 TAILQ_INIT(&list->allio); in tpc_process_verify()
999 seg = (struct scsi_ec_segment_verify *)list->seg[list->curseg]; in tpc_process_verify()
1000 cscd = scsi_2btoul(seg->src_cscd); in tpc_process_verify()
1003 ctl_set_sense(list->ctsio, /*current_error*/ 1, in tpc_process_verify()
1013 if ((seg->tur & 0x01) == 0) in tpc_process_verify()
1016 list->tbdio = 1; in tpc_process_verify()
1018 TAILQ_INIT(&tio->run); in tpc_process_verify()
1019 tio->list = list; in tpc_process_verify()
1020 TAILQ_INSERT_TAIL(&list->allio, tio, links); in tpc_process_verify()
1021 tio->io = tpcl_alloc_io(); in tpc_process_verify()
1022 ctl_scsi_tur(tio->io, /*tag_type*/ CTL_TAG_SIMPLE, /*control*/ 0); in tpc_process_verify()
1023 tio->io->io_hdr.retries = 3; in tpc_process_verify()
1024 tio->target = SSD_FORWARDED_SDS_EXSRC; in tpc_process_verify()
1025 tio->cscd = cscd; in tpc_process_verify()
1026 tio->lun = sl; in tpc_process_verify()
1027 tio->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tio; in tpc_process_verify()
1028 list->stage++; in tpc_process_verify()
1029 if (tpcl_queue(tio->io, tio->lun) != CTL_RETVAL_COMPLETE) in tpc_process_verify()
1044 scsi_ulto4b(list->curseg, csi); in tpc_process_register_key()
1045 if (list->stage == 1) { in tpc_process_register_key()
1046 while ((tio = TAILQ_FIRST(&list->allio)) != NULL) { in tpc_process_register_key()
1047 TAILQ_REMOVE(&list->allio, tio, links); in tpc_process_register_key()
1048 ctl_free_io(tio->io); in tpc_process_register_key()
1049 free(tio->buf, M_CTL); in tpc_process_register_key()
1052 if (list->abort) { in tpc_process_register_key()
1053 ctl_set_task_aborted(list->ctsio); in tpc_process_register_key()
1055 } else if (list->error) { in tpc_process_register_key()
1062 TAILQ_INIT(&list->allio); in tpc_process_register_key()
1063 seg = (struct scsi_ec_segment_register_key *)list->seg[list->curseg]; in tpc_process_register_key()
1064 cscd = scsi_2btoul(seg->dst_cscd); in tpc_process_register_key()
1067 ctl_set_sense(list->ctsio, /*current_error*/ 1, in tpc_process_register_key()
1077 list->tbdio = 1; in tpc_process_register_key()
1079 TAILQ_INIT(&tio->run); in tpc_process_register_key()
1080 tio->list = list; in tpc_process_register_key()
1081 TAILQ_INSERT_TAIL(&list->allio, tio, links); in tpc_process_register_key()
1082 tio->io = tpcl_alloc_io(); in tpc_process_register_key()
1084 tio->buf = malloc(datalen, M_CTL, M_WAITOK); in tpc_process_register_key()
1085 ctl_scsi_persistent_res_out(tio->io, in tpc_process_register_key()
1086 tio->buf, datalen, SPRO_REGISTER, -1, in tpc_process_register_key()
1087 scsi_8btou64(seg->res_key), scsi_8btou64(seg->sa_res_key), in tpc_process_register_key()
1089 tio->io->io_hdr.retries = 3; in tpc_process_register_key()
1090 tio->target = SSD_FORWARDED_SDS_EXDST; in tpc_process_register_key()
1091 tio->cscd = cscd; in tpc_process_register_key()
1092 tio->lun = dl; in tpc_process_register_key()
1093 tio->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tio; in tpc_process_register_key()
1094 list->stage++; in tpc_process_register_key()
1095 if (tpcl_queue(tio->io, tio->lun) != CTL_RETVAL_COMPLETE) in tpc_process_register_key()
1123 *lba = MAX(b1, maxlba + 1); in tpc_check_ranges_l()
1124 return (-1); in tpc_check_ranges_l()
1137 for (i = 0; i < nrange - 1; i++) { in tpc_check_ranges_x()
1144 return (-1); in tpc_check_ranges_x()
1160 if (skip - off < scsi_4btoul(range[r].length)) { in tpc_skip_ranges()
1162 *soffset = skip - off; in tpc_skip_ranges()
1168 return (-1); in tpc_skip_ranges()
1179 uint32_t srcblock, dstblock, pb, pbo, adj; in tpc_process_wut() local
1181 if (list->stage > 0) { in tpc_process_wut()
1183 while ((tio = TAILQ_FIRST(&list->allio)) != NULL) { in tpc_process_wut()
1184 TAILQ_REMOVE(&list->allio, tio, links); in tpc_process_wut()
1185 ctl_free_io(tio->io); in tpc_process_wut()
1186 free(tio->buf, M_CTL); in tpc_process_wut()
1189 if (list->abort) { in tpc_process_wut()
1190 ctl_set_task_aborted(list->ctsio); in tpc_process_wut()
1192 } else if (list->error) { in tpc_process_wut()
1193 if (list->fwd_scsi_status) { in tpc_process_wut()
1194 list->ctsio->io_hdr.status = in tpc_process_wut()
1196 list->ctsio->scsi_status = list->fwd_scsi_status; in tpc_process_wut()
1197 list->ctsio->sense_data = list->fwd_sense_data; in tpc_process_wut()
1198 list->ctsio->sense_len = list->fwd_sense_len; in tpc_process_wut()
1200 ctl_set_invalid_field(list->ctsio, in tpc_process_wut()
1206 list->cursectors += list->segsectors; in tpc_process_wut()
1207 list->curbytes += list->segbytes; in tpc_process_wut()
1211 if (tpc_skip_ranges(list->range, list->nrange, list->cursectors, in tpc_process_wut()
1214 dstblock = list->lun->be_lun->blocksize; in tpc_process_wut()
1215 pb = dstblock << list->lun->be_lun->pblockexp; in tpc_process_wut()
1216 if (list->lun->be_lun->pblockoff > 0) in tpc_process_wut()
1217 pbo = pb - dstblock * list->lun->be_lun->pblockoff; in tpc_process_wut()
1222 srcblock = list->token->blocksize; in tpc_process_wut()
1223 if (tpc_skip_ranges(list->token->range, list->token->nrange, in tpc_process_wut()
1224 list->offset_into_rod + list->cursectors * dstblock / srcblock, in tpc_process_wut()
1226 ctl_set_invalid_field(list->ctsio, /*sks_valid*/ 0, in tpc_process_wut()
1231 srclba = scsi_8btou64(list->token->range[srange].lba) + soffset; in tpc_process_wut()
1232 dstlba = scsi_8btou64(list->range[drange].lba) + doffset; in tpc_process_wut()
1234 (scsi_4btoul(list->token->range[srange].length) - soffset); in tpc_process_wut()
1236 (scsi_4btoul(list->range[drange].length) - doffset)); in tpc_process_wut()
1239 numbytes -= numbytes % dstblock; in tpc_process_wut()
1241 adj = (dstlba * dstblock + numbytes - pbo) % pb; in tpc_process_wut()
1242 if (numbytes > adj) in tpc_process_wut()
1243 numbytes -= adj; in tpc_process_wut()
1248 ctl_set_invalid_field(list->ctsio, /*sks_valid*/ 0, in tpc_process_wut()
1253 list->segbytes = numbytes; in tpc_process_wut()
1254 list->segsectors = numbytes / dstblock; in tpc_process_wut()
1255 //printf("Copy chunk of %ju sectors from %ju to %ju\n", list->segsectors, in tpc_process_wut()
1259 list->tbdio = 0; in tpc_process_wut()
1260 TAILQ_INIT(&list->allio); in tpc_process_wut()
1262 roundbytes = numbytes - donebytes; in tpc_process_wut()
1265 roundbytes -= roundbytes % dstblock; in tpc_process_wut()
1267 adj = (dstlba * dstblock + roundbytes - pbo) % pb; in tpc_process_wut()
1268 if (roundbytes > adj) in tpc_process_wut()
1269 roundbytes -= adj; in tpc_process_wut()
1274 TAILQ_INIT(&tior->run); in tpc_process_wut()
1275 tior->buf = malloc(roundbytes, M_CTL, M_WAITOK); in tpc_process_wut()
1276 tior->list = list; in tpc_process_wut()
1277 TAILQ_INSERT_TAIL(&list->allio, tior, links); in tpc_process_wut()
1278 tior->io = tpcl_alloc_io(); in tpc_process_wut()
1279 ctl_scsi_read_write(tior->io, in tpc_process_wut()
1280 /*data_ptr*/ tior->buf, in tpc_process_wut()
1289 tior->io->io_hdr.retries = 3; in tpc_process_wut()
1290 tior->lun = list->token->lun; in tpc_process_wut()
1291 tior->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tior; in tpc_process_wut()
1294 TAILQ_INIT(&tiow->run); in tpc_process_wut()
1295 tiow->list = list; in tpc_process_wut()
1296 TAILQ_INSERT_TAIL(&list->allio, tiow, links); in tpc_process_wut()
1297 tiow->io = tpcl_alloc_io(); in tpc_process_wut()
1298 ctl_scsi_read_write(tiow->io, in tpc_process_wut()
1299 /*data_ptr*/ tior->buf, in tpc_process_wut()
1308 tiow->io->io_hdr.retries = 3; in tpc_process_wut()
1309 tiow->lun = list->lun->lun; in tpc_process_wut()
1310 tiow->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tiow; in tpc_process_wut()
1312 TAILQ_INSERT_TAIL(&tior->run, tiow, rlinks); in tpc_process_wut()
1314 list->tbdio++; in tpc_process_wut()
1322 if (tpcl_queue(tior->io, tior->lun) != CTL_RETVAL_COMPLETE) in tpc_process_wut()
1326 list->stage++; in tpc_process_wut()
1338 if (list->stage > 0) { in tpc_process_zero_wut()
1341 while ((tio = TAILQ_FIRST(&list->allio)) != NULL) { in tpc_process_zero_wut()
1342 TAILQ_REMOVE(&list->allio, tio, links); in tpc_process_zero_wut()
1343 ctl_free_io(tio->io); in tpc_process_zero_wut()
1346 if (list->abort) { in tpc_process_zero_wut()
1347 ctl_set_task_aborted(list->ctsio); in tpc_process_zero_wut()
1349 } else if (list->error) { in tpc_process_zero_wut()
1350 if (list->fwd_scsi_status) { in tpc_process_zero_wut()
1351 list->ctsio->io_hdr.status = in tpc_process_zero_wut()
1353 list->ctsio->scsi_status = list->fwd_scsi_status; in tpc_process_zero_wut()
1354 list->ctsio->sense_data = list->fwd_sense_data; in tpc_process_zero_wut()
1355 list->ctsio->sense_len = list->fwd_sense_len; in tpc_process_zero_wut()
1357 ctl_set_invalid_field(list->ctsio, in tpc_process_zero_wut()
1363 list->cursectors += list->segsectors; in tpc_process_zero_wut()
1364 list->curbytes += list->segbytes; in tpc_process_zero_wut()
1368 dstblock = list->lun->be_lun->blocksize; in tpc_process_zero_wut()
1371 list->tbdio = 1; in tpc_process_zero_wut()
1372 TAILQ_INIT(&list->allio); in tpc_process_zero_wut()
1373 list->segsectors = 0; in tpc_process_zero_wut()
1374 for (r = 0; r < list->nrange; r++) { in tpc_process_zero_wut()
1375 len = scsi_4btoul(list->range[r].length); in tpc_process_zero_wut()
1380 TAILQ_INIT(&tiow->run); in tpc_process_zero_wut()
1381 tiow->list = list; in tpc_process_zero_wut()
1382 TAILQ_INSERT_TAIL(&list->allio, tiow, links); in tpc_process_zero_wut()
1383 tiow->io = tpcl_alloc_io(); in tpc_process_zero_wut()
1384 ctl_scsi_write_same(tiow->io, in tpc_process_zero_wut()
1388 /*lba*/ scsi_8btou64(list->range[r].lba), in tpc_process_zero_wut()
1392 tiow->io->io_hdr.retries = 3; in tpc_process_zero_wut()
1393 tiow->lun = list->lun->lun; in tpc_process_zero_wut()
1394 tiow->io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr = tiow; in tpc_process_zero_wut()
1397 prun = &tiow->run; in tpc_process_zero_wut()
1398 list->segsectors += len; in tpc_process_zero_wut()
1400 list->segbytes = list->segsectors * dstblock; in tpc_process_zero_wut()
1407 if (tpcl_queue(tiow->io, tiow->lun) != CTL_RETVAL_COMPLETE) in tpc_process_zero_wut()
1411 list->stage++; in tpc_process_zero_wut()
1418 struct ctl_lun *lun = list->lun; in tpc_process()
1419 struct ctl_softc *softc = lun->ctl_softc; in tpc_process()
1421 struct ctl_scsiio *ctsio = list->ctsio; in tpc_process()
1425 if (list->service_action == EC_WUT) { in tpc_process()
1426 if (list->token != NULL) in tpc_process()
1433 list->error = 1; in tpc_process()
1437 //printf("ZZZ %d cscd, %d segs\n", list->ncscd, list->nseg); in tpc_process()
1438 while (list->curseg < list->nseg) { in tpc_process()
1439 seg = list->seg[list->curseg]; in tpc_process()
1440 switch (seg->type_code) { in tpc_process()
1451 scsi_ulto4b(list->curseg, csi); in tpc_process()
1462 list->error = 1; in tpc_process()
1465 list->curseg++; in tpc_process()
1466 list->stage = 0; in tpc_process()
1474 free(list->params, M_CTL); in tpc_process()
1475 list->params = NULL; in tpc_process()
1476 if (list->token) { in tpc_process()
1477 mtx_lock(&softc->tpc_lock); in tpc_process()
1478 if (--list->token->active == 0) in tpc_process()
1479 list->token->last_active = time_uptime; in tpc_process()
1480 mtx_unlock(&softc->tpc_lock); in tpc_process()
1481 list->token = NULL; in tpc_process()
1483 mtx_lock(&lun->lun_lock); in tpc_process()
1484 if ((list->flags & EC_LIST_ID_USAGE_MASK) == EC_LIST_ID_USAGE_NONE) { in tpc_process()
1485 TAILQ_REMOVE(&lun->tpc_lists, list, links); in tpc_process()
1488 list->completed = 1; in tpc_process()
1489 list->last_active = time_uptime; in tpc_process()
1490 list->sense_data = ctsio->sense_data; in tpc_process()
1491 list->sense_len = ctsio->sense_len; in tpc_process()
1492 list->scsi_status = ctsio->scsi_status; in tpc_process()
1494 mtx_unlock(&lun->lun_lock); in tpc_process()
1521 scsi_extract_sense_len(&io->scsiio.sense_data, in tpc_checkcond_parse()
1522 io->scsiio.sense_len, in tpc_checkcond_parse()
1573 switch (io->io_hdr.io_type) { in tpc_error_parse()
1575 switch (io->io_hdr.status & CTL_STATUS_MASK) { in tpc_error_parse()
1577 switch (io->scsiio.scsi_status) { in tpc_error_parse()
1593 io->io_hdr.io_type); in tpc_error_parse()
1610 tio = io->io_hdr.ctl_private[CTL_PRIV_FRONTEND].ptr; in tpc_done()
1611 if (((io->io_hdr.status & CTL_STATUS_MASK) != CTL_SUCCESS) in tpc_done()
1612 && (io->io_hdr.retries > 0)) { in tpc_done()
1623 io->io_hdr.retries--; in tpc_done()
1624 old_status = io->io_hdr.status; in tpc_done()
1625 io->io_hdr.status = CTL_STATUS_NONE; in tpc_done()
1626 io->io_hdr.flags &= ~CTL_FLAG_ABORT; in tpc_done()
1627 io->io_hdr.flags &= ~CTL_FLAG_SENT_2OTHER_SC; in tpc_done()
1628 if (tpcl_queue(io, tio->lun) != CTL_RETVAL_COMPLETE) { in tpc_done()
1631 io->io_hdr.status = old_status; in tpc_done()
1637 if ((io->io_hdr.status & CTL_STATUS_MASK) != CTL_SUCCESS) { in tpc_done()
1638 tio->list->error = 1; in tpc_done()
1639 if (io->io_hdr.io_type == CTL_IO_SCSI && in tpc_done()
1640 (io->io_hdr.status & CTL_STATUS_MASK) == CTL_SCSI_ERROR) { in tpc_done()
1641 tio->list->fwd_scsi_status = io->scsiio.scsi_status; in tpc_done()
1642 tio->list->fwd_sense_data = io->scsiio.sense_data; in tpc_done()
1643 tio->list->fwd_sense_len = io->scsiio.sense_len; in tpc_done()
1644 tio->list->fwd_target = tio->target; in tpc_done()
1645 tio->list->fwd_cscd = tio->cscd; in tpc_done()
1648 atomic_add_int(&tio->list->curops, 1); in tpc_done()
1649 if (!tio->list->error && !tio->list->abort) { in tpc_done()
1650 while ((tior = TAILQ_FIRST(&tio->run)) != NULL) { in tpc_done()
1651 TAILQ_REMOVE(&tio->run, tior, rlinks); in tpc_done()
1652 atomic_add_int(&tio->list->tbdio, 1); in tpc_done()
1653 if (tpcl_queue(tior->io, tior->lun) != CTL_RETVAL_COMPLETE) in tpc_done()
1657 if (atomic_fetchadd_int(&tio->list->tbdio, -1) == 1) in tpc_done()
1658 tpc_process(tio->list); in tpc_done()
1676 cdb = (struct scsi_extended_copy *)ctsio->cdb; in ctl_extended_copy_lid1()
1677 len = scsi_4btoul(cdb->length); in ctl_extended_copy_lid1()
1695 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) { in ctl_extended_copy_lid1()
1696 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK); in ctl_extended_copy_lid1()
1697 ctsio->kern_data_len = len; in ctl_extended_copy_lid1()
1698 ctsio->kern_total_len = len; in ctl_extended_copy_lid1()
1699 ctsio->kern_rel_offset = 0; in ctl_extended_copy_lid1()
1700 ctsio->kern_sg_entries = 0; in ctl_extended_copy_lid1()
1701 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_extended_copy_lid1()
1702 ctsio->be_move_done = ctl_config_move_done; in ctl_extended_copy_lid1()
1708 data = (struct scsi_extended_copy_lid1_data *)ctsio->kern_data_ptr; in ctl_extended_copy_lid1()
1709 lencscd = scsi_2btoul(data->cscd_list_length); in ctl_extended_copy_lid1()
1710 lenseg = scsi_4btoul(data->segment_list_length); in ctl_extended_copy_lid1()
1711 leninl = scsi_4btoul(data->inline_data_length); in ctl_extended_copy_lid1()
1733 list->service_action = cdb->service_action; in ctl_extended_copy_lid1()
1734 value = dnvlist_get_string(lun->be_lun->options, "insecure_tpc", NULL); in ctl_extended_copy_lid1()
1736 list->init_port = -1; in ctl_extended_copy_lid1()
1738 list->init_port = ctsio->io_hdr.nexus.targ_port; in ctl_extended_copy_lid1()
1739 list->init_idx = ctl_get_initindex(&ctsio->io_hdr.nexus); in ctl_extended_copy_lid1()
1740 list->list_id = data->list_identifier; in ctl_extended_copy_lid1()
1741 list->flags = data->flags; in ctl_extended_copy_lid1()
1742 list->params = ctsio->kern_data_ptr; in ctl_extended_copy_lid1()
1743 list->cscd = (struct scsi_ec_cscd *)&data->data[0]; in ctl_extended_copy_lid1()
1744 ptr = &data->data[0]; in ctl_extended_copy_lid1()
1747 if (cscd->type_code != EC_CSCD_ID) { in ctl_extended_copy_lid1()
1755 ptr = &data->data[lencscd]; in ctl_extended_copy_lid1()
1765 if (seg->type_code != EC_SEG_B2B && in ctl_extended_copy_lid1()
1766 seg->type_code != EC_SEG_VERIFY && in ctl_extended_copy_lid1()
1767 seg->type_code != EC_SEG_REGISTER_KEY) { in ctl_extended_copy_lid1()
1774 list->seg[nseg] = seg; in ctl_extended_copy_lid1()
1776 scsi_2btoul(seg->descr_length); in ctl_extended_copy_lid1()
1778 list->inl = &data->data[lencscd + lenseg]; in ctl_extended_copy_lid1()
1779 list->ncscd = lencscd / sizeof(struct scsi_ec_cscd); in ctl_extended_copy_lid1()
1780 list->nseg = nseg; in ctl_extended_copy_lid1()
1781 list->leninl = leninl; in ctl_extended_copy_lid1()
1782 list->ctsio = ctsio; in ctl_extended_copy_lid1()
1783 list->lun = lun; in ctl_extended_copy_lid1()
1784 mtx_lock(&lun->lun_lock); in ctl_extended_copy_lid1()
1785 if ((list->flags & EC_LIST_ID_USAGE_MASK) != EC_LIST_ID_USAGE_NONE) { in ctl_extended_copy_lid1()
1786 tlist = tpc_find_list(lun, list->list_id, list->init_idx); in ctl_extended_copy_lid1()
1787 if (tlist != NULL && !tlist->completed) { in ctl_extended_copy_lid1()
1788 mtx_unlock(&lun->lun_lock); in ctl_extended_copy_lid1()
1796 TAILQ_REMOVE(&lun->tpc_lists, tlist, links); in ctl_extended_copy_lid1()
1800 TAILQ_INSERT_TAIL(&lun->tpc_lists, list, links); in ctl_extended_copy_lid1()
1801 mtx_unlock(&lun->lun_lock); in ctl_extended_copy_lid1()
1807 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) { in ctl_extended_copy_lid1()
1808 free(ctsio->kern_data_ptr, M_CTL); in ctl_extended_copy_lid1()
1809 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED; in ctl_extended_copy_lid1()
1830 cdb = (struct scsi_extended_copy *)ctsio->cdb; in ctl_extended_copy_lid4()
1831 len = scsi_4btoul(cdb->length); in ctl_extended_copy_lid4()
1849 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) { in ctl_extended_copy_lid4()
1850 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK); in ctl_extended_copy_lid4()
1851 ctsio->kern_data_len = len; in ctl_extended_copy_lid4()
1852 ctsio->kern_total_len = len; in ctl_extended_copy_lid4()
1853 ctsio->kern_rel_offset = 0; in ctl_extended_copy_lid4()
1854 ctsio->kern_sg_entries = 0; in ctl_extended_copy_lid4()
1855 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_extended_copy_lid4()
1856 ctsio->be_move_done = ctl_config_move_done; in ctl_extended_copy_lid4()
1862 data = (struct scsi_extended_copy_lid4_data *)ctsio->kern_data_ptr; in ctl_extended_copy_lid4()
1863 lencscd = scsi_2btoul(data->cscd_list_length); in ctl_extended_copy_lid4()
1864 lenseg = scsi_2btoul(data->segment_list_length); in ctl_extended_copy_lid4()
1865 leninl = scsi_2btoul(data->inline_data_length); in ctl_extended_copy_lid4()
1887 list->service_action = cdb->service_action; in ctl_extended_copy_lid4()
1888 value = dnvlist_get_string(lun->be_lun->options, "insecure_tpc", NULL); in ctl_extended_copy_lid4()
1890 list->init_port = -1; in ctl_extended_copy_lid4()
1892 list->init_port = ctsio->io_hdr.nexus.targ_port; in ctl_extended_copy_lid4()
1893 list->init_idx = ctl_get_initindex(&ctsio->io_hdr.nexus); in ctl_extended_copy_lid4()
1894 list->list_id = scsi_4btoul(data->list_identifier); in ctl_extended_copy_lid4()
1895 list->flags = data->flags; in ctl_extended_copy_lid4()
1896 list->params = ctsio->kern_data_ptr; in ctl_extended_copy_lid4()
1897 list->cscd = (struct scsi_ec_cscd *)&data->data[0]; in ctl_extended_copy_lid4()
1898 ptr = &data->data[0]; in ctl_extended_copy_lid4()
1901 if (cscd->type_code != EC_CSCD_ID) { in ctl_extended_copy_lid4()
1909 ptr = &data->data[lencscd]; in ctl_extended_copy_lid4()
1919 if (seg->type_code != EC_SEG_B2B && in ctl_extended_copy_lid4()
1920 seg->type_code != EC_SEG_VERIFY && in ctl_extended_copy_lid4()
1921 seg->type_code != EC_SEG_REGISTER_KEY) { in ctl_extended_copy_lid4()
1928 list->seg[nseg] = seg; in ctl_extended_copy_lid4()
1930 scsi_2btoul(seg->descr_length); in ctl_extended_copy_lid4()
1932 list->inl = &data->data[lencscd + lenseg]; in ctl_extended_copy_lid4()
1933 list->ncscd = lencscd / sizeof(struct scsi_ec_cscd); in ctl_extended_copy_lid4()
1934 list->nseg = nseg; in ctl_extended_copy_lid4()
1935 list->leninl = leninl; in ctl_extended_copy_lid4()
1936 list->ctsio = ctsio; in ctl_extended_copy_lid4()
1937 list->lun = lun; in ctl_extended_copy_lid4()
1938 mtx_lock(&lun->lun_lock); in ctl_extended_copy_lid4()
1939 if ((list->flags & EC_LIST_ID_USAGE_MASK) != EC_LIST_ID_USAGE_NONE) { in ctl_extended_copy_lid4()
1940 tlist = tpc_find_list(lun, list->list_id, list->init_idx); in ctl_extended_copy_lid4()
1941 if (tlist != NULL && !tlist->completed) { in ctl_extended_copy_lid4()
1942 mtx_unlock(&lun->lun_lock); in ctl_extended_copy_lid4()
1950 TAILQ_REMOVE(&lun->tpc_lists, tlist, links); in ctl_extended_copy_lid4()
1954 TAILQ_INSERT_TAIL(&lun->tpc_lists, list, links); in ctl_extended_copy_lid4()
1955 mtx_unlock(&lun->lun_lock); in ctl_extended_copy_lid4()
1961 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) { in ctl_extended_copy_lid4()
1962 free(ctsio->kern_data_ptr, M_CTL); in ctl_extended_copy_lid4()
1963 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED; in ctl_extended_copy_lid4()
1979 scsi_ulto4b(ROD_TYPE_AUR, token->type); in tpc_create_token()
1980 scsi_ulto2b(0x01f8, token->length); in tpc_create_token()
1981 scsi_u64to8b(atomic_fetchadd_int(&id, 1), &token->body[0]); in tpc_create_token()
1982 if (lun->lun_devid) in tpc_create_token()
1984 lun->lun_devid->data, lun->lun_devid->len, in tpc_create_token()
1986 if (idd == NULL && lun->lun_devid) in tpc_create_token()
1988 lun->lun_devid->data, lun->lun_devid->len, in tpc_create_token()
1991 cscd = (struct scsi_ec_cscd_id *)&token->body[8]; in tpc_create_token()
1992 cscd->type_code = EC_CSCD_ID; in tpc_create_token()
1993 cscd->luidt_pdt = T_DIRECT; in tpc_create_token()
1994 memcpy(&cscd->codeset, idd, 4 + idd->length); in tpc_create_token()
1995 scsi_ulto3b(lun->be_lun->blocksize, cscd->dtsp.block_length); in tpc_create_token()
1997 scsi_u64to8b(0, &token->body[40]); /* XXX: Should be 128bit value. */ in tpc_create_token()
1998 scsi_u64to8b(len, &token->body[48]); in tpc_create_token()
2001 dtsd = (struct scsi_read_capacity_data_long *)&token->body[88 - 8]; in tpc_create_token()
2002 scsi_ulto4b(lun->be_lun->blocksize, dtsd->length); in tpc_create_token()
2003 dtsd->prot_lbppbe = lun->be_lun->pblockexp & SRC16_LBPPBE; in tpc_create_token()
2004 scsi_ulto2b(lun->be_lun->pblockoff & SRC16_LALBA_A, dtsd->lalba_lbp); in tpc_create_token()
2005 if (lun->be_lun->flags & CTL_LUN_FLAG_UNMAP) in tpc_create_token()
2006 dtsd->lalba_lbp[0] |= SRC16_LBPME | SRC16_LBPRZ; in tpc_create_token()
2008 if (port->target_devid) { in tpc_create_token()
2009 targid_len = port->target_devid->len; in tpc_create_token()
2010 memcpy(&token->body[120], port->target_devid->data, targid_len); in tpc_create_token()
2013 arc4rand(&token->body[120 + targid_len], 384 - targid_len, 0); in tpc_create_token()
2031 cdb = (struct scsi_populate_token *)ctsio->cdb; in ctl_populate_token()
2032 len = scsi_4btoul(cdb->length); in ctl_populate_token()
2046 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) { in ctl_populate_token()
2047 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK); in ctl_populate_token()
2048 ctsio->kern_data_len = len; in ctl_populate_token()
2049 ctsio->kern_total_len = len; in ctl_populate_token()
2050 ctsio->kern_rel_offset = 0; in ctl_populate_token()
2051 ctsio->kern_sg_entries = 0; in ctl_populate_token()
2052 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_populate_token()
2053 ctsio->be_move_done = ctl_config_move_done; in ctl_populate_token()
2059 data = (struct scsi_populate_token_data *)ctsio->kern_data_ptr; in ctl_populate_token()
2060 lendata = scsi_2btoul(data->length); in ctl_populate_token()
2061 if (lendata < sizeof(struct scsi_populate_token_data) - 2 + in ctl_populate_token()
2067 lendesc = scsi_2btoul(data->range_descriptor_length); in ctl_populate_token()
2070 lendata < sizeof(struct scsi_populate_token_data) - 2 + lendesc) { in ctl_populate_token()
2077 scsi_4btoul(cdb->list_identifier), in ctl_populate_token()
2078 data->flags, scsi_4btoul(data->inactivity_timeout), in ctl_populate_token()
2079 scsi_4btoul(data->rod_type), in ctl_populate_token()
2080 scsi_2btoul(data->range_descriptor_length)); in ctl_populate_token()
2084 if (scsi_4btoul(data->inactivity_timeout) > TPC_MAX_TOKEN_TIMEOUT) { in ctl_populate_token()
2092 if ((data->flags & EC_PT_RTV) && in ctl_populate_token()
2093 scsi_4btoul(data->rod_type) != ROD_TYPE_AUR) { in ctl_populate_token()
2100 if (tpc_check_ranges_l(&data->desc[0], in ctl_populate_token()
2101 scsi_2btoul(data->range_descriptor_length) / in ctl_populate_token()
2103 lun->be_lun->maxlba, &lba) != 0) { in ctl_populate_token()
2107 if (tpc_check_ranges_x(&data->desc[0], in ctl_populate_token()
2108 scsi_2btoul(data->range_descriptor_length) / in ctl_populate_token()
2117 list->service_action = cdb->service_action; in ctl_populate_token()
2118 list->init_port = ctsio->io_hdr.nexus.targ_port; in ctl_populate_token()
2119 list->init_idx = ctl_get_initindex(&ctsio->io_hdr.nexus); in ctl_populate_token()
2120 list->list_id = scsi_4btoul(cdb->list_identifier); in ctl_populate_token()
2121 list->flags = data->flags; in ctl_populate_token()
2122 list->ctsio = ctsio; in ctl_populate_token()
2123 list->lun = lun; in ctl_populate_token()
2124 mtx_lock(&lun->lun_lock); in ctl_populate_token()
2125 tlist = tpc_find_list(lun, list->list_id, list->init_idx); in ctl_populate_token()
2126 if (tlist != NULL && !tlist->completed) { in ctl_populate_token()
2127 mtx_unlock(&lun->lun_lock); in ctl_populate_token()
2135 TAILQ_REMOVE(&lun->tpc_lists, tlist, links); in ctl_populate_token()
2138 TAILQ_INSERT_TAIL(&lun->tpc_lists, list, links); in ctl_populate_token()
2139 mtx_unlock(&lun->lun_lock); in ctl_populate_token()
2142 token->lun = lun->lun; in ctl_populate_token()
2143 token->blocksize = lun->be_lun->blocksize; in ctl_populate_token()
2144 token->params = ctsio->kern_data_ptr; in ctl_populate_token()
2145 token->range = &data->desc[0]; in ctl_populate_token()
2146 token->nrange = scsi_2btoul(data->range_descriptor_length) / in ctl_populate_token()
2148 list->cursectors = tpc_ranges_length(token->range, token->nrange); in ctl_populate_token()
2149 list->curbytes = (off_t)list->cursectors * lun->be_lun->blocksize; in ctl_populate_token()
2150 tpc_create_token(lun, port, list->curbytes, in ctl_populate_token()
2151 (struct scsi_token *)token->token); in ctl_populate_token()
2152 token->active = 0; in ctl_populate_token()
2153 token->last_active = time_uptime; in ctl_populate_token()
2154 token->timeout = scsi_4btoul(data->inactivity_timeout); in ctl_populate_token()
2155 if (token->timeout == 0) in ctl_populate_token()
2156 token->timeout = TPC_DFL_TOKEN_TIMEOUT; in ctl_populate_token()
2157 else if (token->timeout < TPC_MIN_TOKEN_TIMEOUT) in ctl_populate_token()
2158 token->timeout = TPC_MIN_TOKEN_TIMEOUT; in ctl_populate_token()
2159 memcpy(list->res_token, token->token, sizeof(list->res_token)); in ctl_populate_token()
2160 list->res_token_valid = 1; in ctl_populate_token()
2161 list->curseg = 0; in ctl_populate_token()
2162 list->completed = 1; in ctl_populate_token()
2163 list->last_active = time_uptime; in ctl_populate_token()
2164 mtx_lock(&softc->tpc_lock); in ctl_populate_token()
2165 TAILQ_INSERT_TAIL(&softc->tpc_tokens, token, links); in ctl_populate_token()
2166 mtx_unlock(&softc->tpc_lock); in ctl_populate_token()
2172 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) { in ctl_populate_token()
2173 free(ctsio->kern_data_ptr, M_CTL); in ctl_populate_token()
2174 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED; in ctl_populate_token()
2194 cdb = (struct scsi_write_using_token *)ctsio->cdb; in ctl_write_using_token()
2195 len = scsi_4btoul(cdb->length); in ctl_write_using_token()
2209 if ((ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) == 0) { in ctl_write_using_token()
2210 ctsio->kern_data_ptr = malloc(len, M_CTL, M_WAITOK); in ctl_write_using_token()
2211 ctsio->kern_data_len = len; in ctl_write_using_token()
2212 ctsio->kern_total_len = len; in ctl_write_using_token()
2213 ctsio->kern_rel_offset = 0; in ctl_write_using_token()
2214 ctsio->kern_sg_entries = 0; in ctl_write_using_token()
2215 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_write_using_token()
2216 ctsio->be_move_done = ctl_config_move_done; in ctl_write_using_token()
2222 data = (struct scsi_write_using_token_data *)ctsio->kern_data_ptr; in ctl_write_using_token()
2223 lendata = scsi_2btoul(data->length); in ctl_write_using_token()
2224 if (lendata < sizeof(struct scsi_write_using_token_data) - 2 + in ctl_write_using_token()
2230 lendesc = scsi_2btoul(data->range_descriptor_length); in ctl_write_using_token()
2233 lendata < sizeof(struct scsi_write_using_token_data) - 2 + lendesc) { in ctl_write_using_token()
2240 scsi_4btoul(cdb->list_identifier), in ctl_write_using_token()
2241 data->flags, scsi_8btou64(data->offset_into_rod), in ctl_write_using_token()
2242 scsi_2btoul(data->range_descriptor_length)); in ctl_write_using_token()
2246 if (tpc_check_ranges_l(&data->desc[0], in ctl_write_using_token()
2247 scsi_2btoul(data->range_descriptor_length) / in ctl_write_using_token()
2249 lun->be_lun->maxlba, &lba) != 0) { in ctl_write_using_token()
2253 if (tpc_check_ranges_x(&data->desc[0], in ctl_write_using_token()
2254 scsi_2btoul(data->range_descriptor_length) / in ctl_write_using_token()
2263 list->service_action = cdb->service_action; in ctl_write_using_token()
2264 list->init_port = ctsio->io_hdr.nexus.targ_port; in ctl_write_using_token()
2265 list->init_idx = ctl_get_initindex(&ctsio->io_hdr.nexus); in ctl_write_using_token()
2266 list->list_id = scsi_4btoul(cdb->list_identifier); in ctl_write_using_token()
2267 list->flags = data->flags; in ctl_write_using_token()
2268 list->params = ctsio->kern_data_ptr; in ctl_write_using_token()
2269 list->range = &data->desc[0]; in ctl_write_using_token()
2270 list->nrange = scsi_2btoul(data->range_descriptor_length) / in ctl_write_using_token()
2272 list->offset_into_rod = scsi_8btou64(data->offset_into_rod); in ctl_write_using_token()
2273 list->ctsio = ctsio; in ctl_write_using_token()
2274 list->lun = lun; in ctl_write_using_token()
2275 mtx_lock(&lun->lun_lock); in ctl_write_using_token()
2276 tlist = tpc_find_list(lun, list->list_id, list->init_idx); in ctl_write_using_token()
2277 if (tlist != NULL && !tlist->completed) { in ctl_write_using_token()
2278 mtx_unlock(&lun->lun_lock); in ctl_write_using_token()
2286 TAILQ_REMOVE(&lun->tpc_lists, tlist, links); in ctl_write_using_token()
2289 TAILQ_INSERT_TAIL(&lun->tpc_lists, list, links); in ctl_write_using_token()
2290 mtx_unlock(&lun->lun_lock); in ctl_write_using_token()
2292 /* Block device zero ROD token -> no token. */ in ctl_write_using_token()
2293 if (scsi_4btoul(data->rod_token) == ROD_TYPE_BLOCK_ZERO) { in ctl_write_using_token()
2298 mtx_lock(&softc->tpc_lock); in ctl_write_using_token()
2299 TAILQ_FOREACH(token, &softc->tpc_tokens, links) { in ctl_write_using_token()
2300 if (memcmp(token->token, data->rod_token, in ctl_write_using_token()
2301 sizeof(data->rod_token)) == 0) in ctl_write_using_token()
2305 token->active++; in ctl_write_using_token()
2306 list->token = token; in ctl_write_using_token()
2307 if (data->flags & EC_WUT_DEL_TKN) in ctl_write_using_token()
2308 token->timeout = 0; in ctl_write_using_token()
2310 mtx_unlock(&softc->tpc_lock); in ctl_write_using_token()
2312 mtx_lock(&lun->lun_lock); in ctl_write_using_token()
2313 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_write_using_token()
2314 mtx_unlock(&lun->lun_lock); in ctl_write_using_token()
2326 if (ctsio->io_hdr.flags & CTL_FLAG_ALLOCATED) { in ctl_write_using_token()
2327 free(ctsio->kern_data_ptr, M_CTL); in ctl_write_using_token()
2328 ctsio->io_hdr.flags &= ~CTL_FLAG_ALLOCATED; in ctl_write_using_token()
2349 cdb = (struct scsi_receive_rod_token_information *)ctsio->cdb; in ctl_receive_rod_token_information()
2352 list_id = scsi_4btoul(cdb->list_identifier); in ctl_receive_rod_token_information()
2353 mtx_lock(&lun->lun_lock); in ctl_receive_rod_token_information()
2355 ctl_get_initindex(&ctsio->io_hdr.nexus)); in ctl_receive_rod_token_information()
2357 mtx_unlock(&lun->lun_lock); in ctl_receive_rod_token_information()
2365 if (list->completed) { in ctl_receive_rod_token_information()
2366 TAILQ_REMOVE(&lun->tpc_lists, list, links); in ctl_receive_rod_token_information()
2369 mtx_unlock(&lun->lun_lock); in ctl_receive_rod_token_information()
2373 alloc_len = scsi_4btoul(cdb->length); in ctl_receive_rod_token_information()
2375 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO); in ctl_receive_rod_token_information()
2376 ctsio->kern_sg_entries = 0; in ctl_receive_rod_token_information()
2377 ctsio->kern_rel_offset = 0; in ctl_receive_rod_token_information()
2378 ctsio->kern_data_len = min(total_len, alloc_len); in ctl_receive_rod_token_information()
2379 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_receive_rod_token_information()
2381 data = (struct scsi_receive_copy_status_lid4_data *)ctsio->kern_data_ptr; in ctl_receive_rod_token_information()
2382 scsi_ulto4b(sizeof(*data) - 4 + list_copy.sense_len + in ctl_receive_rod_token_information()
2383 4 + token_len, data->available_data); in ctl_receive_rod_token_information()
2384 data->response_to_service_action = list_copy.service_action; in ctl_receive_rod_token_information()
2387 data->copy_command_status = RCS_CCS_ERROR; in ctl_receive_rod_token_information()
2389 data->copy_command_status = RCS_CCS_ABORTED; in ctl_receive_rod_token_information()
2391 data->copy_command_status = RCS_CCS_COMPLETED; in ctl_receive_rod_token_information()
2393 data->copy_command_status = RCS_CCS_INPROG_FG; in ctl_receive_rod_token_information()
2394 scsi_ulto2b(list_copy.curops, data->operation_counter); in ctl_receive_rod_token_information()
2395 scsi_ulto4b(UINT32_MAX, data->estimated_status_update_delay); in ctl_receive_rod_token_information()
2396 data->transfer_count_units = RCS_TC_LBAS; in ctl_receive_rod_token_information()
2397 scsi_u64to8b(list_copy.cursectors, data->transfer_count); in ctl_receive_rod_token_information()
2398 scsi_ulto2b(list_copy.curseg, data->segments_processed); in ctl_receive_rod_token_information()
2399 data->length_of_the_sense_data_field = list_copy.sense_len; in ctl_receive_rod_token_information()
2400 data->sense_data_length = list_copy.sense_len; in ctl_receive_rod_token_information()
2401 memcpy(data->sense_data, &list_copy.sense_data, list_copy.sense_len); in ctl_receive_rod_token_information()
2403 ptr = &data->sense_data[data->length_of_the_sense_data_field]; in ctl_receive_rod_token_information()
2411 scsi_4btoul(cdb->list_identifier), list_copy.res_token_valid); in ctl_receive_rod_token_information()
2414 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_receive_rod_token_information()
2415 ctsio->be_move_done = ctl_config_move_done; in ctl_receive_rod_token_information()
2432 cdb = (struct scsi_report_all_rod_tokens *)ctsio->cdb; in ctl_report_all_rod_tokens()
2436 mtx_lock(&softc->tpc_lock); in ctl_report_all_rod_tokens()
2437 TAILQ_FOREACH(token, &softc->tpc_tokens, links) in ctl_report_all_rod_tokens()
2439 mtx_unlock(&softc->tpc_lock); in ctl_report_all_rod_tokens()
2444 alloc_len = scsi_4btoul(cdb->length); in ctl_report_all_rod_tokens()
2446 ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO); in ctl_report_all_rod_tokens()
2447 ctsio->kern_sg_entries = 0; in ctl_report_all_rod_tokens()
2448 ctsio->kern_rel_offset = 0; in ctl_report_all_rod_tokens()
2449 ctsio->kern_data_len = min(total_len, alloc_len); in ctl_report_all_rod_tokens()
2450 ctsio->kern_total_len = ctsio->kern_data_len; in ctl_report_all_rod_tokens()
2452 data = (struct scsi_report_all_rod_tokens_data *)ctsio->kern_data_ptr; in ctl_report_all_rod_tokens()
2454 mtx_lock(&softc->tpc_lock); in ctl_report_all_rod_tokens()
2455 TAILQ_FOREACH(token, &softc->tpc_tokens, links) { in ctl_report_all_rod_tokens()
2458 memcpy(&data->rod_management_token_list[i * 96], in ctl_report_all_rod_tokens()
2459 token->token, 96); in ctl_report_all_rod_tokens()
2462 mtx_unlock(&softc->tpc_lock); in ctl_report_all_rod_tokens()
2463 scsi_ulto4b(sizeof(*data) - 4 + i * 96, data->available_data); in ctl_report_all_rod_tokens()
2468 ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED; in ctl_report_all_rod_tokens()
2469 ctsio->be_move_done = ctl_config_move_done; in ctl_report_all_rod_tokens()