diff options
author | Andy Grover <agrover@redhat.com> | 2011-07-19 04:55:10 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-07-22 05:37:43 -0400 |
commit | e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0 (patch) | |
tree | 2eb65e958a2cc35c896a0e184ec09edcb9076b3b /drivers/target/target_core_cdb.c | |
parent | a8c6da90b823fb94ca76ca0df6bb44e6e205dc87 (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.c | 146 |
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) | |||
64 | static int | 64 | static int |
65 | target_emulate_inquiry_std(struct se_cmd *cmd) | 65 | target_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) | |||
143 | static int | 143 | static int |
144 | target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf) | 144 | target_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) | |||
176 | static int | 176 | static int |
177 | target_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf) | 177 | target_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 | */ |
337 | check_tpgi: | 337 | check_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 | */ |
411 | check_scsi_name: | 411 | check_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) | |||
486 | static int | 486 | static int |
487 | target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | 487 | target_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) | |||
568 | static int | 568 | static int |
569 | target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf) | 569 | target_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) | |||
620 | static int | 620 | static int |
621 | target_emulate_inquiry(struct se_cmd *cmd) | 621 | target_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) | |||
665 | static int | 665 | static int |
666 | target_emulate_readcapacity(struct se_cmd *cmd) | 666 | target_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) | |||
695 | static int | 695 | static int |
696 | target_emulate_readcapacity_16(struct se_cmd *cmd) | 696 | target_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) | |||
830 | static int | 830 | static int |
831 | target_emulate_modesense(struct se_cmd *cmd, int ten) | 831 | target_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) | |||
963 | static int | 963 | static int |
964 | target_emulate_unmap(struct se_task *task) | 964 | target_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) | |||
1010 | static int | 1010 | static int |
1011 | target_emulate_write_same(struct se_task *task) | 1011 | target_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) | |||
1035 | int | 1035 | int |
1036 | transport_emulate_control_cdb(struct se_task *task) | 1036 | transport_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 | ||