1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/kernel.h>
27#include <linux/module.h>
28#include <asm/unaligned.h>
29#include <scsi/scsi.h>
30
31#include <target/target_core_base.h>
32#include <target/target_core_transport.h>
33#include <target/target_core_fabric_ops.h>
34#include "target_core_ua.h"
35#include "target_core_cdb.h"
36
37static void
38target_fill_alua_data(struct se_port *port, unsigned char *buf)
39{
40 struct t10_alua_tg_pt_gp *tg_pt_gp;
41 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
42
43
44
45
46 buf[5] = 0x80;
47
48
49
50
51
52
53
54 if (!port)
55 return;
56 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
57 if (!tg_pt_gp_mem)
58 return;
59
60 spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
61 tg_pt_gp = tg_pt_gp_mem->tg_pt_gp;
62 if (tg_pt_gp)
63 buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type;
64 spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
65}
66
67static int
68target_emulate_inquiry_std(struct se_cmd *cmd)
69{
70 struct se_lun *lun = cmd->se_lun;
71 struct se_device *dev = cmd->se_dev;
72 struct se_portal_group *tpg = lun->lun_sep->sep_tpg;
73 unsigned char *buf;
74
75
76
77
78
79 if (cmd->data_length < 6) {
80 pr_err("SCSI Inquiry payload length: %u"
81 " too small for EVPD=0\n", cmd->data_length);
82 return -EINVAL;
83 }
84
85 buf = transport_kmap_data_sg(cmd);
86
87 if (dev == tpg->tpg_virt_lun0.lun_se_dev) {
88 buf[0] = 0x3f;
89 } else {
90 buf[0] = dev->transport->get_device_type(dev);
91 if (buf[0] == TYPE_TAPE)
92 buf[1] = 0x80;
93 }
94 buf[2] = dev->transport->get_device_rev(dev);
95
96
97
98
99
100
101
102
103
104
105
106 buf[3] = 2;
107
108
109
110
111 if (dev->se_sub_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED)
112 target_fill_alua_data(lun->lun_sep, buf);
113
114 if (cmd->data_length < 8) {
115 buf[4] = 1;
116 goto out;
117 }
118
119 buf[7] = 0x2;
120
121
122
123
124
125 if (cmd->data_length < 36) {
126 buf[4] = 3;
127 goto out;
128 }
129
130 memcpy(&buf[8], "LIO-ORG ", 8);
131 memset(&buf[16], 0x20, 16);
132 memcpy(&buf[16], dev->se_sub_dev->t10_wwn.model,
133 min_t(size_t, strlen(dev->se_sub_dev->t10_wwn.model), 16));
134 memcpy(&buf[32], dev->se_sub_dev->t10_wwn.revision,
135 min_t(size_t, strlen(dev->se_sub_dev->t10_wwn.revision), 4));
136 buf[4] = 31;
137
138out:
139 transport_kunmap_data_sg(cmd);
140 return 0;
141}
142
143
144static int
145target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf)
146{
147 struct se_device *dev = cmd->se_dev;
148 u16 len = 0;
149
150 if (dev->se_sub_dev->su_dev_flags &
151 SDF_EMULATED_VPD_UNIT_SERIAL) {
152 u32 unit_serial_len;
153
154 unit_serial_len =
155 strlen(&dev->se_sub_dev->t10_wwn.unit_serial[0]);
156 unit_serial_len++;
157
158 if (((len + 4) + unit_serial_len) > cmd->data_length) {
159 len += unit_serial_len;
160 buf[2] = ((len >> 8) & 0xff);
161 buf[3] = (len & 0xff);
162 return 0;
163 }
164 len += sprintf((unsigned char *)&buf[4], "%s",
165 &dev->se_sub_dev->t10_wwn.unit_serial[0]);
166 len++;
167 buf[3] = len;
168 }
169 return 0;
170}
171
172static void
173target_parse_naa_6h_vendor_specific(struct se_device *dev, unsigned char *buf)
174{
175 unsigned char *p = &dev->se_sub_dev->t10_wwn.unit_serial[0];
176 int cnt;
177 bool next = true;
178
179
180
181
182
183
184
185
186
187 for (cnt = 0; *p && cnt < 13; p++) {
188 int val = hex_to_bin(*p);
189
190 if (val < 0)
191 continue;
192
193 if (next) {
194 next = false;
195 buf[cnt++] |= val;
196 } else {
197 next = true;
198 buf[cnt] = val << 4;
199 }
200 }
201}
202
203
204
205
206
207static int
208target_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
209{
210 struct se_device *dev = cmd->se_dev;
211 struct se_lun *lun = cmd->se_lun;
212 struct se_port *port = NULL;
213 struct se_portal_group *tpg = NULL;
214 struct t10_alua_lu_gp_member *lu_gp_mem;
215 struct t10_alua_tg_pt_gp *tg_pt_gp;
216 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
217 unsigned char *prod = &dev->se_sub_dev->t10_wwn.model[0];
218 u32 prod_len;
219 u32 unit_serial_len, off = 0;
220 u16 len = 0, id_len;
221
222 off = 4;
223
224
225
226
227
228
229
230
231
232 if (!(dev->se_sub_dev->su_dev_flags & SDF_EMULATED_VPD_UNIT_SERIAL))
233 goto check_t10_vend_desc;
234
235 if (off + 20 > cmd->data_length)
236 goto check_t10_vend_desc;
237
238
239 buf[off++] = 0x1;
240
241
242 buf[off] = 0x00;
243
244
245 buf[off++] |= 0x3;
246 off++;
247
248
249 buf[off++] = 0x10;
250
251
252
253
254 buf[off++] = (0x6 << 4);
255
256
257
258
259 buf[off++] = 0x01;
260 buf[off++] = 0x40;
261 buf[off] = (0x5 << 4);
262
263
264
265
266
267
268 target_parse_naa_6h_vendor_specific(dev, &buf[off]);
269
270 len = 20;
271 off = (len + 4);
272
273check_t10_vend_desc:
274
275
276
277 id_len = 8;
278 prod_len = 4;
279 prod_len += 8;
280 prod_len += strlen(prod);
281 prod_len++;
282
283 if (dev->se_sub_dev->su_dev_flags &
284 SDF_EMULATED_VPD_UNIT_SERIAL) {
285 unit_serial_len =
286 strlen(&dev->se_sub_dev->t10_wwn.unit_serial[0]);
287 unit_serial_len++;
288
289 if ((len + (id_len + 4) +
290 (prod_len + unit_serial_len)) >
291 cmd->data_length) {
292 len += (prod_len + unit_serial_len);
293 goto check_port;
294 }
295 id_len += sprintf((unsigned char *)&buf[off+12],
296 "%s:%s", prod,
297 &dev->se_sub_dev->t10_wwn.unit_serial[0]);
298 }
299 buf[off] = 0x2;
300 buf[off+1] = 0x1;
301 buf[off+2] = 0x0;
302 memcpy((unsigned char *)&buf[off+4], "LIO-ORG", 8);
303
304 id_len++;
305
306 buf[off+3] = id_len;
307
308 len += (id_len + 4);
309 off += (id_len + 4);
310
311
312
313check_port:
314 port = lun->lun_sep;
315 if (port) {
316 struct t10_alua_lu_gp *lu_gp;
317 u32 padding, scsi_name_len;
318 u16 lu_gp_id = 0;
319 u16 tg_pt_gp_id = 0;
320 u16 tpgt;
321
322 tpg = port->sep_tpg;
323
324
325
326
327
328
329
330 if (((len + 4) + 8) > cmd->data_length) {
331 len += 8;
332 goto check_tpgi;
333 }
334 buf[off] =
335 (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4);
336 buf[off++] |= 0x1;
337 buf[off] = 0x80;
338
339 buf[off] |= 0x10;
340
341 buf[off++] |= 0x4;
342 off++;
343 buf[off++] = 4;
344
345
346 off += 2;
347 buf[off++] = ((port->sep_rtpi >> 8) & 0xff);
348 buf[off++] = (port->sep_rtpi & 0xff);
349 len += 8;
350
351
352
353
354
355
356
357check_tpgi:
358 if (dev->se_sub_dev->t10_alua.alua_type !=
359 SPC3_ALUA_EMULATED)
360 goto check_scsi_name;
361
362 if (((len + 4) + 8) > cmd->data_length) {
363 len += 8;
364 goto check_lu_gp;
365 }
366 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
367 if (!tg_pt_gp_mem)
368 goto check_lu_gp;
369
370 spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
371 tg_pt_gp = tg_pt_gp_mem->tg_pt_gp;
372 if (!tg_pt_gp) {
373 spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
374 goto check_lu_gp;
375 }
376 tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id;
377 spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
378
379 buf[off] =
380 (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4);
381 buf[off++] |= 0x1;
382 buf[off] = 0x80;
383
384 buf[off] |= 0x10;
385
386 buf[off++] |= 0x5;
387 off++;
388 buf[off++] = 4;
389 off += 2;
390 buf[off++] = ((tg_pt_gp_id >> 8) & 0xff);
391 buf[off++] = (tg_pt_gp_id & 0xff);
392 len += 8;
393
394
395
396
397check_lu_gp:
398 if (((len + 4) + 8) > cmd->data_length) {
399 len += 8;
400 goto check_scsi_name;
401 }
402 lu_gp_mem = dev->dev_alua_lu_gp_mem;
403 if (!lu_gp_mem)
404 goto check_scsi_name;
405
406 spin_lock(&lu_gp_mem->lu_gp_mem_lock);
407 lu_gp = lu_gp_mem->lu_gp;
408 if (!lu_gp) {
409 spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
410 goto check_scsi_name;
411 }
412 lu_gp_id = lu_gp->lu_gp_id;
413 spin_unlock(&lu_gp_mem->lu_gp_mem_lock);
414
415 buf[off++] |= 0x1;
416
417 buf[off++] |= 0x6;
418 off++;
419 buf[off++] = 4;
420 off += 2;
421 buf[off++] = ((lu_gp_id >> 8) & 0xff);
422 buf[off++] = (lu_gp_id & 0xff);
423 len += 8;
424
425
426
427
428
429
430
431check_scsi_name:
432 scsi_name_len = strlen(tpg->se_tpg_tfo->tpg_get_wwn(tpg));
433
434 scsi_name_len += 10;
435
436 padding = ((-scsi_name_len) & 3);
437 if (padding != 0)
438 scsi_name_len += padding;
439
440 scsi_name_len += 4;
441
442 if (((len + 4) + scsi_name_len) > cmd->data_length) {
443 len += scsi_name_len;
444 goto set_len;
445 }
446 buf[off] =
447 (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4);
448 buf[off++] |= 0x3;
449 buf[off] = 0x80;
450
451 buf[off] |= 0x10;
452
453 buf[off++] |= 0x8;
454 off += 2;
455
456
457
458
459
460
461 tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg);
462 scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x",
463 tpg->se_tpg_tfo->tpg_get_wwn(tpg), tpgt);
464 scsi_name_len += 1 ;
465
466
467
468
469
470
471
472
473 if (padding)
474 scsi_name_len += padding;
475
476 buf[off-1] = scsi_name_len;
477 off += scsi_name_len;
478
479 len += (scsi_name_len + 4);
480 }
481set_len:
482 buf[2] = ((len >> 8) & 0xff);
483 buf[3] = (len & 0xff);
484 return 0;
485}
486
487
488static int
489target_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf)
490{
491 if (cmd->data_length < 60)
492 return 0;
493
494 buf[3] = 0x3c;
495
496 buf[5] = 0x07;
497
498
499 if (cmd->se_dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0)
500 buf[6] = 0x01;
501 return 0;
502}
503
504
505static int
506target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf)
507{
508 struct se_device *dev = cmd->se_dev;
509 int have_tp = 0;
510
511
512
513
514
515
516 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
517 have_tp = 1;
518
519 if (cmd->data_length < (0x10 + 4)) {
520 pr_debug("Received data_length: %u"
521 " too small for EVPD 0xb0\n",
522 cmd->data_length);
523 return -EINVAL;
524 }
525
526 if (have_tp && cmd->data_length < (0x3c + 4)) {
527 pr_debug("Received data_length: %u"
528 " too small for TPE=1 EVPD 0xb0\n",
529 cmd->data_length);
530 have_tp = 0;
531 }
532
533 buf[0] = dev->transport->get_device_type(dev);
534 buf[3] = have_tp ? 0x3c : 0x10;
535
536
537 buf[4] = 0x01;
538
539
540
541
542 put_unaligned_be16(1, &buf[6]);
543
544
545
546
547 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_sectors, &buf[8]);
548
549
550
551
552 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.optimal_sectors, &buf[12]);
553
554
555
556
557
558 if (!have_tp || cmd->data_length < (0x3c + 4))
559 return 0;
560
561
562
563
564 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count, &buf[20]);
565
566
567
568
569 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count,
570 &buf[24]);
571
572
573
574
575 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity, &buf[28]);
576
577
578
579
580 put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment,
581 &buf[32]);
582 if (dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment != 0)
583 buf[32] |= 0x80;
584
585 return 0;
586}
587
588
589static int
590target_emulate_evpd_b1(struct se_cmd *cmd, unsigned char *buf)
591{
592 struct se_device *dev = cmd->se_dev;
593
594 buf[0] = dev->transport->get_device_type(dev);
595 buf[3] = 0x3c;
596
597 if (cmd->data_length >= 5 &&
598 dev->se_sub_dev->se_dev_attrib.is_nonrot)
599 buf[5] = 1;
600
601 return 0;
602}
603
604
605static int
606target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf)
607{
608 struct se_device *dev = cmd->se_dev;
609
610
611
612
613
614
615
616
617
618 buf[0] = dev->transport->get_device_type(dev);
619
620
621
622
623 put_unaligned_be16(0x0004, &buf[2]);
624
625
626
627
628
629
630
631
632
633
634 buf[4] = 0x00;
635
636
637
638
639
640
641 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu != 0)
642 buf[5] = 0x80;
643
644
645
646
647
648
649
650 if (dev->se_sub_dev->se_dev_attrib.emulate_tpws != 0)
651 buf[5] |= 0x40;
652
653 return 0;
654}
655
656static int
657target_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf);
658
659static struct {
660 uint8_t page;
661 int (*emulate)(struct se_cmd *, unsigned char *);
662} evpd_handlers[] = {
663 { .page = 0x00, .emulate = target_emulate_evpd_00 },
664 { .page = 0x80, .emulate = target_emulate_evpd_80 },
665 { .page = 0x83, .emulate = target_emulate_evpd_83 },
666 { .page = 0x86, .emulate = target_emulate_evpd_86 },
667 { .page = 0xb0, .emulate = target_emulate_evpd_b0 },
668 { .page = 0xb1, .emulate = target_emulate_evpd_b1 },
669 { .page = 0xb2, .emulate = target_emulate_evpd_b2 },
670};
671
672
673static int
674target_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf)
675{
676 int p;
677
678 if (cmd->data_length < 8)
679 return 0;
680
681
682
683
684
685 if (cmd->se_dev->se_sub_dev->su_dev_flags &
686 SDF_EMULATED_VPD_UNIT_SERIAL) {
687 buf[3] = ARRAY_SIZE(evpd_handlers);
688 for (p = 0; p < min_t(int, ARRAY_SIZE(evpd_handlers),
689 cmd->data_length - 4); ++p)
690 buf[p + 4] = evpd_handlers[p].page;
691 }
692
693 return 0;
694}
695
696int target_emulate_inquiry(struct se_task *task)
697{
698 struct se_cmd *cmd = task->task_se_cmd;
699 struct se_device *dev = cmd->se_dev;
700 unsigned char *buf;
701 unsigned char *cdb = cmd->t_task_cdb;
702 int p, ret;
703
704 if (!(cdb[1] & 0x1)) {
705 if (cdb[2]) {
706 pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n",
707 cdb[2]);
708 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
709 return -EINVAL;
710 }
711
712 ret = target_emulate_inquiry_std(cmd);
713 goto out;
714 }
715
716
717
718
719
720
721
722
723 if (cmd->data_length < 4) {
724 pr_err("SCSI Inquiry payload length: %u"
725 " too small for EVPD=1\n", cmd->data_length);
726 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
727 return -EINVAL;
728 }
729
730 buf = transport_kmap_data_sg(cmd);
731
732 buf[0] = dev->transport->get_device_type(dev);
733
734 for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) {
735 if (cdb[2] == evpd_handlers[p].page) {
736 buf[1] = cdb[2];
737 ret = evpd_handlers[p].emulate(cmd, buf);
738 goto out_unmap;
739 }
740 }
741
742 pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]);
743 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
744 ret = -EINVAL;
745
746out_unmap:
747 transport_kunmap_data_sg(cmd);
748out:
749 if (!ret) {
750 task->task_scsi_status = GOOD;
751 transport_complete_task(task, 1);
752 }
753 return ret;
754}
755
756int target_emulate_readcapacity(struct se_task *task)
757{
758 struct se_cmd *cmd = task->task_se_cmd;
759 struct se_device *dev = cmd->se_dev;
760 unsigned char *buf;
761 unsigned long long blocks_long = dev->transport->get_blocks(dev);
762 u32 blocks;
763
764 if (blocks_long >= 0x00000000ffffffff)
765 blocks = 0xffffffff;
766 else
767 blocks = (u32)blocks_long;
768
769 buf = transport_kmap_data_sg(cmd);
770
771 buf[0] = (blocks >> 24) & 0xff;
772 buf[1] = (blocks >> 16) & 0xff;
773 buf[2] = (blocks >> 8) & 0xff;
774 buf[3] = blocks & 0xff;
775 buf[4] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff;
776 buf[5] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff;
777 buf[6] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff;
778 buf[7] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff;
779
780
781
782 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
783 put_unaligned_be32(0xFFFFFFFF, &buf[0]);
784
785 transport_kunmap_data_sg(cmd);
786
787 task->task_scsi_status = GOOD;
788 transport_complete_task(task, 1);
789 return 0;
790}
791
792int target_emulate_readcapacity_16(struct se_task *task)
793{
794 struct se_cmd *cmd = task->task_se_cmd;
795 struct se_device *dev = cmd->se_dev;
796 unsigned char *buf;
797 unsigned long long blocks = dev->transport->get_blocks(dev);
798
799 buf = transport_kmap_data_sg(cmd);
800
801 buf[0] = (blocks >> 56) & 0xff;
802 buf[1] = (blocks >> 48) & 0xff;
803 buf[2] = (blocks >> 40) & 0xff;
804 buf[3] = (blocks >> 32) & 0xff;
805 buf[4] = (blocks >> 24) & 0xff;
806 buf[5] = (blocks >> 16) & 0xff;
807 buf[6] = (blocks >> 8) & 0xff;
808 buf[7] = blocks & 0xff;
809 buf[8] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff;
810 buf[9] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff;
811 buf[10] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff;
812 buf[11] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff;
813
814
815
816
817 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
818 buf[14] = 0x80;
819
820 transport_kunmap_data_sg(cmd);
821
822 task->task_scsi_status = GOOD;
823 transport_complete_task(task, 1);
824 return 0;
825}
826
827static int
828target_modesense_rwrecovery(unsigned char *p)
829{
830 p[0] = 0x01;
831 p[1] = 0x0a;
832
833 return 12;
834}
835
836static int
837target_modesense_control(struct se_device *dev, unsigned char *p)
838{
839 p[0] = 0x0a;
840 p[1] = 0x0a;
841 p[2] = 2;
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870 p[3] = (dev->se_sub_dev->se_dev_attrib.emulate_rest_reord == 1) ? 0x00 : 0x10;
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900 p[4] = (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 2) ? 0x30 :
901 (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00;
902
903
904
905
906
907
908
909
910
911
912
913
914 p[5] = (dev->se_sub_dev->se_dev_attrib.emulate_tas) ? 0x40 : 0x00;
915 p[8] = 0xff;
916 p[9] = 0xff;
917 p[11] = 30;
918
919 return 12;
920}
921
922static int
923target_modesense_caching(struct se_device *dev, unsigned char *p)
924{
925 p[0] = 0x08;
926 p[1] = 0x12;
927 if (dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0)
928 p[2] = 0x04;
929 p[12] = 0x20;
930
931 return 20;
932}
933
934static void
935target_modesense_write_protect(unsigned char *buf, int type)
936{
937
938
939
940
941 switch (type) {
942 case TYPE_DISK:
943 case TYPE_TAPE:
944 default:
945 buf[0] |= 0x80;
946 break;
947 }
948}
949
950static void
951target_modesense_dpofua(unsigned char *buf, int type)
952{
953 switch (type) {
954 case TYPE_DISK:
955 buf[0] |= 0x10;
956 break;
957 default:
958 break;
959 }
960}
961
962int target_emulate_modesense(struct se_task *task)
963{
964 struct se_cmd *cmd = task->task_se_cmd;
965 struct se_device *dev = cmd->se_dev;
966 char *cdb = cmd->t_task_cdb;
967 unsigned char *rbuf;
968 int type = dev->transport->get_device_type(dev);
969 int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10);
970 int offset = ten ? 8 : 4;
971 int length = 0;
972 unsigned char buf[SE_MODE_PAGE_BUF];
973
974 memset(buf, 0, SE_MODE_PAGE_BUF);
975
976 switch (cdb[2] & 0x3f) {
977 case 0x01:
978 length = target_modesense_rwrecovery(&buf[offset]);
979 break;
980 case 0x08:
981 length = target_modesense_caching(dev, &buf[offset]);
982 break;
983 case 0x0a:
984 length = target_modesense_control(dev, &buf[offset]);
985 break;
986 case 0x3f:
987 length = target_modesense_rwrecovery(&buf[offset]);
988 length += target_modesense_caching(dev, &buf[offset+length]);
989 length += target_modesense_control(dev, &buf[offset+length]);
990 break;
991 default:
992 pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n",
993 cdb[2] & 0x3f, cdb[3]);
994 cmd->scsi_sense_reason = TCM_UNKNOWN_MODE_PAGE;
995 return -EINVAL;
996 }
997 offset += length;
998
999 if (ten) {
1000 offset -= 2;
1001 buf[0] = (offset >> 8) & 0xff;
1002 buf[1] = offset & 0xff;
1003
1004 if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) ||
1005 (cmd->se_deve &&
1006 (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY)))
1007 target_modesense_write_protect(&buf[3], type);
1008
1009 if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) &&
1010 (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0))
1011 target_modesense_dpofua(&buf[3], type);
1012
1013 if ((offset + 2) > cmd->data_length)
1014 offset = cmd->data_length;
1015
1016 } else {
1017 offset -= 1;
1018 buf[0] = offset & 0xff;
1019
1020 if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) ||
1021 (cmd->se_deve &&
1022 (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY)))
1023 target_modesense_write_protect(&buf[2], type);
1024
1025 if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) &&
1026 (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0))
1027 target_modesense_dpofua(&buf[2], type);
1028
1029 if ((offset + 1) > cmd->data_length)
1030 offset = cmd->data_length;
1031 }
1032
1033 rbuf = transport_kmap_data_sg(cmd);
1034 memcpy(rbuf, buf, offset);
1035 transport_kunmap_data_sg(cmd);
1036
1037 task->task_scsi_status = GOOD;
1038 transport_complete_task(task, 1);
1039 return 0;
1040}
1041
1042int target_emulate_request_sense(struct se_task *task)
1043{
1044 struct se_cmd *cmd = task->task_se_cmd;
1045 unsigned char *cdb = cmd->t_task_cdb;
1046 unsigned char *buf;
1047 u8 ua_asc = 0, ua_ascq = 0;
1048 int err = 0;
1049
1050 if (cdb[1] & 0x01) {
1051 pr_err("REQUEST_SENSE description emulation not"
1052 " supported\n");
1053 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
1054 return -ENOSYS;
1055 }
1056
1057 buf = transport_kmap_data_sg(cmd);
1058
1059 if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) {
1060
1061
1062
1063 buf[0] = 0x70;
1064 buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION;
1065
1066
1067
1068
1069 if (cmd->data_length <= 18) {
1070 buf[7] = 0x00;
1071 err = -EINVAL;
1072 goto end;
1073 }
1074
1075
1076
1077 buf[SPC_ASC_KEY_OFFSET] = ua_asc;
1078 buf[SPC_ASCQ_KEY_OFFSET] = ua_ascq;
1079 buf[7] = 0x0A;
1080 } else {
1081
1082
1083
1084 buf[0] = 0x70;
1085 buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE;
1086
1087
1088
1089
1090 if (cmd->data_length <= 18) {
1091 buf[7] = 0x00;
1092 err = -EINVAL;
1093 goto end;
1094 }
1095
1096
1097
1098 buf[SPC_ASC_KEY_OFFSET] = 0x00;
1099 buf[7] = 0x0A;
1100 }
1101
1102end:
1103 transport_kunmap_data_sg(cmd);
1104 task->task_scsi_status = GOOD;
1105 transport_complete_task(task, 1);
1106 return 0;
1107}
1108
1109
1110
1111
1112
1113int target_emulate_unmap(struct se_task *task)
1114{
1115 struct se_cmd *cmd = task->task_se_cmd;
1116 struct se_device *dev = cmd->se_dev;
1117 unsigned char *buf, *ptr = NULL;
1118 sector_t lba;
1119 int size = cmd->data_length;
1120 u32 range;
1121 int ret = 0;
1122 int dl, bd_dl;
1123
1124 if (!dev->transport->do_discard) {
1125 pr_err("UNMAP emulation not supported for: %s\n",
1126 dev->transport->name);
1127 cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
1128 return -ENOSYS;
1129 }
1130
1131 buf = transport_kmap_data_sg(cmd);
1132
1133 dl = get_unaligned_be16(&buf[0]);
1134 bd_dl = get_unaligned_be16(&buf[2]);
1135
1136 size = min(size - 8, bd_dl);
1137 if (size / 16 > dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count) {
1138 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1139 ret = -EINVAL;
1140 goto err;
1141 }
1142
1143
1144 ptr = &buf[8];
1145 pr_debug("UNMAP: Sub: %s Using dl: %u bd_dl: %u size: %u"
1146 " ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr);
1147
1148 while (size >= 16) {
1149 lba = get_unaligned_be64(&ptr[0]);
1150 range = get_unaligned_be32(&ptr[8]);
1151 pr_debug("UNMAP: Using lba: %llu and range: %u\n",
1152 (unsigned long long)lba, range);
1153
1154 if (range > dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count) {
1155 cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
1156 ret = -EINVAL;
1157 goto err;
1158 }
1159
1160 if (lba + range > dev->transport->get_blocks(dev) + 1) {
1161 cmd->scsi_sense_reason = TCM_ADDRESS_OUT_OF_RANGE;
1162 ret = -EINVAL;
1163 goto err;
1164 }
1165
1166 ret = dev->transport->do_discard(dev, lba, range);
1167 if (ret < 0) {
1168 pr_err("blkdev_issue_discard() failed: %d\n",
1169 ret);
1170 goto err;
1171 }
1172
1173 ptr += 16;
1174 size -= 16;
1175 }
1176
1177err:
1178 transport_kunmap_data_sg(cmd);
1179 if (!ret) {
1180 task->task_scsi_status = GOOD;
1181 transport_complete_task(task, 1);
1182 }
1183 return ret;
1184}
1185
1186
1187
1188
1189
1190int target_emulate_write_same(struct se_task *task)
1191{
1192 struct se_cmd *cmd = task->task_se_cmd;
1193 struct se_device *dev = cmd->se_dev;
1194 sector_t range;
1195 sector_t lba = cmd->t_task_lba;
1196 u32 num_blocks;
1197 int ret;
1198
1199 if (!dev->transport->do_discard) {
1200 pr_err("WRITE_SAME emulation not supported"
1201 " for: %s\n", dev->transport->name);
1202 cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
1203 return -ENOSYS;
1204 }
1205
1206 if (cmd->t_task_cdb[0] == WRITE_SAME)
1207 num_blocks = get_unaligned_be16(&cmd->t_task_cdb[7]);
1208 else if (cmd->t_task_cdb[0] == WRITE_SAME_16)
1209 num_blocks = get_unaligned_be32(&cmd->t_task_cdb[10]);
1210 else
1211 num_blocks = get_unaligned_be32(&cmd->t_task_cdb[28]);
1212
1213
1214
1215
1216
1217 if (num_blocks != 0)
1218 range = num_blocks;
1219 else
1220 range = (dev->transport->get_blocks(dev) - lba) + 1;
1221
1222 pr_debug("WRITE_SAME UNMAP: LBA: %llu Range: %llu\n",
1223 (unsigned long long)lba, (unsigned long long)range);
1224
1225 ret = dev->transport->do_discard(dev, lba, range);
1226 if (ret < 0) {
1227 pr_debug("blkdev_issue_discard() failed for WRITE_SAME\n");
1228 return ret;
1229 }
1230
1231 task->task_scsi_status = GOOD;
1232 transport_complete_task(task, 1);
1233 return 0;
1234}
1235
1236int target_emulate_synchronize_cache(struct se_task *task)
1237{
1238 struct se_device *dev = task->task_se_cmd->se_dev;
1239 struct se_cmd *cmd = task->task_se_cmd;
1240
1241 if (!dev->transport->do_sync_cache) {
1242 pr_err("SYNCHRONIZE_CACHE emulation not supported"
1243 " for: %s\n", dev->transport->name);
1244 cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
1245 return -ENOSYS;
1246 }
1247
1248 dev->transport->do_sync_cache(task);
1249 return 0;
1250}
1251
1252int target_emulate_noop(struct se_task *task)
1253{
1254 task->task_scsi_status = GOOD;
1255 transport_complete_task(task, 1);
1256 return 0;
1257}
1258
1259
1260
1261
1262
1263void target_get_task_cdb(struct se_task *task, unsigned char *cdb)
1264{
1265 struct se_cmd *cmd = task->task_se_cmd;
1266 unsigned int cdb_len = scsi_command_size(cmd->t_task_cdb);
1267
1268 memcpy(cdb, cmd->t_task_cdb, cdb_len);
1269 if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) {
1270 unsigned long long lba = task->task_lba;
1271 u32 sectors = task->task_sectors;
1272
1273 switch (cdb_len) {
1274 case 6:
1275
1276 cdb[1] = (lba >> 16) & 0x1f;
1277 cdb[2] = (lba >> 8) & 0xff;
1278 cdb[3] = lba & 0xff;
1279 cdb[4] = sectors & 0xff;
1280 break;
1281 case 10:
1282
1283 put_unaligned_be32(lba, &cdb[2]);
1284 put_unaligned_be16(sectors, &cdb[7]);
1285 break;
1286 case 12:
1287
1288 put_unaligned_be32(lba, &cdb[2]);
1289 put_unaligned_be32(sectors, &cdb[6]);
1290 break;
1291 case 16:
1292
1293 put_unaligned_be64(lba, &cdb[2]);
1294 put_unaligned_be32(sectors, &cdb[10]);
1295 break;
1296 case 32:
1297
1298 put_unaligned_be64(lba, &cdb[12]);
1299 put_unaligned_be32(sectors, &cdb[28]);
1300 break;
1301 default:
1302 BUG();
1303 }
1304 }
1305}
1306EXPORT_SYMBOL(target_get_task_cdb);
1307