0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <asm/unaligned.h>
0013
0014 #include <scsi/scsi_proto.h>
0015 #include <scsi/scsi_common.h>
0016 #include <scsi/scsi_tcq.h>
0017
0018 #include <target/target_core_base.h>
0019 #include <target/target_core_backend.h>
0020 #include <target/target_core_fabric.h>
0021
0022 #include "target_core_internal.h"
0023 #include "target_core_alua.h"
0024 #include "target_core_pr.h"
0025 #include "target_core_ua.h"
0026 #include "target_core_xcopy.h"
0027
0028 static void spc_fill_alua_data(struct se_lun *lun, unsigned char *buf)
0029 {
0030 struct t10_alua_tg_pt_gp *tg_pt_gp;
0031
0032
0033
0034
0035 buf[5] = 0x80;
0036
0037
0038
0039
0040
0041
0042
0043 rcu_read_lock();
0044 tg_pt_gp = rcu_dereference(lun->lun_tg_pt_gp);
0045 if (tg_pt_gp)
0046 buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type;
0047 rcu_read_unlock();
0048 }
0049
0050 static u16
0051 spc_find_scsi_transport_vd(int proto_id)
0052 {
0053 switch (proto_id) {
0054 case SCSI_PROTOCOL_FCP:
0055 return SCSI_VERSION_DESCRIPTOR_FCP4;
0056 case SCSI_PROTOCOL_ISCSI:
0057 return SCSI_VERSION_DESCRIPTOR_ISCSI;
0058 case SCSI_PROTOCOL_SAS:
0059 return SCSI_VERSION_DESCRIPTOR_SAS3;
0060 case SCSI_PROTOCOL_SBP:
0061 return SCSI_VERSION_DESCRIPTOR_SBP3;
0062 case SCSI_PROTOCOL_SRP:
0063 return SCSI_VERSION_DESCRIPTOR_SRP;
0064 default:
0065 pr_warn("Cannot find VERSION DESCRIPTOR value for unknown SCSI"
0066 " transport PROTOCOL IDENTIFIER %#x\n", proto_id);
0067 return 0;
0068 }
0069 }
0070
0071 sense_reason_t
0072 spc_emulate_inquiry_std(struct se_cmd *cmd, unsigned char *buf)
0073 {
0074 struct se_lun *lun = cmd->se_lun;
0075 struct se_portal_group *tpg = lun->lun_tpg;
0076 struct se_device *dev = cmd->se_dev;
0077 struct se_session *sess = cmd->se_sess;
0078
0079
0080 if (dev->transport->get_device_type(dev) == TYPE_TAPE)
0081 buf[1] = 0x80;
0082
0083 buf[2] = 0x06;
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 buf[3] = 2;
0096
0097
0098
0099
0100 spc_fill_alua_data(lun, buf);
0101
0102
0103
0104
0105 if (dev->dev_attrib.emulate_3pc)
0106 buf[5] |= 0x8;
0107
0108
0109
0110
0111
0112
0113 if (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) {
0114 if (dev->dev_attrib.pi_prot_type || cmd->se_sess->sess_prot_type)
0115 buf[5] |= 0x1;
0116 }
0117
0118 buf[7] = 0x2;
0119
0120
0121
0122
0123
0124
0125 memset(&buf[8], 0x20,
0126 INQUIRY_VENDOR_LEN + INQUIRY_MODEL_LEN + INQUIRY_REVISION_LEN);
0127 memcpy(&buf[8], dev->t10_wwn.vendor,
0128 strnlen(dev->t10_wwn.vendor, INQUIRY_VENDOR_LEN));
0129 memcpy(&buf[16], dev->t10_wwn.model,
0130 strnlen(dev->t10_wwn.model, INQUIRY_MODEL_LEN));
0131 memcpy(&buf[32], dev->t10_wwn.revision,
0132 strnlen(dev->t10_wwn.revision, INQUIRY_REVISION_LEN));
0133
0134
0135
0136
0137 put_unaligned_be16(SCSI_VERSION_DESCRIPTOR_SAM5, &buf[58]);
0138 put_unaligned_be16(spc_find_scsi_transport_vd(tpg->proto_id), &buf[60]);
0139 put_unaligned_be16(SCSI_VERSION_DESCRIPTOR_SPC4, &buf[62]);
0140 if (cmd->se_dev->transport->get_device_type(dev) == TYPE_DISK)
0141 put_unaligned_be16(SCSI_VERSION_DESCRIPTOR_SBC3, &buf[64]);
0142
0143 buf[4] = 91;
0144
0145 return 0;
0146 }
0147 EXPORT_SYMBOL(spc_emulate_inquiry_std);
0148
0149
0150 static sense_reason_t
0151 spc_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
0152 {
0153 struct se_device *dev = cmd->se_dev;
0154 u16 len;
0155
0156 if (dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
0157 len = sprintf(&buf[4], "%s", dev->t10_wwn.unit_serial);
0158 len++;
0159 buf[3] = len;
0160 }
0161 return 0;
0162 }
0163
0164
0165
0166
0167 void spc_gen_naa_6h_vendor_specific(struct se_device *dev,
0168 unsigned char *buf)
0169 {
0170 unsigned char *p = &dev->t10_wwn.unit_serial[0];
0171 u32 company_id = dev->t10_wwn.company_id;
0172 int cnt, off = 0;
0173 bool next = true;
0174
0175
0176
0177
0178 buf[off] = 0x6 << 4;
0179
0180
0181 buf[off++] |= (company_id >> 20) & 0xf;
0182 buf[off++] = (company_id >> 12) & 0xff;
0183 buf[off++] = (company_id >> 4) & 0xff;
0184 buf[off] = (company_id & 0xf) << 4;
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194 for (cnt = off + 13; *p && off < cnt; p++) {
0195 int val = hex_to_bin(*p);
0196
0197 if (val < 0)
0198 continue;
0199
0200 if (next) {
0201 next = false;
0202 buf[off++] |= val;
0203 } else {
0204 next = true;
0205 buf[off] = val << 4;
0206 }
0207 }
0208 }
0209
0210
0211
0212
0213
0214 sense_reason_t
0215 spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
0216 {
0217 struct se_device *dev = cmd->se_dev;
0218 struct se_lun *lun = cmd->se_lun;
0219 struct se_portal_group *tpg = NULL;
0220 struct t10_alua_lu_gp_member *lu_gp_mem;
0221 struct t10_alua_tg_pt_gp *tg_pt_gp;
0222 unsigned char *prod = &dev->t10_wwn.model[0];
0223 u32 prod_len;
0224 u32 unit_serial_len, off = 0;
0225 u16 len = 0, id_len;
0226
0227 off = 4;
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237 if (!(dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL))
0238 goto check_t10_vend_desc;
0239
0240
0241 buf[off++] = 0x1;
0242
0243
0244 buf[off] = 0x00;
0245
0246
0247 buf[off++] |= 0x3;
0248 off++;
0249
0250
0251 buf[off++] = 0x10;
0252
0253
0254 spc_gen_naa_6h_vendor_specific(dev, &buf[off]);
0255
0256 len = 20;
0257 off = (len + 4);
0258
0259 check_t10_vend_desc:
0260
0261
0262
0263 id_len = 8;
0264 prod_len = 4;
0265 prod_len += 8;
0266 prod_len += strlen(prod);
0267 prod_len++;
0268
0269 if (dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
0270 unit_serial_len = strlen(&dev->t10_wwn.unit_serial[0]);
0271 unit_serial_len++;
0272
0273 id_len += sprintf(&buf[off+12], "%s:%s", prod,
0274 &dev->t10_wwn.unit_serial[0]);
0275 }
0276 buf[off] = 0x2;
0277 buf[off+1] = 0x1;
0278 buf[off+2] = 0x0;
0279
0280 memset(&buf[off+4], 0x20, INQUIRY_VENDOR_LEN);
0281 memcpy(&buf[off+4], dev->t10_wwn.vendor,
0282 strnlen(dev->t10_wwn.vendor, INQUIRY_VENDOR_LEN));
0283
0284 id_len++;
0285
0286 buf[off+3] = id_len;
0287
0288 len += (id_len + 4);
0289 off += (id_len + 4);
0290
0291 if (1) {
0292 struct t10_alua_lu_gp *lu_gp;
0293 u32 padding, scsi_name_len, scsi_target_len;
0294 u16 lu_gp_id = 0;
0295 u16 tg_pt_gp_id = 0;
0296 u16 tpgt;
0297
0298 tpg = lun->lun_tpg;
0299
0300
0301
0302
0303
0304
0305
0306 buf[off] = tpg->proto_id << 4;
0307 buf[off++] |= 0x1;
0308 buf[off] = 0x80;
0309
0310 buf[off] |= 0x10;
0311
0312 buf[off++] |= 0x4;
0313 off++;
0314 buf[off++] = 4;
0315
0316
0317 off += 2;
0318 put_unaligned_be16(lun->lun_rtpi, &buf[off]);
0319 off += 2;
0320 len += 8;
0321
0322
0323
0324
0325
0326
0327
0328 rcu_read_lock();
0329 tg_pt_gp = rcu_dereference(lun->lun_tg_pt_gp);
0330 if (!tg_pt_gp) {
0331 rcu_read_unlock();
0332 goto check_lu_gp;
0333 }
0334 tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id;
0335 rcu_read_unlock();
0336
0337 buf[off] = tpg->proto_id << 4;
0338 buf[off++] |= 0x1;
0339 buf[off] = 0x80;
0340
0341 buf[off] |= 0x10;
0342
0343 buf[off++] |= 0x5;
0344 off++;
0345 buf[off++] = 4;
0346 off += 2;
0347 put_unaligned_be16(tg_pt_gp_id, &buf[off]);
0348 off += 2;
0349 len += 8;
0350
0351
0352
0353
0354 check_lu_gp:
0355 lu_gp_mem = dev->dev_alua_lu_gp_mem;
0356 if (!lu_gp_mem)
0357 goto check_scsi_name;
0358
0359 spin_lock(&lu_gp_mem->lu_gp_mem_lock);
0360 lu_gp = lu_gp_mem->lu_gp;
0361 if (!lu_gp) {
0362 spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
0363 goto check_scsi_name;
0364 }
0365 lu_gp_id = lu_gp->lu_gp_id;
0366 spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
0367
0368 buf[off++] |= 0x1;
0369
0370 buf[off++] |= 0x6;
0371 off++;
0372 buf[off++] = 4;
0373 off += 2;
0374 put_unaligned_be16(lu_gp_id, &buf[off]);
0375 off += 2;
0376 len += 8;
0377
0378
0379
0380
0381
0382
0383
0384 check_scsi_name:
0385 buf[off] = tpg->proto_id << 4;
0386 buf[off++] |= 0x3;
0387 buf[off] = 0x80;
0388
0389 buf[off] |= 0x10;
0390
0391 buf[off++] |= 0x8;
0392 off += 2;
0393
0394
0395
0396
0397
0398
0399 tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg);
0400 scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x",
0401 tpg->se_tpg_tfo->tpg_get_wwn(tpg), tpgt);
0402 scsi_name_len += 1 ;
0403
0404
0405
0406
0407
0408
0409
0410
0411 padding = ((-scsi_name_len) & 3);
0412 if (padding)
0413 scsi_name_len += padding;
0414 if (scsi_name_len > 256)
0415 scsi_name_len = 256;
0416
0417 buf[off-1] = scsi_name_len;
0418 off += scsi_name_len;
0419
0420 len += (scsi_name_len + 4);
0421
0422
0423
0424
0425 buf[off] = tpg->proto_id << 4;
0426 buf[off++] |= 0x3;
0427 buf[off] = 0x80;
0428
0429 buf[off] |= 0x20;
0430
0431 buf[off++] |= 0x8;
0432 off += 2;
0433
0434
0435
0436
0437
0438
0439 scsi_target_len = sprintf(&buf[off], "%s",
0440 tpg->se_tpg_tfo->tpg_get_wwn(tpg));
0441 scsi_target_len += 1 ;
0442
0443
0444
0445
0446
0447
0448
0449
0450 padding = ((-scsi_target_len) & 3);
0451 if (padding)
0452 scsi_target_len += padding;
0453 if (scsi_target_len > 256)
0454 scsi_target_len = 256;
0455
0456 buf[off-1] = scsi_target_len;
0457 off += scsi_target_len;
0458
0459
0460 len += (scsi_target_len + 4);
0461 }
0462 put_unaligned_be16(len, &buf[2]);
0463 return 0;
0464 }
0465 EXPORT_SYMBOL(spc_emulate_evpd_83);
0466
0467
0468 static sense_reason_t
0469 spc_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf)
0470 {
0471 struct se_device *dev = cmd->se_dev;
0472 struct se_session *sess = cmd->se_sess;
0473
0474 buf[3] = 0x3c;
0475
0476
0477
0478
0479 if (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) {
0480 if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE1_PROT ||
0481 cmd->se_sess->sess_prot_type == TARGET_DIF_TYPE1_PROT)
0482 buf[4] = 0x5;
0483 else if (dev->dev_attrib.pi_prot_type == TARGET_DIF_TYPE3_PROT ||
0484 cmd->se_sess->sess_prot_type == TARGET_DIF_TYPE3_PROT)
0485 buf[4] = 0x4;
0486 }
0487
0488
0489 if ((dev->transport->get_device_type(dev) == TYPE_DISK) &&
0490 (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) &&
0491 (dev->dev_attrib.pi_prot_type || cmd->se_sess->sess_prot_type)) {
0492 buf[4] |= (0x3 << 3);
0493 }
0494
0495
0496 buf[5] = 0x07;
0497
0498
0499 if (target_check_wce(dev))
0500 buf[6] = 0x01;
0501
0502 spin_lock(&cmd->se_dev->t10_alua.lba_map_lock);
0503 if (!list_empty(&dev->t10_alua.lba_map_list))
0504 buf[8] = 0x10;
0505 spin_unlock(&cmd->se_dev->t10_alua.lba_map_lock);
0506 return 0;
0507 }
0508
0509
0510 static sense_reason_t
0511 spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
0512 {
0513 struct se_device *dev = cmd->se_dev;
0514 u32 mtl = 0;
0515 int have_tp = 0, opt, min;
0516
0517
0518
0519
0520
0521
0522 if (dev->dev_attrib.emulate_tpu || dev->dev_attrib.emulate_tpws)
0523 have_tp = 1;
0524
0525 buf[0] = dev->transport->get_device_type(dev);
0526 buf[3] = have_tp ? 0x3c : 0x10;
0527
0528
0529 buf[4] = 0x01;
0530
0531
0532
0533 if (dev->dev_attrib.emulate_caw)
0534 buf[5] = 0x01;
0535
0536
0537
0538
0539 if (dev->transport->get_io_min && (min = dev->transport->get_io_min(dev)))
0540 put_unaligned_be16(min / dev->dev_attrib.block_size, &buf[6]);
0541 else
0542 put_unaligned_be16(1, &buf[6]);
0543
0544
0545
0546
0547
0548
0549
0550 if (cmd->se_tfo->max_data_sg_nents) {
0551 mtl = (cmd->se_tfo->max_data_sg_nents * PAGE_SIZE) /
0552 dev->dev_attrib.block_size;
0553 }
0554 put_unaligned_be32(min_not_zero(mtl, dev->dev_attrib.hw_max_sectors), &buf[8]);
0555
0556
0557
0558
0559 if (dev->transport->get_io_opt && (opt = dev->transport->get_io_opt(dev)))
0560 put_unaligned_be32(opt / dev->dev_attrib.block_size, &buf[12]);
0561 else
0562 put_unaligned_be32(dev->dev_attrib.optimal_sectors, &buf[12]);
0563
0564
0565
0566
0567 if (!have_tp)
0568 goto max_write_same;
0569
0570
0571
0572
0573 put_unaligned_be32(dev->dev_attrib.max_unmap_lba_count, &buf[20]);
0574
0575
0576
0577
0578 put_unaligned_be32(dev->dev_attrib.max_unmap_block_desc_count,
0579 &buf[24]);
0580
0581
0582
0583
0584 put_unaligned_be32(dev->dev_attrib.unmap_granularity, &buf[28]);
0585
0586
0587
0588
0589 put_unaligned_be32(dev->dev_attrib.unmap_granularity_alignment,
0590 &buf[32]);
0591 if (dev->dev_attrib.unmap_granularity_alignment != 0)
0592 buf[32] |= 0x80;
0593
0594
0595
0596
0597 max_write_same:
0598 put_unaligned_be64(dev->dev_attrib.max_write_same_len, &buf[36]);
0599
0600 return 0;
0601 }
0602
0603
0604 static sense_reason_t
0605 spc_emulate_evpd_b1(struct se_cmd *cmd, unsigned char *buf)
0606 {
0607 struct se_device *dev = cmd->se_dev;
0608
0609 buf[0] = dev->transport->get_device_type(dev);
0610 buf[3] = 0x3c;
0611 buf[5] = dev->dev_attrib.is_nonrot ? 1 : 0;
0612
0613 return 0;
0614 }
0615
0616
0617 static sense_reason_t
0618 spc_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
0619 {
0620 struct se_device *dev = cmd->se_dev;
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630 buf[0] = dev->transport->get_device_type(dev);
0631
0632
0633
0634
0635 put_unaligned_be16(0x0004, &buf[2]);
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646 buf[4] = 0x00;
0647
0648
0649
0650
0651
0652
0653 if (dev->dev_attrib.emulate_tpu != 0)
0654 buf[5] = 0x80;
0655
0656
0657
0658
0659
0660
0661
0662 if (dev->dev_attrib.emulate_tpws != 0)
0663 buf[5] |= 0x40 | 0x20;
0664
0665
0666
0667
0668
0669
0670
0671
0672 if (((dev->dev_attrib.emulate_tpu != 0) ||
0673 (dev->dev_attrib.emulate_tpws != 0)) &&
0674 (dev->dev_attrib.unmap_zeroes_data != 0))
0675 buf[5] |= 0x04;
0676
0677 return 0;
0678 }
0679
0680
0681 static sense_reason_t
0682 spc_emulate_evpd_b3(struct se_cmd *cmd, unsigned char *buf)
0683 {
0684 struct se_device *dev = cmd->se_dev;
0685
0686 buf[0] = dev->transport->get_device_type(dev);
0687 buf[3] = 0x0c;
0688 put_unaligned_be32(dev->t10_alua.lba_map_segment_size, &buf[8]);
0689 put_unaligned_be32(dev->t10_alua.lba_map_segment_multiplier, &buf[12]);
0690
0691 return 0;
0692 }
0693
0694 static sense_reason_t
0695 spc_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf);
0696
0697 static struct {
0698 uint8_t page;
0699 sense_reason_t (*emulate)(struct se_cmd *, unsigned char *);
0700 } evpd_handlers[] = {
0701 { .page = 0x00, .emulate = spc_emulate_evpd_00 },
0702 { .page = 0x80, .emulate = spc_emulate_evpd_80 },
0703 { .page = 0x83, .emulate = spc_emulate_evpd_83 },
0704 { .page = 0x86, .emulate = spc_emulate_evpd_86 },
0705 { .page = 0xb0, .emulate = spc_emulate_evpd_b0 },
0706 { .page = 0xb1, .emulate = spc_emulate_evpd_b1 },
0707 { .page = 0xb2, .emulate = spc_emulate_evpd_b2 },
0708 { .page = 0xb3, .emulate = spc_emulate_evpd_b3 },
0709 };
0710
0711
0712 static sense_reason_t
0713 spc_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf)
0714 {
0715 int p;
0716
0717
0718
0719
0720
0721
0722 if (cmd->se_dev->dev_flags & DF_EMULATED_VPD_UNIT_SERIAL) {
0723 buf[3] = ARRAY_SIZE(evpd_handlers);
0724 for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p)
0725 buf[p + 4] = evpd_handlers[p].page;
0726 }
0727
0728 return 0;
0729 }
0730
0731 static sense_reason_t
0732 spc_emulate_inquiry(struct se_cmd *cmd)
0733 {
0734 struct se_device *dev = cmd->se_dev;
0735 unsigned char *rbuf;
0736 unsigned char *cdb = cmd->t_task_cdb;
0737 unsigned char *buf;
0738 sense_reason_t ret;
0739 int p;
0740 int len = 0;
0741
0742 buf = kzalloc(SE_INQUIRY_BUF, GFP_KERNEL);
0743 if (!buf) {
0744 pr_err("Unable to allocate response buffer for INQUIRY\n");
0745 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
0746 }
0747
0748 buf[0] = dev->transport->get_device_type(dev);
0749
0750 if (!(cdb[1] & 0x1)) {
0751 if (cdb[2]) {
0752 pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n",
0753 cdb[2]);
0754 ret = TCM_INVALID_CDB_FIELD;
0755 goto out;
0756 }
0757
0758 ret = spc_emulate_inquiry_std(cmd, buf);
0759 len = buf[4] + 5;
0760 goto out;
0761 }
0762
0763 for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) {
0764 if (cdb[2] == evpd_handlers[p].page) {
0765 buf[1] = cdb[2];
0766 ret = evpd_handlers[p].emulate(cmd, buf);
0767 len = get_unaligned_be16(&buf[2]) + 4;
0768 goto out;
0769 }
0770 }
0771
0772 pr_debug("Unknown VPD Code: 0x%02x\n", cdb[2]);
0773 ret = TCM_INVALID_CDB_FIELD;
0774
0775 out:
0776 rbuf = transport_kmap_data_sg(cmd);
0777 if (rbuf) {
0778 memcpy(rbuf, buf, min_t(u32, SE_INQUIRY_BUF, cmd->data_length));
0779 transport_kunmap_data_sg(cmd);
0780 }
0781 kfree(buf);
0782
0783 if (!ret)
0784 target_complete_cmd_with_length(cmd, SAM_STAT_GOOD, len);
0785 return ret;
0786 }
0787
0788 static int spc_modesense_rwrecovery(struct se_cmd *cmd, u8 pc, u8 *p)
0789 {
0790 p[0] = 0x01;
0791 p[1] = 0x0a;
0792
0793
0794 if (pc == 1)
0795 goto out;
0796
0797 out:
0798 return 12;
0799 }
0800
0801 static int spc_modesense_control(struct se_cmd *cmd, u8 pc, u8 *p)
0802 {
0803 struct se_device *dev = cmd->se_dev;
0804 struct se_session *sess = cmd->se_sess;
0805
0806 p[0] = 0x0a;
0807 p[1] = 0x0a;
0808
0809
0810 if (pc == 1)
0811 goto out;
0812
0813
0814 p[2] = (1 << 1);
0815 if (target_sense_desc_format(dev))
0816
0817 p[2] |= (1 << 2);
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847 p[3] = (dev->dev_attrib.emulate_rest_reord == 1) ? 0x00 : 0x10;
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877 switch (dev->dev_attrib.emulate_ua_intlck_ctrl) {
0878 case TARGET_UA_INTLCK_CTRL_ESTABLISH_UA:
0879 p[4] = 0x30;
0880 break;
0881 case TARGET_UA_INTLCK_CTRL_NO_CLEAR:
0882 p[4] = 0x20;
0883 break;
0884 default:
0885 p[4] = 0x00;
0886 break;
0887 }
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900 p[5] = (dev->dev_attrib.emulate_tas) ? 0x40 : 0x00;
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911 if (sess->sup_prot_ops & (TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS)) {
0912 if (dev->dev_attrib.pi_prot_type || sess->sess_prot_type)
0913 p[5] |= 0x80;
0914 }
0915
0916 p[8] = 0xff;
0917 p[9] = 0xff;
0918 p[11] = 30;
0919
0920 out:
0921 return 12;
0922 }
0923
0924 static int spc_modesense_caching(struct se_cmd *cmd, u8 pc, u8 *p)
0925 {
0926 struct se_device *dev = cmd->se_dev;
0927
0928 p[0] = 0x08;
0929 p[1] = 0x12;
0930
0931
0932 if (pc == 1)
0933 goto out;
0934
0935 if (target_check_wce(dev))
0936 p[2] = 0x04;
0937 p[12] = 0x20;
0938
0939 out:
0940 return 20;
0941 }
0942
0943 static int spc_modesense_informational_exceptions(struct se_cmd *cmd, u8 pc, unsigned char *p)
0944 {
0945 p[0] = 0x1c;
0946 p[1] = 0x0a;
0947
0948
0949 if (pc == 1)
0950 goto out;
0951
0952 out:
0953 return 12;
0954 }
0955
0956 static struct {
0957 uint8_t page;
0958 uint8_t subpage;
0959 int (*emulate)(struct se_cmd *, u8, unsigned char *);
0960 } modesense_handlers[] = {
0961 { .page = 0x01, .subpage = 0x00, .emulate = spc_modesense_rwrecovery },
0962 { .page = 0x08, .subpage = 0x00, .emulate = spc_modesense_caching },
0963 { .page = 0x0a, .subpage = 0x00, .emulate = spc_modesense_control },
0964 { .page = 0x1c, .subpage = 0x00, .emulate = spc_modesense_informational_exceptions },
0965 };
0966
0967 static void spc_modesense_write_protect(unsigned char *buf, int type)
0968 {
0969
0970
0971
0972
0973 switch (type) {
0974 case TYPE_DISK:
0975 case TYPE_TAPE:
0976 default:
0977 buf[0] |= 0x80;
0978 break;
0979 }
0980 }
0981
0982 static void spc_modesense_dpofua(unsigned char *buf, int type)
0983 {
0984 switch (type) {
0985 case TYPE_DISK:
0986 buf[0] |= 0x10;
0987 break;
0988 default:
0989 break;
0990 }
0991 }
0992
0993 static int spc_modesense_blockdesc(unsigned char *buf, u64 blocks, u32 block_size)
0994 {
0995 *buf++ = 8;
0996 put_unaligned_be32(min(blocks, 0xffffffffull), buf);
0997 buf += 4;
0998 put_unaligned_be32(block_size, buf);
0999 return 9;
1000 }
1001
1002 static int spc_modesense_long_blockdesc(unsigned char *buf, u64 blocks, u32 block_size)
1003 {
1004 if (blocks <= 0xffffffff)
1005 return spc_modesense_blockdesc(buf + 3, blocks, block_size) + 3;
1006
1007 *buf++ = 1;
1008 buf += 2;
1009 *buf++ = 16;
1010 put_unaligned_be64(blocks, buf);
1011 buf += 12;
1012 put_unaligned_be32(block_size, buf);
1013
1014 return 17;
1015 }
1016
1017 static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd)
1018 {
1019 struct se_device *dev = cmd->se_dev;
1020 char *cdb = cmd->t_task_cdb;
1021 unsigned char buf[SE_MODE_PAGE_BUF], *rbuf;
1022 int type = dev->transport->get_device_type(dev);
1023 int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10);
1024 bool dbd = !!(cdb[1] & 0x08);
1025 bool llba = ten ? !!(cdb[1] & 0x10) : false;
1026 u8 pc = cdb[2] >> 6;
1027 u8 page = cdb[2] & 0x3f;
1028 u8 subpage = cdb[3];
1029 int length = 0;
1030 int ret;
1031 int i;
1032
1033 memset(buf, 0, SE_MODE_PAGE_BUF);
1034
1035
1036
1037
1038
1039 length = ten ? 3 : 2;
1040
1041
1042 if (cmd->se_lun->lun_access_ro || target_lun_is_rdonly(cmd))
1043 spc_modesense_write_protect(&buf[length], type);
1044
1045
1046
1047
1048
1049
1050 if (target_check_fua(dev))
1051 spc_modesense_dpofua(&buf[length], type);
1052
1053 ++length;
1054
1055
1056
1057
1058
1059
1060
1061 if (!dbd && type == TYPE_DISK) {
1062 u64 blocks = dev->transport->get_blocks(dev);
1063 u32 block_size = dev->dev_attrib.block_size;
1064
1065 if (ten) {
1066 if (llba) {
1067 length += spc_modesense_long_blockdesc(&buf[length],
1068 blocks, block_size);
1069 } else {
1070 length += 3;
1071 length += spc_modesense_blockdesc(&buf[length],
1072 blocks, block_size);
1073 }
1074 } else {
1075 length += spc_modesense_blockdesc(&buf[length], blocks,
1076 block_size);
1077 }
1078 } else {
1079 if (ten)
1080 length += 4;
1081 else
1082 length += 1;
1083 }
1084
1085 if (page == 0x3f) {
1086 if (subpage != 0x00 && subpage != 0xff) {
1087 pr_warn("MODE_SENSE: Invalid subpage code: 0x%02x\n", subpage);
1088 return TCM_INVALID_CDB_FIELD;
1089 }
1090
1091 for (i = 0; i < ARRAY_SIZE(modesense_handlers); ++i) {
1092
1093
1094
1095
1096
1097
1098 if ((modesense_handlers[i].subpage & ~subpage) == 0) {
1099 ret = modesense_handlers[i].emulate(cmd, pc, &buf[length]);
1100 if (!ten && length + ret >= 255)
1101 break;
1102 length += ret;
1103 }
1104 }
1105
1106 goto set_length;
1107 }
1108
1109 for (i = 0; i < ARRAY_SIZE(modesense_handlers); ++i)
1110 if (modesense_handlers[i].page == page &&
1111 modesense_handlers[i].subpage == subpage) {
1112 length += modesense_handlers[i].emulate(cmd, pc, &buf[length]);
1113 goto set_length;
1114 }
1115
1116
1117
1118
1119
1120 if (page != 0x03)
1121 pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n",
1122 page, subpage);
1123
1124 return TCM_UNKNOWN_MODE_PAGE;
1125
1126 set_length:
1127 if (ten)
1128 put_unaligned_be16(length - 2, buf);
1129 else
1130 buf[0] = length - 1;
1131
1132 rbuf = transport_kmap_data_sg(cmd);
1133 if (rbuf) {
1134 memcpy(rbuf, buf, min_t(u32, SE_MODE_PAGE_BUF, cmd->data_length));
1135 transport_kunmap_data_sg(cmd);
1136 }
1137
1138 target_complete_cmd_with_length(cmd, SAM_STAT_GOOD, length);
1139 return 0;
1140 }
1141
1142 static sense_reason_t spc_emulate_modeselect(struct se_cmd *cmd)
1143 {
1144 char *cdb = cmd->t_task_cdb;
1145 bool ten = cdb[0] == MODE_SELECT_10;
1146 int off = ten ? 8 : 4;
1147 bool pf = !!(cdb[1] & 0x10);
1148 u8 page, subpage;
1149 unsigned char *buf;
1150 unsigned char tbuf[SE_MODE_PAGE_BUF];
1151 int length;
1152 sense_reason_t ret = 0;
1153 int i;
1154
1155 if (!cmd->data_length) {
1156 target_complete_cmd(cmd, SAM_STAT_GOOD);
1157 return 0;
1158 }
1159
1160 if (cmd->data_length < off + 2)
1161 return TCM_PARAMETER_LIST_LENGTH_ERROR;
1162
1163 buf = transport_kmap_data_sg(cmd);
1164 if (!buf)
1165 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1166
1167 if (!pf) {
1168 ret = TCM_INVALID_CDB_FIELD;
1169 goto out;
1170 }
1171
1172 page = buf[off] & 0x3f;
1173 subpage = buf[off] & 0x40 ? buf[off + 1] : 0;
1174
1175 for (i = 0; i < ARRAY_SIZE(modesense_handlers); ++i)
1176 if (modesense_handlers[i].page == page &&
1177 modesense_handlers[i].subpage == subpage) {
1178 memset(tbuf, 0, SE_MODE_PAGE_BUF);
1179 length = modesense_handlers[i].emulate(cmd, 0, tbuf);
1180 goto check_contents;
1181 }
1182
1183 ret = TCM_UNKNOWN_MODE_PAGE;
1184 goto out;
1185
1186 check_contents:
1187 if (cmd->data_length < off + length) {
1188 ret = TCM_PARAMETER_LIST_LENGTH_ERROR;
1189 goto out;
1190 }
1191
1192 if (memcmp(buf + off, tbuf, length))
1193 ret = TCM_INVALID_PARAMETER_LIST;
1194
1195 out:
1196 transport_kunmap_data_sg(cmd);
1197
1198 if (!ret)
1199 target_complete_cmd(cmd, SAM_STAT_GOOD);
1200 return ret;
1201 }
1202
1203 static sense_reason_t spc_emulate_request_sense(struct se_cmd *cmd)
1204 {
1205 unsigned char *cdb = cmd->t_task_cdb;
1206 unsigned char *rbuf;
1207 u8 ua_asc = 0, ua_ascq = 0;
1208 unsigned char buf[SE_SENSE_BUF];
1209 bool desc_format = target_sense_desc_format(cmd->se_dev);
1210
1211 memset(buf, 0, SE_SENSE_BUF);
1212
1213 if (cdb[1] & 0x01) {
1214 pr_err("REQUEST_SENSE description emulation not"
1215 " supported\n");
1216 return TCM_INVALID_CDB_FIELD;
1217 }
1218
1219 rbuf = transport_kmap_data_sg(cmd);
1220 if (!rbuf)
1221 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1222
1223 if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))
1224 scsi_build_sense_buffer(desc_format, buf, UNIT_ATTENTION,
1225 ua_asc, ua_ascq);
1226 else
1227 scsi_build_sense_buffer(desc_format, buf, NO_SENSE, 0x0, 0x0);
1228
1229 memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
1230 transport_kunmap_data_sg(cmd);
1231
1232 target_complete_cmd(cmd, SAM_STAT_GOOD);
1233 return 0;
1234 }
1235
1236 sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd)
1237 {
1238 struct se_dev_entry *deve;
1239 struct se_session *sess = cmd->se_sess;
1240 struct se_node_acl *nacl;
1241 struct scsi_lun slun;
1242 unsigned char *buf;
1243 u32 lun_count = 0, offset = 8;
1244 __be32 len;
1245
1246 buf = transport_kmap_data_sg(cmd);
1247 if (cmd->data_length && !buf)
1248 return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
1249
1250
1251
1252
1253
1254
1255 if (!sess)
1256 goto done;
1257
1258 nacl = sess->se_node_acl;
1259
1260 rcu_read_lock();
1261 hlist_for_each_entry_rcu(deve, &nacl->lun_entry_hlist, link) {
1262
1263
1264
1265
1266
1267 lun_count++;
1268 if (offset >= cmd->data_length)
1269 continue;
1270
1271 int_to_scsilun(deve->mapped_lun, &slun);
1272 memcpy(buf + offset, &slun,
1273 min(8u, cmd->data_length - offset));
1274 offset += 8;
1275 }
1276 rcu_read_unlock();
1277
1278
1279
1280
1281 done:
1282
1283
1284
1285 if (lun_count == 0) {
1286 int_to_scsilun(0, &slun);
1287 if (cmd->data_length > 8)
1288 memcpy(buf + offset, &slun,
1289 min(8u, cmd->data_length - offset));
1290 lun_count = 1;
1291 }
1292
1293 if (buf) {
1294 len = cpu_to_be32(lun_count * 8);
1295 memcpy(buf, &len, min_t(int, sizeof len, cmd->data_length));
1296 transport_kunmap_data_sg(cmd);
1297 }
1298
1299 target_complete_cmd_with_length(cmd, SAM_STAT_GOOD, 8 + lun_count * 8);
1300 return 0;
1301 }
1302 EXPORT_SYMBOL(spc_emulate_report_luns);
1303
1304 static sense_reason_t
1305 spc_emulate_testunitready(struct se_cmd *cmd)
1306 {
1307 target_complete_cmd(cmd, SAM_STAT_GOOD);
1308 return 0;
1309 }
1310
1311 sense_reason_t
1312 spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
1313 {
1314 struct se_device *dev = cmd->se_dev;
1315 unsigned char *cdb = cmd->t_task_cdb;
1316
1317 if (!dev->dev_attrib.emulate_pr &&
1318 ((cdb[0] == PERSISTENT_RESERVE_IN) ||
1319 (cdb[0] == PERSISTENT_RESERVE_OUT) ||
1320 (cdb[0] == RELEASE || cdb[0] == RELEASE_10) ||
1321 (cdb[0] == RESERVE || cdb[0] == RESERVE_10))) {
1322 return TCM_UNSUPPORTED_SCSI_OPCODE;
1323 }
1324
1325 switch (cdb[0]) {
1326 case MODE_SELECT:
1327 *size = cdb[4];
1328 cmd->execute_cmd = spc_emulate_modeselect;
1329 break;
1330 case MODE_SELECT_10:
1331 *size = get_unaligned_be16(&cdb[7]);
1332 cmd->execute_cmd = spc_emulate_modeselect;
1333 break;
1334 case MODE_SENSE:
1335 *size = cdb[4];
1336 cmd->execute_cmd = spc_emulate_modesense;
1337 break;
1338 case MODE_SENSE_10:
1339 *size = get_unaligned_be16(&cdb[7]);
1340 cmd->execute_cmd = spc_emulate_modesense;
1341 break;
1342 case LOG_SELECT:
1343 case LOG_SENSE:
1344 *size = get_unaligned_be16(&cdb[7]);
1345 break;
1346 case PERSISTENT_RESERVE_IN:
1347 *size = get_unaligned_be16(&cdb[7]);
1348 cmd->execute_cmd = target_scsi3_emulate_pr_in;
1349 break;
1350 case PERSISTENT_RESERVE_OUT:
1351 *size = get_unaligned_be32(&cdb[5]);
1352 cmd->execute_cmd = target_scsi3_emulate_pr_out;
1353 break;
1354 case RELEASE:
1355 case RELEASE_10:
1356 if (cdb[0] == RELEASE_10)
1357 *size = get_unaligned_be16(&cdb[7]);
1358 else
1359 *size = cmd->data_length;
1360
1361 cmd->execute_cmd = target_scsi2_reservation_release;
1362 break;
1363 case RESERVE:
1364 case RESERVE_10:
1365
1366
1367
1368
1369 if (cdb[0] == RESERVE_10)
1370 *size = get_unaligned_be16(&cdb[7]);
1371 else
1372 *size = cmd->data_length;
1373
1374 cmd->execute_cmd = target_scsi2_reservation_reserve;
1375 break;
1376 case REQUEST_SENSE:
1377 *size = cdb[4];
1378 cmd->execute_cmd = spc_emulate_request_sense;
1379 break;
1380 case INQUIRY:
1381 *size = get_unaligned_be16(&cdb[3]);
1382
1383
1384
1385
1386
1387 cmd->sam_task_attr = TCM_HEAD_TAG;
1388 cmd->execute_cmd = spc_emulate_inquiry;
1389 break;
1390 case SECURITY_PROTOCOL_IN:
1391 case SECURITY_PROTOCOL_OUT:
1392 *size = get_unaligned_be32(&cdb[6]);
1393 break;
1394 case EXTENDED_COPY:
1395 *size = get_unaligned_be32(&cdb[10]);
1396 cmd->execute_cmd = target_do_xcopy;
1397 break;
1398 case RECEIVE_COPY_RESULTS:
1399 *size = get_unaligned_be32(&cdb[10]);
1400 cmd->execute_cmd = target_do_receive_copy_results;
1401 break;
1402 case READ_ATTRIBUTE:
1403 case WRITE_ATTRIBUTE:
1404 *size = get_unaligned_be32(&cdb[10]);
1405 break;
1406 case RECEIVE_DIAGNOSTIC:
1407 case SEND_DIAGNOSTIC:
1408 *size = get_unaligned_be16(&cdb[3]);
1409 break;
1410 case WRITE_BUFFER:
1411 *size = get_unaligned_be24(&cdb[6]);
1412 break;
1413 case REPORT_LUNS:
1414 cmd->execute_cmd = spc_emulate_report_luns;
1415 *size = get_unaligned_be32(&cdb[6]);
1416
1417
1418
1419
1420 cmd->sam_task_attr = TCM_HEAD_TAG;
1421 break;
1422 case TEST_UNIT_READY:
1423 cmd->execute_cmd = spc_emulate_testunitready;
1424 *size = 0;
1425 break;
1426 case MAINTENANCE_IN:
1427 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
1428
1429
1430
1431
1432 if ((cdb[1] & 0x1f) == MI_REPORT_TARGET_PGS) {
1433 cmd->execute_cmd =
1434 target_emulate_report_target_port_groups;
1435 }
1436 *size = get_unaligned_be32(&cdb[6]);
1437 } else {
1438
1439
1440
1441 *size = get_unaligned_be16(&cdb[8]);
1442 }
1443 break;
1444 case MAINTENANCE_OUT:
1445 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
1446
1447
1448
1449
1450 if (cdb[1] == MO_SET_TARGET_PGS) {
1451 cmd->execute_cmd =
1452 target_emulate_set_target_port_groups;
1453 }
1454 *size = get_unaligned_be32(&cdb[6]);
1455 } else {
1456
1457
1458
1459 *size = get_unaligned_be16(&cdb[8]);
1460 }
1461 break;
1462 default:
1463 return TCM_UNSUPPORTED_SCSI_OPCODE;
1464 }
1465
1466 return 0;
1467 }
1468 EXPORT_SYMBOL(spc_parse_cdb);