aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_cdb.c
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2011-07-19 04:55:10 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-07-22 05:37:43 -0400
commite3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0 (patch)
tree2eb65e958a2cc35c896a0e184ec09edcb9076b3b /drivers/target/target_core_cdb.c
parenta8c6da90b823fb94ca76ca0df6bb44e6e205dc87 (diff)
target: Core cleanups from AGrover (round 1)
This patch contains the squashed version of a number of cleanups and minor fixes from Andy's initial series (round 1) for target core this past spring. The condensed log looks like: target: use errno values instead of returning -1 for everything target: Rename transport_calc_sg_num to transport_init_task_sg target: Fix leak in error path in transport_init_task_sg target/pscsi: Remove pscsi_get_sh() usage target: Make two runtime checks into WARN_ONs target: Remove hba queue depth and convert to spin_lock_irq usage target: dev->dev_status_queue_obj is unused target: Make struct se_queue_req.cmd type struct se_cmd * target: Remove __transport_get_qr_from_queue() target: Rename se_dev->g_se_dev_list to se_dev_node target: Remove struct se_global target: Simplify scsi mib index table code target: Make dev_queue_obj a member of se_device instead of a pointer target: remove extraneous returns at end of void functions target: Ensure transport_dump_vpd_ident_type returns null-terminated str target: Function pointers don't need to use '&' to be assigned target: Fix comment in __transport_execute_tasks() target: Misc style cleanups target: rename struct pr_reservation_template to pr_reservation target: Remove #defines that just perform indirection target: Inline transport_get_task_from_execute_queue() target: Minor header comment fixes Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_cdb.c')
-rw-r--r--drivers/target/target_core_cdb.c146
1 files changed, 73 insertions, 73 deletions
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c
index 7f19c8b7b84c..7d9ccf3aa9c3 100644
--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -64,8 +64,8 @@ target_fill_alua_data(struct se_port *port, unsigned char *buf)
64static int 64static int
65target_emulate_inquiry_std(struct se_cmd *cmd) 65target_emulate_inquiry_std(struct se_cmd *cmd)
66{ 66{
67 struct se_lun *lun = SE_LUN(cmd); 67 struct se_lun *lun = cmd->se_lun;
68 struct se_device *dev = SE_DEV(cmd); 68 struct se_device *dev = cmd->se_lun->lun_se_dev;
69 unsigned char *buf = cmd->t_task->t_task_buf; 69 unsigned char *buf = cmd->t_task->t_task_buf;
70 70
71 /* 71 /*
@@ -75,7 +75,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
75 if (cmd->data_length < 6) { 75 if (cmd->data_length < 6) {
76 printk(KERN_ERR "SCSI Inquiry payload length: %u" 76 printk(KERN_ERR "SCSI Inquiry payload length: %u"
77 " too small for EVPD=0\n", cmd->data_length); 77 " too small for EVPD=0\n", cmd->data_length);
78 return -1; 78 return -EINVAL;
79 } 79 }
80 80
81 buf[0] = dev->transport->get_device_type(dev); 81 buf[0] = dev->transport->get_device_type(dev);
@@ -86,7 +86,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
86 /* 86 /*
87 * Enable SCCS and TPGS fields for Emulated ALUA 87 * Enable SCCS and TPGS fields for Emulated ALUA
88 */ 88 */
89 if (T10_ALUA(dev->se_sub_dev)->alua_type == SPC3_ALUA_EMULATED) 89 if (dev->se_sub_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED)
90 target_fill_alua_data(lun->lun_sep, buf); 90 target_fill_alua_data(lun->lun_sep, buf);
91 91
92 if (cmd->data_length < 8) { 92 if (cmd->data_length < 8) {
@@ -107,9 +107,9 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
107 107
108 snprintf((unsigned char *)&buf[8], 8, "LIO-ORG"); 108 snprintf((unsigned char *)&buf[8], 8, "LIO-ORG");
109 snprintf((unsigned char *)&buf[16], 16, "%s", 109 snprintf((unsigned char *)&buf[16], 16, "%s",
110 &DEV_T10_WWN(dev)->model[0]); 110 &dev->se_sub_dev->t10_wwn.model[0]);
111 snprintf((unsigned char *)&buf[32], 4, "%s", 111 snprintf((unsigned char *)&buf[32], 4, "%s",
112 &DEV_T10_WWN(dev)->revision[0]); 112 &dev->se_sub_dev->t10_wwn.revision[0]);
113 buf[4] = 31; /* Set additional length to 31 */ 113 buf[4] = 31; /* Set additional length to 31 */
114 return 0; 114 return 0;
115} 115}
@@ -128,7 +128,7 @@ target_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf)
128 * Registered Extended LUN WWN has been set via ConfigFS 128 * Registered Extended LUN WWN has been set via ConfigFS
129 * during device creation/restart. 129 * during device creation/restart.
130 */ 130 */
131 if (SE_DEV(cmd)->se_sub_dev->su_dev_flags & 131 if (cmd->se_lun->lun_se_dev->se_sub_dev->su_dev_flags &
132 SDF_EMULATED_VPD_UNIT_SERIAL) { 132 SDF_EMULATED_VPD_UNIT_SERIAL) {
133 buf[3] = 3; 133 buf[3] = 3;
134 buf[5] = 0x80; 134 buf[5] = 0x80;
@@ -143,7 +143,7 @@ target_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf)
143static int 143static int
144target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf) 144target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
145{ 145{
146 struct se_device *dev = SE_DEV(cmd); 146 struct se_device *dev = cmd->se_lun->lun_se_dev;
147 u16 len = 0; 147 u16 len = 0;
148 148
149 buf[1] = 0x80; 149 buf[1] = 0x80;
@@ -152,7 +152,7 @@ target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
152 u32 unit_serial_len; 152 u32 unit_serial_len;
153 153
154 unit_serial_len = 154 unit_serial_len =
155 strlen(&DEV_T10_WWN(dev)->unit_serial[0]); 155 strlen(&dev->se_sub_dev->t10_wwn.unit_serial[0]);
156 unit_serial_len++; /* For NULL Terminator */ 156 unit_serial_len++; /* For NULL Terminator */
157 157
158 if (((len + 4) + unit_serial_len) > cmd->data_length) { 158 if (((len + 4) + unit_serial_len) > cmd->data_length) {
@@ -162,7 +162,7 @@ target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
162 return 0; 162 return 0;
163 } 163 }
164 len += sprintf((unsigned char *)&buf[4], "%s", 164 len += sprintf((unsigned char *)&buf[4], "%s",
165 &DEV_T10_WWN(dev)->unit_serial[0]); 165 &dev->se_sub_dev->t10_wwn.unit_serial[0]);
166 len++; /* Extra Byte for NULL Terminator */ 166 len++; /* Extra Byte for NULL Terminator */
167 buf[3] = len; 167 buf[3] = len;
168 } 168 }
@@ -176,15 +176,15 @@ target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
176static int 176static int
177target_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf) 177target_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
178{ 178{
179 struct se_device *dev = SE_DEV(cmd); 179 struct se_device *dev = cmd->se_lun->lun_se_dev;
180 struct se_lun *lun = SE_LUN(cmd); 180 struct se_lun *lun = cmd->se_lun;
181 struct se_port *port = NULL; 181 struct se_port *port = NULL;
182 struct se_portal_group *tpg = NULL; 182 struct se_portal_group *tpg = NULL;
183 struct t10_alua_lu_gp_member *lu_gp_mem; 183 struct t10_alua_lu_gp_member *lu_gp_mem;
184 struct t10_alua_tg_pt_gp *tg_pt_gp; 184 struct t10_alua_tg_pt_gp *tg_pt_gp;
185 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; 185 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
186 unsigned char binary, binary_new; 186 unsigned char binary, binary_new;
187 unsigned char *prod = &DEV_T10_WWN(dev)->model[0]; 187 unsigned char *prod = &dev->se_sub_dev->t10_wwn.model[0];
188 u32 prod_len; 188 u32 prod_len;
189 u32 unit_serial_len, off = 0; 189 u32 unit_serial_len, off = 0;
190 int i; 190 int i;
@@ -238,11 +238,11 @@ target_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
238 * VENDOR_SPECIFIC_IDENTIFIER_EXTENTION 238 * VENDOR_SPECIFIC_IDENTIFIER_EXTENTION
239 */ 239 */
240 binary = transport_asciihex_to_binaryhex( 240 binary = transport_asciihex_to_binaryhex(
241 &DEV_T10_WWN(dev)->unit_serial[0]); 241 &dev->se_sub_dev->t10_wwn.unit_serial[0]);
242 buf[off++] |= (binary & 0xf0) >> 4; 242 buf[off++] |= (binary & 0xf0) >> 4;
243 for (i = 0; i < 24; i += 2) { 243 for (i = 0; i < 24; i += 2) {
244 binary_new = transport_asciihex_to_binaryhex( 244 binary_new = transport_asciihex_to_binaryhex(
245 &DEV_T10_WWN(dev)->unit_serial[i+2]); 245 &dev->se_sub_dev->t10_wwn.unit_serial[i+2]);
246 buf[off] = (binary & 0x0f) << 4; 246 buf[off] = (binary & 0x0f) << 4;
247 buf[off++] |= (binary_new & 0xf0) >> 4; 247 buf[off++] |= (binary_new & 0xf0) >> 4;
248 binary = binary_new; 248 binary = binary_new;
@@ -263,7 +263,7 @@ check_t10_vend_desc:
263 if (dev->se_sub_dev->su_dev_flags & 263 if (dev->se_sub_dev->su_dev_flags &
264 SDF_EMULATED_VPD_UNIT_SERIAL) { 264 SDF_EMULATED_VPD_UNIT_SERIAL) {
265 unit_serial_len = 265 unit_serial_len =
266 strlen(&DEV_T10_WWN(dev)->unit_serial[0]); 266 strlen(&dev->se_sub_dev->t10_wwn.unit_serial[0]);
267 unit_serial_len++; /* For NULL Terminator */ 267 unit_serial_len++; /* For NULL Terminator */
268 268
269 if ((len + (id_len + 4) + 269 if ((len + (id_len + 4) +
@@ -274,7 +274,7 @@ check_t10_vend_desc:
274 } 274 }
275 id_len += sprintf((unsigned char *)&buf[off+12], 275 id_len += sprintf((unsigned char *)&buf[off+12],
276 "%s:%s", prod, 276 "%s:%s", prod,
277 &DEV_T10_WWN(dev)->unit_serial[0]); 277 &dev->se_sub_dev->t10_wwn.unit_serial[0]);
278 } 278 }
279 buf[off] = 0x2; /* ASCII */ 279 buf[off] = 0x2; /* ASCII */
280 buf[off+1] = 0x1; /* T10 Vendor ID */ 280 buf[off+1] = 0x1; /* T10 Vendor ID */
@@ -312,7 +312,7 @@ check_port:
312 goto check_tpgi; 312 goto check_tpgi;
313 } 313 }
314 buf[off] = 314 buf[off] =
315 (TPG_TFO(tpg)->get_fabric_proto_ident(tpg) << 4); 315 (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4);
316 buf[off++] |= 0x1; /* CODE SET == Binary */ 316 buf[off++] |= 0x1; /* CODE SET == Binary */
317 buf[off] = 0x80; /* Set PIV=1 */ 317 buf[off] = 0x80; /* Set PIV=1 */
318 /* Set ASSOICATION == target port: 01b */ 318 /* Set ASSOICATION == target port: 01b */
@@ -335,7 +335,7 @@ check_port:
335 * section 7.5.1 Table 362 335 * section 7.5.1 Table 362
336 */ 336 */
337check_tpgi: 337check_tpgi:
338 if (T10_ALUA(dev->se_sub_dev)->alua_type != 338 if (dev->se_sub_dev->t10_alua.alua_type !=
339 SPC3_ALUA_EMULATED) 339 SPC3_ALUA_EMULATED)
340 goto check_scsi_name; 340 goto check_scsi_name;
341 341
@@ -357,7 +357,7 @@ check_tpgi:
357 spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); 357 spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
358 358
359 buf[off] = 359 buf[off] =
360 (TPG_TFO(tpg)->get_fabric_proto_ident(tpg) << 4); 360 (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4);
361 buf[off++] |= 0x1; /* CODE SET == Binary */ 361 buf[off++] |= 0x1; /* CODE SET == Binary */
362 buf[off] = 0x80; /* Set PIV=1 */ 362 buf[off] = 0x80; /* Set PIV=1 */
363 /* Set ASSOICATION == target port: 01b */ 363 /* Set ASSOICATION == target port: 01b */
@@ -409,7 +409,7 @@ check_lu_gp:
409 * section 7.5.1 Table 362 409 * section 7.5.1 Table 362
410 */ 410 */
411check_scsi_name: 411check_scsi_name:
412 scsi_name_len = strlen(TPG_TFO(tpg)->tpg_get_wwn(tpg)); 412 scsi_name_len = strlen(tpg->se_tpg_tfo->tpg_get_wwn(tpg));
413 /* UTF-8 ",t,0x<16-bit TPGT>" + NULL Terminator */ 413 /* UTF-8 ",t,0x<16-bit TPGT>" + NULL Terminator */
414 scsi_name_len += 10; 414 scsi_name_len += 10;
415 /* Check for 4-byte padding */ 415 /* Check for 4-byte padding */
@@ -424,7 +424,7 @@ check_scsi_name:
424 goto set_len; 424 goto set_len;
425 } 425 }
426 buf[off] = 426 buf[off] =
427 (TPG_TFO(tpg)->get_fabric_proto_ident(tpg) << 4); 427 (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4);
428 buf[off++] |= 0x3; /* CODE SET == UTF-8 */ 428 buf[off++] |= 0x3; /* CODE SET == UTF-8 */
429 buf[off] = 0x80; /* Set PIV=1 */ 429 buf[off] = 0x80; /* Set PIV=1 */
430 /* Set ASSOICATION == target port: 01b */ 430 /* Set ASSOICATION == target port: 01b */
@@ -438,9 +438,9 @@ check_scsi_name:
438 * Target Port, this means "<iSCSI name>,t,0x<TPGT> in 438 * Target Port, this means "<iSCSI name>,t,0x<TPGT> in
439 * UTF-8 encoding. 439 * UTF-8 encoding.
440 */ 440 */
441 tpgt = TPG_TFO(tpg)->tpg_get_tag(tpg); 441 tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg);
442 scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x", 442 scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x",
443 TPG_TFO(tpg)->tpg_get_wwn(tpg), tpgt); 443 tpg->se_tpg_tfo->tpg_get_wwn(tpg), tpgt);
444 scsi_name_len += 1 /* Include NULL terminator */; 444 scsi_name_len += 1 /* Include NULL terminator */;
445 /* 445 /*
446 * The null-terminated, null-padded (see 4.4.2) SCSI 446 * The null-terminated, null-padded (see 4.4.2) SCSI
@@ -477,7 +477,7 @@ target_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf)
477 buf[5] = 0x07; 477 buf[5] = 0x07;
478 478
479 /* If WriteCache emulation is enabled, set V_SUP */ 479 /* If WriteCache emulation is enabled, set V_SUP */
480 if (DEV_ATTRIB(SE_DEV(cmd))->emulate_write_cache > 0) 480 if (cmd->se_lun->lun_se_dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0)
481 buf[6] = 0x01; 481 buf[6] = 0x01;
482 return 0; 482 return 0;
483} 483}
@@ -486,7 +486,7 @@ target_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf)
486static int 486static int
487target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) 487target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
488{ 488{
489 struct se_device *dev = SE_DEV(cmd); 489 struct se_device *dev = cmd->se_lun->lun_se_dev;
490 int have_tp = 0; 490 int have_tp = 0;
491 491
492 /* 492 /*
@@ -494,14 +494,14 @@ target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
494 * emulate_tpu=1 or emulate_tpws=1 we will be expect a 494 * emulate_tpu=1 or emulate_tpws=1 we will be expect a
495 * different page length for Thin Provisioning. 495 * different page length for Thin Provisioning.
496 */ 496 */
497 if (DEV_ATTRIB(dev)->emulate_tpu || DEV_ATTRIB(dev)->emulate_tpws) 497 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
498 have_tp = 1; 498 have_tp = 1;
499 499
500 if (cmd->data_length < (0x10 + 4)) { 500 if (cmd->data_length < (0x10 + 4)) {
501 printk(KERN_INFO "Received data_length: %u" 501 printk(KERN_INFO "Received data_length: %u"
502 " too small for EVPD 0xb0\n", 502 " too small for EVPD 0xb0\n",
503 cmd->data_length); 503 cmd->data_length);
504 return -1; 504 return -EINVAL;
505 } 505 }
506 506
507 if (have_tp && cmd->data_length < (0x3c + 4)) { 507 if (have_tp && cmd->data_length < (0x3c + 4)) {
@@ -523,12 +523,12 @@ target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
523 /* 523 /*
524 * Set MAXIMUM TRANSFER LENGTH 524 * Set MAXIMUM TRANSFER LENGTH
525 */ 525 */
526 put_unaligned_be32(DEV_ATTRIB(dev)->max_sectors, &buf[8]); 526 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_sectors, &buf[8]);
527 527
528 /* 528 /*
529 * Set OPTIMAL TRANSFER LENGTH 529 * Set OPTIMAL TRANSFER LENGTH
530 */ 530 */
531 put_unaligned_be32(DEV_ATTRIB(dev)->optimal_sectors, &buf[12]); 531 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.optimal_sectors, &buf[12]);
532 532
533 /* 533 /*
534 * Exit now if we don't support TP or the initiator sent a too 534 * Exit now if we don't support TP or the initiator sent a too
@@ -540,25 +540,25 @@ target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
540 /* 540 /*
541 * Set MAXIMUM UNMAP LBA COUNT 541 * Set MAXIMUM UNMAP LBA COUNT
542 */ 542 */
543 put_unaligned_be32(DEV_ATTRIB(dev)->max_unmap_lba_count, &buf[20]); 543 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count, &buf[20]);
544 544
545 /* 545 /*
546 * Set MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT 546 * Set MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT
547 */ 547 */
548 put_unaligned_be32(DEV_ATTRIB(dev)->max_unmap_block_desc_count, 548 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count,
549 &buf[24]); 549 &buf[24]);
550 550
551 /* 551 /*
552 * Set OPTIMAL UNMAP GRANULARITY 552 * Set OPTIMAL UNMAP GRANULARITY
553 */ 553 */
554 put_unaligned_be32(DEV_ATTRIB(dev)->unmap_granularity, &buf[28]); 554 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity, &buf[28]);
555 555
556 /* 556 /*
557 * UNMAP GRANULARITY ALIGNMENT 557 * UNMAP GRANULARITY ALIGNMENT
558 */ 558 */
559 put_unaligned_be32(DEV_ATTRIB(dev)->unmap_granularity_alignment, 559 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment,
560 &buf[32]); 560 &buf[32]);
561 if (DEV_ATTRIB(dev)->unmap_granularity_alignment != 0) 561 if (dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment != 0)
562 buf[32] |= 0x80; /* Set the UGAVALID bit */ 562 buf[32] |= 0x80; /* Set the UGAVALID bit */
563 563
564 return 0; 564 return 0;
@@ -568,7 +568,7 @@ target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
568static int 568static int
569target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf) 569target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
570{ 570{
571 struct se_device *dev = SE_DEV(cmd); 571 struct se_device *dev = cmd->se_lun->lun_se_dev;
572 572
573 /* 573 /*
574 * From sbc3r22 section 6.5.4 Thin Provisioning VPD page: 574 * From sbc3r22 section 6.5.4 Thin Provisioning VPD page:
@@ -602,7 +602,7 @@ target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
602 * the UNMAP command (see 5.25). A TPU bit set to zero indicates 602 * the UNMAP command (see 5.25). A TPU bit set to zero indicates
603 * that the device server does not support the UNMAP command. 603 * that the device server does not support the UNMAP command.
604 */ 604 */
605 if (DEV_ATTRIB(dev)->emulate_tpu != 0) 605 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu != 0)
606 buf[5] = 0x80; 606 buf[5] = 0x80;
607 607
608 /* 608 /*
@@ -611,7 +611,7 @@ target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
611 * A TPWS bit set to zero indicates that the device server does not 611 * A TPWS bit set to zero indicates that the device server does not
612 * support the use of the WRITE SAME (16) command to unmap LBAs. 612 * support the use of the WRITE SAME (16) command to unmap LBAs.
613 */ 613 */
614 if (DEV_ATTRIB(dev)->emulate_tpws != 0) 614 if (dev->se_sub_dev->se_dev_attrib.emulate_tpws != 0)
615 buf[5] |= 0x40; 615 buf[5] |= 0x40;
616 616
617 return 0; 617 return 0;
@@ -620,7 +620,7 @@ target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
620static int 620static int
621target_emulate_inquiry(struct se_cmd *cmd) 621target_emulate_inquiry(struct se_cmd *cmd)
622{ 622{
623 struct se_device *dev = SE_DEV(cmd); 623 struct se_device *dev = cmd->se_lun->lun_se_dev;
624 unsigned char *buf = cmd->t_task->t_task_buf; 624 unsigned char *buf = cmd->t_task->t_task_buf;
625 unsigned char *cdb = cmd->t_task->t_task_cdb; 625 unsigned char *cdb = cmd->t_task->t_task_cdb;
626 626
@@ -637,7 +637,7 @@ target_emulate_inquiry(struct se_cmd *cmd)
637 if (cmd->data_length < 4) { 637 if (cmd->data_length < 4) {
638 printk(KERN_ERR "SCSI Inquiry payload length: %u" 638 printk(KERN_ERR "SCSI Inquiry payload length: %u"
639 " too small for EVPD=1\n", cmd->data_length); 639 " too small for EVPD=1\n", cmd->data_length);
640 return -1; 640 return -EINVAL;
641 } 641 }
642 buf[0] = dev->transport->get_device_type(dev); 642 buf[0] = dev->transport->get_device_type(dev);
643 643
@@ -656,7 +656,7 @@ target_emulate_inquiry(struct se_cmd *cmd)
656 return target_emulate_evpd_b2(cmd, buf); 656 return target_emulate_evpd_b2(cmd, buf);
657 default: 657 default:
658 printk(KERN_ERR "Unknown VPD Code: 0x%02x\n", cdb[2]); 658 printk(KERN_ERR "Unknown VPD Code: 0x%02x\n", cdb[2]);
659 return -1; 659 return -EINVAL;
660 } 660 }
661 661
662 return 0; 662 return 0;
@@ -665,7 +665,7 @@ target_emulate_inquiry(struct se_cmd *cmd)
665static int 665static int
666target_emulate_readcapacity(struct se_cmd *cmd) 666target_emulate_readcapacity(struct se_cmd *cmd)
667{ 667{
668 struct se_device *dev = SE_DEV(cmd); 668 struct se_device *dev = cmd->se_lun->lun_se_dev;
669 unsigned char *buf = cmd->t_task->t_task_buf; 669 unsigned char *buf = cmd->t_task->t_task_buf;
670 unsigned long long blocks_long = dev->transport->get_blocks(dev); 670 unsigned long long blocks_long = dev->transport->get_blocks(dev);
671 u32 blocks; 671 u32 blocks;
@@ -679,14 +679,14 @@ target_emulate_readcapacity(struct se_cmd *cmd)
679 buf[1] = (blocks >> 16) & 0xff; 679 buf[1] = (blocks >> 16) & 0xff;
680 buf[2] = (blocks >> 8) & 0xff; 680 buf[2] = (blocks >> 8) & 0xff;
681 buf[3] = blocks & 0xff; 681 buf[3] = blocks & 0xff;
682 buf[4] = (DEV_ATTRIB(dev)->block_size >> 24) & 0xff; 682 buf[4] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff;
683 buf[5] = (DEV_ATTRIB(dev)->block_size >> 16) & 0xff; 683 buf[5] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff;
684 buf[6] = (DEV_ATTRIB(dev)->block_size >> 8) & 0xff; 684 buf[6] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff;
685 buf[7] = DEV_ATTRIB(dev)->block_size & 0xff; 685 buf[7] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff;
686 /* 686 /*
687 * Set max 32-bit blocks to signal SERVICE ACTION READ_CAPACITY_16 687 * Set max 32-bit blocks to signal SERVICE ACTION READ_CAPACITY_16
688 */ 688 */
689 if (DEV_ATTRIB(dev)->emulate_tpu || DEV_ATTRIB(dev)->emulate_tpws) 689 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
690 put_unaligned_be32(0xFFFFFFFF, &buf[0]); 690 put_unaligned_be32(0xFFFFFFFF, &buf[0]);
691 691
692 return 0; 692 return 0;
@@ -695,7 +695,7 @@ target_emulate_readcapacity(struct se_cmd *cmd)
695static int 695static int
696target_emulate_readcapacity_16(struct se_cmd *cmd) 696target_emulate_readcapacity_16(struct se_cmd *cmd)
697{ 697{
698 struct se_device *dev = SE_DEV(cmd); 698 struct se_device *dev = cmd->se_lun->lun_se_dev;
699 unsigned char *buf = cmd->t_task->t_task_buf; 699 unsigned char *buf = cmd->t_task->t_task_buf;
700 unsigned long long blocks = dev->transport->get_blocks(dev); 700 unsigned long long blocks = dev->transport->get_blocks(dev);
701 701
@@ -707,15 +707,15 @@ target_emulate_readcapacity_16(struct se_cmd *cmd)
707 buf[5] = (blocks >> 16) & 0xff; 707 buf[5] = (blocks >> 16) & 0xff;
708 buf[6] = (blocks >> 8) & 0xff; 708 buf[6] = (blocks >> 8) & 0xff;
709 buf[7] = blocks & 0xff; 709 buf[7] = blocks & 0xff;
710 buf[8] = (DEV_ATTRIB(dev)->block_size >> 24) & 0xff; 710 buf[8] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff;
711 buf[9] = (DEV_ATTRIB(dev)->block_size >> 16) & 0xff; 711 buf[9] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff;
712 buf[10] = (DEV_ATTRIB(dev)->block_size >> 8) & 0xff; 712 buf[10] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff;
713 buf[11] = DEV_ATTRIB(dev)->block_size & 0xff; 713 buf[11] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff;
714 /* 714 /*
715 * Set Thin Provisioning Enable bit following sbc3r22 in section 715 * Set Thin Provisioning Enable bit following sbc3r22 in section
716 * READ CAPACITY (16) byte 14 if emulate_tpu or emulate_tpws is enabled. 716 * READ CAPACITY (16) byte 14 if emulate_tpu or emulate_tpws is enabled.
717 */ 717 */
718 if (DEV_ATTRIB(dev)->emulate_tpu || DEV_ATTRIB(dev)->emulate_tpws) 718 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
719 buf[14] = 0x80; 719 buf[14] = 0x80;
720 720
721 return 0; 721 return 0;
@@ -765,8 +765,8 @@ target_modesense_control(struct se_device *dev, unsigned char *p)
765 * for a BUSY, TASK SET FULL, or RESERVATION CONFLICT status regardless 765 * for a BUSY, TASK SET FULL, or RESERVATION CONFLICT status regardless
766 * to the number of commands completed with one of those status codes. 766 * to the number of commands completed with one of those status codes.
767 */ 767 */
768 p[4] = (DEV_ATTRIB(dev)->emulate_ua_intlck_ctrl == 2) ? 0x30 : 768 p[4] = (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 2) ? 0x30 :
769 (DEV_ATTRIB(dev)->emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00; 769 (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00;
770 /* 770 /*
771 * From spc4r17, section 7.4.6 Control mode Page 771 * From spc4r17, section 7.4.6 Control mode Page
772 * 772 *
@@ -779,7 +779,7 @@ target_modesense_control(struct se_device *dev, unsigned char *p)
779 * which the command was received shall be completed with TASK ABORTED 779 * which the command was received shall be completed with TASK ABORTED
780 * status (see SAM-4). 780 * status (see SAM-4).
781 */ 781 */
782 p[5] = (DEV_ATTRIB(dev)->emulate_tas) ? 0x40 : 0x00; 782 p[5] = (dev->se_sub_dev->se_dev_attrib.emulate_tas) ? 0x40 : 0x00;
783 p[8] = 0xff; 783 p[8] = 0xff;
784 p[9] = 0xff; 784 p[9] = 0xff;
785 p[11] = 30; 785 p[11] = 30;
@@ -792,7 +792,7 @@ target_modesense_caching(struct se_device *dev, unsigned char *p)
792{ 792{
793 p[0] = 0x08; 793 p[0] = 0x08;
794 p[1] = 0x12; 794 p[1] = 0x12;
795 if (DEV_ATTRIB(dev)->emulate_write_cache > 0) 795 if (dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0)
796 p[2] = 0x04; /* Write Cache Enable */ 796 p[2] = 0x04; /* Write Cache Enable */
797 p[12] = 0x20; /* Disabled Read Ahead */ 797 p[12] = 0x20; /* Disabled Read Ahead */
798 798
@@ -830,7 +830,7 @@ target_modesense_dpofua(unsigned char *buf, int type)
830static int 830static int
831target_emulate_modesense(struct se_cmd *cmd, int ten) 831target_emulate_modesense(struct se_cmd *cmd, int ten)
832{ 832{
833 struct se_device *dev = SE_DEV(cmd); 833 struct se_device *dev = cmd->se_lun->lun_se_dev;
834 char *cdb = cmd->t_task->t_task_cdb; 834 char *cdb = cmd->t_task->t_task_cdb;
835 unsigned char *rbuf = cmd->t_task->t_task_buf; 835 unsigned char *rbuf = cmd->t_task->t_task_buf;
836 int type = dev->transport->get_device_type(dev); 836 int type = dev->transport->get_device_type(dev);
@@ -867,13 +867,13 @@ target_emulate_modesense(struct se_cmd *cmd, int ten)
867 buf[0] = (offset >> 8) & 0xff; 867 buf[0] = (offset >> 8) & 0xff;
868 buf[1] = offset & 0xff; 868 buf[1] = offset & 0xff;
869 869
870 if ((SE_LUN(cmd)->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || 870 if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) ||
871 (cmd->se_deve && 871 (cmd->se_deve &&
872 (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) 872 (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY)))
873 target_modesense_write_protect(&buf[3], type); 873 target_modesense_write_protect(&buf[3], type);
874 874
875 if ((DEV_ATTRIB(dev)->emulate_write_cache > 0) && 875 if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) &&
876 (DEV_ATTRIB(dev)->emulate_fua_write > 0)) 876 (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0))
877 target_modesense_dpofua(&buf[3], type); 877 target_modesense_dpofua(&buf[3], type);
878 878
879 if ((offset + 2) > cmd->data_length) 879 if ((offset + 2) > cmd->data_length)
@@ -883,13 +883,13 @@ target_emulate_modesense(struct se_cmd *cmd, int ten)
883 offset -= 1; 883 offset -= 1;
884 buf[0] = offset & 0xff; 884 buf[0] = offset & 0xff;
885 885
886 if ((SE_LUN(cmd)->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || 886 if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) ||
887 (cmd->se_deve && 887 (cmd->se_deve &&
888 (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) 888 (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY)))
889 target_modesense_write_protect(&buf[2], type); 889 target_modesense_write_protect(&buf[2], type);
890 890
891 if ((DEV_ATTRIB(dev)->emulate_write_cache > 0) && 891 if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) &&
892 (DEV_ATTRIB(dev)->emulate_fua_write > 0)) 892 (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0))
893 target_modesense_dpofua(&buf[2], type); 893 target_modesense_dpofua(&buf[2], type);
894 894
895 if ((offset + 1) > cmd->data_length) 895 if ((offset + 1) > cmd->data_length)
@@ -963,8 +963,8 @@ target_emulate_request_sense(struct se_cmd *cmd)
963static int 963static int
964target_emulate_unmap(struct se_task *task) 964target_emulate_unmap(struct se_task *task)
965{ 965{
966 struct se_cmd *cmd = TASK_CMD(task); 966 struct se_cmd *cmd = task->task_se_cmd;
967 struct se_device *dev = SE_DEV(cmd); 967 struct se_device *dev = cmd->se_lun->lun_se_dev;
968 unsigned char *buf = cmd->t_task->t_task_buf, *ptr = NULL; 968 unsigned char *buf = cmd->t_task->t_task_buf, *ptr = NULL;
969 unsigned char *cdb = &cmd->t_task->t_task_cdb[0]; 969 unsigned char *cdb = &cmd->t_task->t_task_cdb[0];
970 sector_t lba; 970 sector_t lba;
@@ -991,7 +991,7 @@ target_emulate_unmap(struct se_task *task)
991 if (ret < 0) { 991 if (ret < 0) {
992 printk(KERN_ERR "blkdev_issue_discard() failed: %d\n", 992 printk(KERN_ERR "blkdev_issue_discard() failed: %d\n",
993 ret); 993 ret);
994 return -1; 994 return ret;
995 } 995 }
996 996
997 ptr += 16; 997 ptr += 16;
@@ -1010,13 +1010,13 @@ target_emulate_unmap(struct se_task *task)
1010static int 1010static int
1011target_emulate_write_same(struct se_task *task) 1011target_emulate_write_same(struct se_task *task)
1012{ 1012{
1013 struct se_cmd *cmd = TASK_CMD(task); 1013 struct se_cmd *cmd = task->task_se_cmd;
1014 struct se_device *dev = SE_DEV(cmd); 1014 struct se_device *dev = cmd->se_lun->lun_se_dev;
1015 sector_t lba = cmd->t_task->t_task_lba; 1015 sector_t lba = cmd->t_task->t_task_lba;
1016 unsigned int range; 1016 unsigned int range;
1017 int ret; 1017 int ret;
1018 1018
1019 range = (cmd->data_length / DEV_ATTRIB(dev)->block_size); 1019 range = (cmd->data_length / dev->se_sub_dev->se_dev_attrib.block_size);
1020 1020
1021 printk(KERN_INFO "WRITE_SAME UNMAP: LBA: %llu Range: %u\n", 1021 printk(KERN_INFO "WRITE_SAME UNMAP: LBA: %llu Range: %u\n",
1022 (unsigned long long)lba, range); 1022 (unsigned long long)lba, range);
@@ -1024,7 +1024,7 @@ target_emulate_write_same(struct se_task *task)
1024 ret = dev->transport->do_discard(dev, lba, range); 1024 ret = dev->transport->do_discard(dev, lba, range);
1025 if (ret < 0) { 1025 if (ret < 0) {
1026 printk(KERN_INFO "blkdev_issue_discard() failed for WRITE_SAME\n"); 1026 printk(KERN_INFO "blkdev_issue_discard() failed for WRITE_SAME\n");
1027 return -1; 1027 return ret;
1028 } 1028 }
1029 1029
1030 task->task_scsi_status = GOOD; 1030 task->task_scsi_status = GOOD;
@@ -1035,8 +1035,8 @@ target_emulate_write_same(struct se_task *task)
1035int 1035int
1036transport_emulate_control_cdb(struct se_task *task) 1036transport_emulate_control_cdb(struct se_task *task)
1037{ 1037{
1038 struct se_cmd *cmd = TASK_CMD(task); 1038 struct se_cmd *cmd = task->task_se_cmd;
1039 struct se_device *dev = SE_DEV(cmd); 1039 struct se_device *dev = cmd->se_lun->lun_se_dev;
1040 unsigned short service_action; 1040 unsigned short service_action;
1041 int ret = 0; 1041 int ret = 0;
1042 1042