.. | .. |
---|
650 | 650 | if (!dev) |
---|
651 | 651 | return; |
---|
652 | 652 | |
---|
653 | | - spin_lock_irqsave(&dev->execute_task_lock, flags); |
---|
| 653 | + spin_lock_irqsave(&dev->queues[cmd->cpuid].lock, flags); |
---|
654 | 654 | if (cmd->state_active) { |
---|
655 | 655 | list_del(&cmd->state_list); |
---|
656 | 656 | cmd->state_active = false; |
---|
657 | 657 | } |
---|
658 | | - spin_unlock_irqrestore(&dev->execute_task_lock, flags); |
---|
| 658 | + spin_unlock_irqrestore(&dev->queues[cmd->cpuid].lock, flags); |
---|
659 | 659 | } |
---|
660 | 660 | |
---|
661 | 661 | /* |
---|
.. | .. |
---|
866 | 866 | |
---|
867 | 867 | INIT_WORK(&cmd->work, success ? target_complete_ok_work : |
---|
868 | 868 | target_complete_failure_work); |
---|
869 | | - if (cmd->se_cmd_flags & SCF_USE_CPUID) |
---|
870 | | - queue_work_on(cmd->cpuid, target_completion_wq, &cmd->work); |
---|
871 | | - else |
---|
872 | | - queue_work(target_completion_wq, &cmd->work); |
---|
| 869 | + queue_work_on(cmd->cpuid, target_completion_wq, &cmd->work); |
---|
873 | 870 | } |
---|
874 | 871 | EXPORT_SYMBOL(target_complete_cmd); |
---|
875 | 872 | |
---|
.. | .. |
---|
904 | 901 | struct se_device *dev = cmd->se_dev; |
---|
905 | 902 | unsigned long flags; |
---|
906 | 903 | |
---|
907 | | - spin_lock_irqsave(&dev->execute_task_lock, flags); |
---|
| 904 | + spin_lock_irqsave(&dev->queues[cmd->cpuid].lock, flags); |
---|
908 | 905 | if (!cmd->state_active) { |
---|
909 | | - list_add_tail(&cmd->state_list, &dev->state_list); |
---|
| 906 | + list_add_tail(&cmd->state_list, |
---|
| 907 | + &dev->queues[cmd->cpuid].state_list); |
---|
910 | 908 | cmd->state_active = true; |
---|
911 | 909 | } |
---|
912 | | - spin_unlock_irqrestore(&dev->execute_task_lock, flags); |
---|
| 910 | + spin_unlock_irqrestore(&dev->queues[cmd->cpuid].lock, flags); |
---|
913 | 911 | } |
---|
914 | 912 | |
---|
915 | 913 | /* |
---|
.. | .. |
---|
1397 | 1395 | cmd->sense_buffer = sense_buffer; |
---|
1398 | 1396 | cmd->orig_fe_lun = unpacked_lun; |
---|
1399 | 1397 | |
---|
| 1398 | + if (!(cmd->se_cmd_flags & SCF_USE_CPUID)) |
---|
| 1399 | + cmd->cpuid = raw_smp_processor_id(); |
---|
| 1400 | + |
---|
1400 | 1401 | cmd->state_active = false; |
---|
1401 | 1402 | } |
---|
1402 | 1403 | EXPORT_SYMBOL(transport_init_se_cmd); |
---|
.. | .. |
---|
1614 | 1615 | BUG_ON(!se_tpg); |
---|
1615 | 1616 | BUG_ON(se_cmd->se_tfo || se_cmd->se_sess); |
---|
1616 | 1617 | BUG_ON(in_interrupt()); |
---|
| 1618 | + |
---|
| 1619 | + if (flags & TARGET_SCF_USE_CPUID) |
---|
| 1620 | + se_cmd->se_cmd_flags |= SCF_USE_CPUID; |
---|
1617 | 1621 | /* |
---|
1618 | 1622 | * Initialize se_cmd for target operation. From this point |
---|
1619 | 1623 | * exceptions are handled by sending exception status via |
---|
.. | .. |
---|
1622 | 1626 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, |
---|
1623 | 1627 | data_length, data_dir, task_attr, sense, |
---|
1624 | 1628 | unpacked_lun); |
---|
1625 | | - |
---|
1626 | | - if (flags & TARGET_SCF_USE_CPUID) |
---|
1627 | | - se_cmd->se_cmd_flags |= SCF_USE_CPUID; |
---|
1628 | | - else |
---|
1629 | | - se_cmd->cpuid = WORK_CPU_UNBOUND; |
---|
1630 | 1629 | |
---|
1631 | 1630 | if (flags & TARGET_SCF_UNKNOWN_SIZE) |
---|
1632 | 1631 | se_cmd->unknown_data_length = 1; |
---|
.. | .. |
---|
3131 | 3130 | } |
---|
3132 | 3131 | EXPORT_SYMBOL(transport_wait_for_tasks); |
---|
3133 | 3132 | |
---|
3134 | | -struct sense_info { |
---|
| 3133 | +struct sense_detail { |
---|
3135 | 3134 | u8 key; |
---|
3136 | 3135 | u8 asc; |
---|
3137 | 3136 | u8 ascq; |
---|
3138 | | - bool add_sector_info; |
---|
| 3137 | + bool add_sense_info; |
---|
3139 | 3138 | }; |
---|
3140 | 3139 | |
---|
3141 | | -static const struct sense_info sense_info_table[] = { |
---|
| 3140 | +static const struct sense_detail sense_detail_table[] = { |
---|
3142 | 3141 | [TCM_NO_SENSE] = { |
---|
3143 | 3142 | .key = NOT_READY |
---|
3144 | 3143 | }, |
---|
.. | .. |
---|
3238 | 3237 | .key = ABORTED_COMMAND, |
---|
3239 | 3238 | .asc = 0x10, |
---|
3240 | 3239 | .ascq = 0x01, /* LOGICAL BLOCK GUARD CHECK FAILED */ |
---|
3241 | | - .add_sector_info = true, |
---|
| 3240 | + .add_sense_info = true, |
---|
3242 | 3241 | }, |
---|
3243 | 3242 | [TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED] = { |
---|
3244 | 3243 | .key = ABORTED_COMMAND, |
---|
3245 | 3244 | .asc = 0x10, |
---|
3246 | 3245 | .ascq = 0x02, /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */ |
---|
3247 | | - .add_sector_info = true, |
---|
| 3246 | + .add_sense_info = true, |
---|
3248 | 3247 | }, |
---|
3249 | 3248 | [TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED] = { |
---|
3250 | 3249 | .key = ABORTED_COMMAND, |
---|
3251 | 3250 | .asc = 0x10, |
---|
3252 | 3251 | .ascq = 0x03, /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ |
---|
3253 | | - .add_sector_info = true, |
---|
| 3252 | + .add_sense_info = true, |
---|
3254 | 3253 | }, |
---|
3255 | 3254 | [TCM_COPY_TARGET_DEVICE_NOT_REACHABLE] = { |
---|
3256 | 3255 | .key = COPY_ABORTED, |
---|
.. | .. |
---|
3298 | 3297 | */ |
---|
3299 | 3298 | static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason) |
---|
3300 | 3299 | { |
---|
3301 | | - const struct sense_info *si; |
---|
| 3300 | + const struct sense_detail *sd; |
---|
3302 | 3301 | u8 *buffer = cmd->sense_buffer; |
---|
3303 | 3302 | int r = (__force int)reason; |
---|
3304 | 3303 | u8 key, asc, ascq; |
---|
3305 | 3304 | bool desc_format = target_sense_desc_format(cmd->se_dev); |
---|
3306 | 3305 | |
---|
3307 | | - if (r < ARRAY_SIZE(sense_info_table) && sense_info_table[r].key) |
---|
3308 | | - si = &sense_info_table[r]; |
---|
| 3306 | + if (r < ARRAY_SIZE(sense_detail_table) && sense_detail_table[r].key) |
---|
| 3307 | + sd = &sense_detail_table[r]; |
---|
3309 | 3308 | else |
---|
3310 | | - si = &sense_info_table[(__force int) |
---|
| 3309 | + sd = &sense_detail_table[(__force int) |
---|
3311 | 3310 | TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE]; |
---|
3312 | 3311 | |
---|
3313 | | - key = si->key; |
---|
| 3312 | + key = sd->key; |
---|
3314 | 3313 | if (reason == TCM_CHECK_CONDITION_UNIT_ATTENTION) { |
---|
3315 | 3314 | if (!core_scsi3_ua_for_check_condition(cmd, &key, &asc, |
---|
3316 | 3315 | &ascq)) { |
---|
3317 | 3316 | cmd->scsi_status = SAM_STAT_BUSY; |
---|
3318 | 3317 | return; |
---|
3319 | 3318 | } |
---|
3320 | | - } else if (si->asc == 0) { |
---|
| 3319 | + } else if (sd->asc == 0) { |
---|
3321 | 3320 | WARN_ON_ONCE(cmd->scsi_asc == 0); |
---|
3322 | 3321 | asc = cmd->scsi_asc; |
---|
3323 | 3322 | ascq = cmd->scsi_ascq; |
---|
3324 | 3323 | } else { |
---|
3325 | | - asc = si->asc; |
---|
3326 | | - ascq = si->ascq; |
---|
| 3324 | + asc = sd->asc; |
---|
| 3325 | + ascq = sd->ascq; |
---|
3327 | 3326 | } |
---|
3328 | 3327 | |
---|
3329 | 3328 | cmd->se_cmd_flags |= SCF_EMULATED_TASK_SENSE; |
---|
3330 | 3329 | cmd->scsi_status = SAM_STAT_CHECK_CONDITION; |
---|
3331 | 3330 | cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER; |
---|
3332 | 3331 | scsi_build_sense_buffer(desc_format, buffer, key, asc, ascq); |
---|
3333 | | - if (si->add_sector_info) |
---|
| 3332 | + if (sd->add_sense_info) |
---|
3334 | 3333 | WARN_ON_ONCE(scsi_set_sense_information(buffer, |
---|
3335 | 3334 | cmd->scsi_sense_length, |
---|
3336 | | - cmd->bad_sector) < 0); |
---|
| 3335 | + cmd->sense_info) < 0); |
---|
3337 | 3336 | } |
---|
3338 | 3337 | |
---|
3339 | 3338 | int |
---|