| .. | .. |
|---|
| 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 |
|---|