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
27
28
29
30
31
32
33
34
35
36
37
38
39
40#include <linux/module.h>
41#include <linux/moduleparam.h>
42#include <linux/kernel.h>
43#include <linux/timer.h>
44#include <linux/string.h>
45#include <linux/slab.h>
46#include <linux/blkdev.h>
47#include <linux/delay.h>
48#include <linux/init.h>
49#include <linux/completion.h>
50#include <linux/unistd.h>
51#include <linux/spinlock.h>
52#include <linux/kmod.h>
53#include <linux/interrupt.h>
54#include <linux/notifier.h>
55#include <linux/cpu.h>
56#include <linux/mutex.h>
57#include <linux/async.h>
58#include <asm/unaligned.h>
59
60#include <scsi/scsi.h>
61#include <scsi/scsi_cmnd.h>
62#include <scsi/scsi_dbg.h>
63#include <scsi/scsi_device.h>
64#include <scsi/scsi_driver.h>
65#include <scsi/scsi_eh.h>
66#include <scsi/scsi_host.h>
67#include <scsi/scsi_tcq.h>
68
69#include "scsi_priv.h"
70#include "scsi_logging.h"
71
72#define CREATE_TRACE_POINTS
73#include <trace/events/scsi.h>
74
75static void scsi_done(struct scsi_cmnd *cmd);
76
77
78
79
80
81#define MIN_RESET_DELAY (2*HZ)
82
83
84#define MIN_RESET_PERIOD (15*HZ)
85
86
87
88
89
90unsigned int scsi_logging_level;
91#if defined(CONFIG_SCSI_LOGGING)
92EXPORT_SYMBOL(scsi_logging_level);
93#endif
94
95
96ASYNC_DOMAIN(scsi_sd_probe_domain);
97EXPORT_SYMBOL(scsi_sd_probe_domain);
98
99
100
101
102
103static const char *const scsi_device_types[] = {
104 "Direct-Access ",
105 "Sequential-Access",
106 "Printer ",
107 "Processor ",
108 "WORM ",
109 "CD-ROM ",
110 "Scanner ",
111 "Optical Device ",
112 "Medium Changer ",
113 "Communications ",
114 "ASC IT8 ",
115 "ASC IT8 ",
116 "RAID ",
117 "Enclosure ",
118 "Direct-Access-RBC",
119 "Optical card ",
120 "Bridge controller",
121 "Object storage ",
122 "Automation/Drive ",
123};
124
125
126
127
128
129
130const char * scsi_device_type(unsigned type)
131{
132 if (type == 0x1e)
133 return "Well-known LUN ";
134 if (type == 0x1f)
135 return "No Device ";
136 if (type >= ARRAY_SIZE(scsi_device_types))
137 return "Unknown ";
138 return scsi_device_types[type];
139}
140
141EXPORT_SYMBOL(scsi_device_type);
142
143struct scsi_host_cmd_pool {
144 struct kmem_cache *cmd_slab;
145 struct kmem_cache *sense_slab;
146 unsigned int users;
147 char *cmd_name;
148 char *sense_name;
149 unsigned int slab_flags;
150 gfp_t gfp_mask;
151};
152
153static struct scsi_host_cmd_pool scsi_cmd_pool = {
154 .cmd_name = "scsi_cmd_cache",
155 .sense_name = "scsi_sense_cache",
156 .slab_flags = SLAB_HWCACHE_ALIGN,
157};
158
159static struct scsi_host_cmd_pool scsi_cmd_dma_pool = {
160 .cmd_name = "scsi_cmd_cache(DMA)",
161 .sense_name = "scsi_sense_cache(DMA)",
162 .slab_flags = SLAB_HWCACHE_ALIGN|SLAB_CACHE_DMA,
163 .gfp_mask = __GFP_DMA,
164};
165
166static DEFINE_MUTEX(host_cmd_pool_mutex);
167
168
169
170
171
172
173
174
175
176static struct scsi_cmnd *
177scsi_pool_alloc_command(struct scsi_host_cmd_pool *pool, gfp_t gfp_mask)
178{
179 struct scsi_cmnd *cmd;
180
181 cmd = kmem_cache_zalloc(pool->cmd_slab, gfp_mask | pool->gfp_mask);
182 if (!cmd)
183 return NULL;
184
185 cmd->sense_buffer = kmem_cache_alloc(pool->sense_slab,
186 gfp_mask | pool->gfp_mask);
187 if (!cmd->sense_buffer) {
188 kmem_cache_free(pool->cmd_slab, cmd);
189 return NULL;
190 }
191
192 return cmd;
193}
194
195
196
197
198
199
200
201
202
203static void
204scsi_pool_free_command(struct scsi_host_cmd_pool *pool,
205 struct scsi_cmnd *cmd)
206{
207 if (cmd->prot_sdb)
208 kmem_cache_free(scsi_sdb_cache, cmd->prot_sdb);
209
210 kmem_cache_free(pool->sense_slab, cmd->sense_buffer);
211 kmem_cache_free(pool->cmd_slab, cmd);
212}
213
214
215
216
217
218
219
220
221
222static struct scsi_cmnd *
223scsi_host_alloc_command(struct Scsi_Host *shost, gfp_t gfp_mask)
224{
225 struct scsi_cmnd *cmd;
226
227 cmd = scsi_pool_alloc_command(shost->cmd_pool, gfp_mask);
228 if (!cmd)
229 return NULL;
230
231 if (scsi_host_get_prot(shost) >= SHOST_DIX_TYPE0_PROTECTION) {
232 cmd->prot_sdb = kmem_cache_zalloc(scsi_sdb_cache, gfp_mask);
233
234 if (!cmd->prot_sdb) {
235 scsi_pool_free_command(shost->cmd_pool, cmd);
236 return NULL;
237 }
238 }
239
240 return cmd;
241}
242
243
244
245
246
247
248
249
250
251struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
252{
253 struct scsi_cmnd *cmd = scsi_host_alloc_command(shost, gfp_mask);
254
255 if (unlikely(!cmd)) {
256 unsigned long flags;
257
258 spin_lock_irqsave(&shost->free_list_lock, flags);
259 if (likely(!list_empty(&shost->free_list))) {
260 cmd = list_entry(shost->free_list.next,
261 struct scsi_cmnd, list);
262 list_del_init(&cmd->list);
263 }
264 spin_unlock_irqrestore(&shost->free_list_lock, flags);
265
266 if (cmd) {
267 void *buf, *prot;
268
269 buf = cmd->sense_buffer;
270 prot = cmd->prot_sdb;
271
272 memset(cmd, 0, sizeof(*cmd));
273
274 cmd->sense_buffer = buf;
275 cmd->prot_sdb = prot;
276 }
277 }
278
279 return cmd;
280}
281EXPORT_SYMBOL_GPL(__scsi_get_command);
282
283
284
285
286
287
288
289
290struct scsi_cmnd *scsi_get_command(struct scsi_device *dev, gfp_t gfp_mask)
291{
292 struct scsi_cmnd *cmd;
293
294
295 if (!get_device(&dev->sdev_gendev))
296 return NULL;
297
298 cmd = __scsi_get_command(dev->host, gfp_mask);
299
300 if (likely(cmd != NULL)) {
301 unsigned long flags;
302
303 cmd->device = dev;
304 INIT_LIST_HEAD(&cmd->list);
305 spin_lock_irqsave(&dev->list_lock, flags);
306 list_add_tail(&cmd->list, &dev->cmd_list);
307 spin_unlock_irqrestore(&dev->list_lock, flags);
308 cmd->jiffies_at_alloc = jiffies;
309 } else
310 put_device(&dev->sdev_gendev);
311
312 return cmd;
313}
314EXPORT_SYMBOL(scsi_get_command);
315
316
317
318
319
320
321
322void __scsi_put_command(struct Scsi_Host *shost, struct scsi_cmnd *cmd,
323 struct device *dev)
324{
325 unsigned long flags;
326
327
328 spin_lock_irqsave(&shost->free_list_lock, flags);
329 if (unlikely(list_empty(&shost->free_list))) {
330 list_add(&cmd->list, &shost->free_list);
331 cmd = NULL;
332 }
333 spin_unlock_irqrestore(&shost->free_list_lock, flags);
334
335 if (likely(cmd != NULL))
336 scsi_pool_free_command(shost->cmd_pool, cmd);
337
338 put_device(dev);
339}
340EXPORT_SYMBOL(__scsi_put_command);
341
342
343
344
345
346
347
348
349
350void scsi_put_command(struct scsi_cmnd *cmd)
351{
352 struct scsi_device *sdev = cmd->device;
353 unsigned long flags;
354
355
356 spin_lock_irqsave(&cmd->device->list_lock, flags);
357 BUG_ON(list_empty(&cmd->list));
358 list_del_init(&cmd->list);
359 spin_unlock_irqrestore(&cmd->device->list_lock, flags);
360
361 __scsi_put_command(cmd->device->host, cmd, &sdev->sdev_gendev);
362}
363EXPORT_SYMBOL(scsi_put_command);
364
365static struct scsi_host_cmd_pool *scsi_get_host_cmd_pool(gfp_t gfp_mask)
366{
367 struct scsi_host_cmd_pool *retval = NULL, *pool;
368
369
370
371
372 mutex_lock(&host_cmd_pool_mutex);
373 pool = (gfp_mask & __GFP_DMA) ? &scsi_cmd_dma_pool :
374 &scsi_cmd_pool;
375 if (!pool->users) {
376 pool->cmd_slab = kmem_cache_create(pool->cmd_name,
377 sizeof(struct scsi_cmnd), 0,
378 pool->slab_flags, NULL);
379 if (!pool->cmd_slab)
380 goto fail;
381
382 pool->sense_slab = kmem_cache_create(pool->sense_name,
383 SCSI_SENSE_BUFFERSIZE, 0,
384 pool->slab_flags, NULL);
385 if (!pool->sense_slab) {
386 kmem_cache_destroy(pool->cmd_slab);
387 goto fail;
388 }
389 }
390
391 pool->users++;
392 retval = pool;
393 fail:
394 mutex_unlock(&host_cmd_pool_mutex);
395 return retval;
396}
397
398static void scsi_put_host_cmd_pool(gfp_t gfp_mask)
399{
400 struct scsi_host_cmd_pool *pool;
401
402 mutex_lock(&host_cmd_pool_mutex);
403 pool = (gfp_mask & __GFP_DMA) ? &scsi_cmd_dma_pool :
404 &scsi_cmd_pool;
405
406
407
408
409
410 BUG_ON(pool->users == 0);
411
412 if (!--pool->users) {
413 kmem_cache_destroy(pool->cmd_slab);
414 kmem_cache_destroy(pool->sense_slab);
415 }
416 mutex_unlock(&host_cmd_pool_mutex);
417}
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432struct scsi_cmnd *scsi_allocate_command(gfp_t gfp_mask)
433{
434 struct scsi_host_cmd_pool *pool = scsi_get_host_cmd_pool(gfp_mask);
435
436 if (!pool)
437 return NULL;
438
439 return scsi_pool_alloc_command(pool, gfp_mask);
440}
441EXPORT_SYMBOL(scsi_allocate_command);
442
443
444
445
446
447
448
449
450
451
452void scsi_free_command(gfp_t gfp_mask, struct scsi_cmnd *cmd)
453{
454 struct scsi_host_cmd_pool *pool = scsi_get_host_cmd_pool(gfp_mask);
455
456
457
458
459
460
461
462 BUG_ON(!pool);
463
464 scsi_pool_free_command(pool, cmd);
465
466
467
468
469
470 scsi_put_host_cmd_pool(gfp_mask);
471 scsi_put_host_cmd_pool(gfp_mask);
472}
473EXPORT_SYMBOL(scsi_free_command);
474
475
476
477
478
479
480
481
482
483
484
485int scsi_setup_command_freelist(struct Scsi_Host *shost)
486{
487 struct scsi_cmnd *cmd;
488 const gfp_t gfp_mask = shost->unchecked_isa_dma ? GFP_DMA : GFP_KERNEL;
489
490 spin_lock_init(&shost->free_list_lock);
491 INIT_LIST_HEAD(&shost->free_list);
492
493 shost->cmd_pool = scsi_get_host_cmd_pool(gfp_mask);
494
495 if (!shost->cmd_pool)
496 return -ENOMEM;
497
498
499
500
501 cmd = scsi_host_alloc_command(shost, gfp_mask);
502 if (!cmd) {
503 scsi_put_host_cmd_pool(gfp_mask);
504 shost->cmd_pool = NULL;
505 return -ENOMEM;
506 }
507 list_add(&cmd->list, &shost->free_list);
508 return 0;
509}
510
511
512
513
514
515void scsi_destroy_command_freelist(struct Scsi_Host *shost)
516{
517
518
519
520
521 if (!shost->cmd_pool)
522 return;
523
524 while (!list_empty(&shost->free_list)) {
525 struct scsi_cmnd *cmd;
526
527 cmd = list_entry(shost->free_list.next, struct scsi_cmnd, list);
528 list_del_init(&cmd->list);
529 scsi_pool_free_command(shost->cmd_pool, cmd);
530 }
531 shost->cmd_pool = NULL;
532 scsi_put_host_cmd_pool(shost->unchecked_isa_dma ? GFP_DMA : GFP_KERNEL);
533}
534
535#ifdef CONFIG_SCSI_LOGGING
536void scsi_log_send(struct scsi_cmnd *cmd)
537{
538 unsigned int level;
539
540
541
542
543
544
545
546
547
548
549
550
551 if (unlikely(scsi_logging_level)) {
552 level = SCSI_LOG_LEVEL(SCSI_LOG_MLQUEUE_SHIFT,
553 SCSI_LOG_MLQUEUE_BITS);
554 if (level > 1) {
555 scmd_printk(KERN_INFO, cmd, "Send: ");
556 if (level > 2)
557 printk("0x%p ", cmd);
558 printk("\n");
559 scsi_print_command(cmd);
560 if (level > 3) {
561 printk(KERN_INFO "buffer = 0x%p, bufflen = %d,"
562 " queuecommand 0x%p\n",
563 scsi_sglist(cmd), scsi_bufflen(cmd),
564 cmd->device->host->hostt->queuecommand);
565
566 }
567 }
568 }
569}
570
571void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
572{
573 unsigned int level;
574
575
576
577
578
579
580
581
582
583
584
585
586
587 if (unlikely(scsi_logging_level)) {
588 level = SCSI_LOG_LEVEL(SCSI_LOG_MLCOMPLETE_SHIFT,
589 SCSI_LOG_MLCOMPLETE_BITS);
590 if (((level > 0) && (cmd->result || disposition != SUCCESS)) ||
591 (level > 1)) {
592 scmd_printk(KERN_INFO, cmd, "Done: ");
593 if (level > 2)
594 printk("0x%p ", cmd);
595
596
597
598
599 switch (disposition) {
600 case SUCCESS:
601 printk("SUCCESS\n");
602 break;
603 case NEEDS_RETRY:
604 printk("RETRY\n");
605 break;
606 case ADD_TO_MLQUEUE:
607 printk("MLQUEUE\n");
608 break;
609 case FAILED:
610 printk("FAILED\n");
611 break;
612 case TIMEOUT_ERROR:
613
614
615
616 printk("TIMEOUT\n");
617 break;
618 default:
619 printk("UNKNOWN\n");
620 }
621 scsi_print_result(cmd);
622 scsi_print_command(cmd);
623 if (status_byte(cmd->result) & CHECK_CONDITION)
624 scsi_print_sense("", cmd);
625 if (level > 3)
626 scmd_printk(KERN_INFO, cmd,
627 "scsi host busy %d failed %d\n",
628 cmd->device->host->host_busy,
629 cmd->device->host->host_failed);
630 }
631 }
632}
633#endif
634
635
636
637
638
639
640
641
642
643void scsi_cmd_get_serial(struct Scsi_Host *host, struct scsi_cmnd *cmd)
644{
645 cmd->serial_number = host->cmd_serial_number++;
646 if (cmd->serial_number == 0)
647 cmd->serial_number = host->cmd_serial_number++;
648}
649EXPORT_SYMBOL(scsi_cmd_get_serial);
650
651
652
653
654
655
656
657
658int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
659{
660 struct Scsi_Host *host = cmd->device->host;
661 unsigned long timeout;
662 int rtn = 0;
663
664 atomic_inc(&cmd->device->iorequest_cnt);
665
666
667 if (unlikely(cmd->device->sdev_state == SDEV_DEL)) {
668
669
670
671 cmd->result = DID_NO_CONNECT << 16;
672 scsi_done(cmd);
673
674 goto out;
675 }
676
677
678 if (unlikely(scsi_device_blocked(cmd->device))) {
679
680
681
682
683
684
685
686
687 scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
688
689 SCSI_LOG_MLQUEUE(3, printk("queuecommand : device blocked \n"));
690
691
692
693
694
695 goto out;
696 }
697
698
699
700
701 if (cmd->device->scsi_level <= SCSI_2 &&
702 cmd->device->scsi_level != SCSI_UNKNOWN) {
703 cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) |
704 (cmd->device->lun << 5 & 0xe0);
705 }
706
707
708
709
710
711 timeout = host->last_reset + MIN_RESET_DELAY;
712
713 if (host->resetting && time_before(jiffies, timeout)) {
714 int ticks_remaining = timeout - jiffies;
715
716
717
718
719
720
721
722
723
724 while (--ticks_remaining >= 0)
725 mdelay(1 + 999 / HZ);
726 host->resetting = 0;
727 }
728
729 scsi_log_send(cmd);
730
731
732
733
734
735 if (cmd->cmd_len > cmd->device->host->max_cmd_len) {
736 SCSI_LOG_MLQUEUE(3,
737 printk("queuecommand : command too long. "
738 "cdb_size=%d host->max_cmd_len=%d\n",
739 cmd->cmd_len, cmd->device->host->max_cmd_len));
740 cmd->result = (DID_ABORT << 16);
741
742 scsi_done(cmd);
743 goto out;
744 }
745
746 if (unlikely(host->shost_state == SHOST_DEL)) {
747 cmd->result = (DID_NO_CONNECT << 16);
748 scsi_done(cmd);
749 } else {
750 trace_scsi_dispatch_cmd_start(cmd);
751 cmd->scsi_done = scsi_done;
752 rtn = host->hostt->queuecommand(host, cmd);
753 }
754
755 if (rtn) {
756 trace_scsi_dispatch_cmd_error(cmd, rtn);
757 if (rtn != SCSI_MLQUEUE_DEVICE_BUSY &&
758 rtn != SCSI_MLQUEUE_TARGET_BUSY)
759 rtn = SCSI_MLQUEUE_HOST_BUSY;
760
761 scsi_queue_insert(cmd, rtn);
762
763 SCSI_LOG_MLQUEUE(3,
764 printk("queuecommand : request rejected\n"));
765 }
766
767 out:
768 SCSI_LOG_MLQUEUE(3, printk("leaving scsi_dispatch_cmnd()\n"));
769 return rtn;
770}
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785static void scsi_done(struct scsi_cmnd *cmd)
786{
787 trace_scsi_dispatch_cmd_done(cmd);
788 blk_complete_request(cmd->request);
789}
790
791
792
793
794
795
796
797
798
799void scsi_finish_command(struct scsi_cmnd *cmd)
800{
801 struct scsi_device *sdev = cmd->device;
802 struct scsi_target *starget = scsi_target(sdev);
803 struct Scsi_Host *shost = sdev->host;
804 struct scsi_driver *drv;
805 unsigned int good_bytes;
806
807 scsi_device_unbusy(sdev);
808
809
810
811
812
813
814
815
816
817 shost->host_blocked = 0;
818 starget->target_blocked = 0;
819 sdev->device_blocked = 0;
820
821
822
823
824
825 if (SCSI_SENSE_VALID(cmd))
826 cmd->result |= (DRIVER_SENSE << 24);
827
828 SCSI_LOG_MLCOMPLETE(4, sdev_printk(KERN_INFO, sdev,
829 "Notifying upper driver of completion "
830 "(result %x)\n", cmd->result));
831
832 good_bytes = scsi_bufflen(cmd);
833 if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) {
834 int old_good_bytes = good_bytes;
835 drv = scsi_cmd_to_driver(cmd);
836 if (drv->done)
837 good_bytes = drv->done(cmd);
838
839
840
841
842
843
844 if (good_bytes == old_good_bytes)
845 good_bytes -= scsi_get_resid(cmd);
846 }
847 scsi_io_completion(cmd, good_bytes);
848}
849EXPORT_SYMBOL(scsi_finish_command);
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869void scsi_adjust_queue_depth(struct scsi_device *sdev, int tagged, int tags)
870{
871 unsigned long flags;
872
873
874
875
876 if (tags <= 0)
877 return;
878
879 spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
880
881
882
883
884
885
886
887
888
889
890 if (!sdev->host->bqt) {
891 if (blk_queue_tagged(sdev->request_queue) &&
892 blk_queue_resize_tags(sdev->request_queue, tags) != 0)
893 goto out;
894 }
895
896 sdev->queue_depth = tags;
897 switch (tagged) {
898 case MSG_ORDERED_TAG:
899 sdev->ordered_tags = 1;
900 sdev->simple_tags = 1;
901 break;
902 case MSG_SIMPLE_TAG:
903 sdev->ordered_tags = 0;
904 sdev->simple_tags = 1;
905 break;
906 default:
907 sdev_printk(KERN_WARNING, sdev,
908 "scsi_adjust_queue_depth, bad queue type, "
909 "disabled\n");
910 case 0:
911 sdev->ordered_tags = sdev->simple_tags = 0;
912 sdev->queue_depth = tags;
913 break;
914 }
915 out:
916 spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
917}
918EXPORT_SYMBOL(scsi_adjust_queue_depth);
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939int scsi_track_queue_full(struct scsi_device *sdev, int depth)
940{
941
942
943
944
945
946
947 if ((jiffies >> 4) == (sdev->last_queue_full_time >> 4))
948 return 0;
949
950 sdev->last_queue_full_time = jiffies;
951 if (sdev->last_queue_full_depth != depth) {
952 sdev->last_queue_full_count = 1;
953 sdev->last_queue_full_depth = depth;
954 } else {
955 sdev->last_queue_full_count++;
956 }
957
958 if (sdev->last_queue_full_count <= 10)
959 return 0;
960 if (sdev->last_queue_full_depth < 8) {
961
962 scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
963 return -1;
964 }
965
966 if (sdev->ordered_tags)
967 scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, depth);
968 else
969 scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, depth);
970 return depth;
971}
972EXPORT_SYMBOL(scsi_track_queue_full);
973
974
975
976
977
978
979
980
981
982
983
984
985
986static int scsi_vpd_inquiry(struct scsi_device *sdev, unsigned char *buffer,
987 u8 page, unsigned len)
988{
989 int result;
990 unsigned char cmd[16];
991
992 cmd[0] = INQUIRY;
993 cmd[1] = 1;
994 cmd[2] = page;
995 cmd[3] = len >> 8;
996 cmd[4] = len & 0xff;
997 cmd[5] = 0;
998
999
1000
1001
1002
1003 result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer,
1004 len, NULL, 30 * HZ, 3, NULL);
1005 if (result)
1006 return result;
1007
1008
1009 if (buffer[1] != page)
1010 return -EIO;
1011
1012 return 0;
1013}
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
1030 int buf_len)
1031{
1032 int i, result;
1033
1034
1035 result = scsi_vpd_inquiry(sdev, buf, 0, buf_len);
1036 if (result)
1037 goto fail;
1038
1039
1040 if (page == 0)
1041 return 0;
1042
1043 for (i = 0; i < min((int)buf[3], buf_len - 4); i++)
1044 if (buf[i + 4] == page)
1045 goto found;
1046
1047 if (i < buf[3] && i >= buf_len - 4)
1048
1049 goto found;
1050
1051 goto fail;
1052
1053 found:
1054 result = scsi_vpd_inquiry(sdev, buf, page, buf_len);
1055 if (result)
1056 goto fail;
1057
1058 return 0;
1059
1060 fail:
1061 return -EINVAL;
1062}
1063EXPORT_SYMBOL_GPL(scsi_get_vpd_page);
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer,
1077 unsigned int len, unsigned char opcode)
1078{
1079 unsigned char cmd[16];
1080 struct scsi_sense_hdr sshdr;
1081 int result;
1082
1083 if (sdev->no_report_opcodes || sdev->scsi_level < SCSI_SPC_3)
1084 return 0;
1085
1086 memset(cmd, 0, 16);
1087 cmd[0] = MAINTENANCE_IN;
1088 cmd[1] = MI_REPORT_SUPPORTED_OPERATION_CODES;
1089 cmd[2] = 1;
1090 cmd[3] = opcode;
1091 put_unaligned_be32(len, &cmd[6]);
1092 memset(buffer, 0, len);
1093
1094 result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer, len,
1095 &sshdr, 30 * HZ, 3, NULL);
1096
1097 if (result && scsi_sense_valid(&sshdr) &&
1098 sshdr.sense_key == ILLEGAL_REQUEST &&
1099 (sshdr.asc == 0x20 || sshdr.asc == 0x24) && sshdr.ascq == 0x00)
1100 return 0;
1101
1102 if ((buffer[1] & 3) == 3)
1103 return 1;
1104
1105 return 0;
1106}
1107EXPORT_SYMBOL(scsi_report_opcode);
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117int scsi_device_get(struct scsi_device *sdev)
1118{
1119 if (sdev->sdev_state == SDEV_DEL)
1120 return -ENXIO;
1121 if (!get_device(&sdev->sdev_gendev))
1122 return -ENXIO;
1123
1124
1125 try_module_get(sdev->host->hostt->module);
1126
1127 return 0;
1128}
1129EXPORT_SYMBOL(scsi_device_get);
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139void scsi_device_put(struct scsi_device *sdev)
1140{
1141#ifdef CONFIG_MODULE_UNLOAD
1142 struct module *module = sdev->host->hostt->module;
1143
1144
1145
1146 if (module && module_refcount(module) != 0)
1147 module_put(module);
1148#endif
1149 put_device(&sdev->sdev_gendev);
1150}
1151EXPORT_SYMBOL(scsi_device_put);
1152
1153
1154struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
1155 struct scsi_device *prev)
1156{
1157 struct list_head *list = (prev ? &prev->siblings : &shost->__devices);
1158 struct scsi_device *next = NULL;
1159 unsigned long flags;
1160
1161 spin_lock_irqsave(shost->host_lock, flags);
1162 while (list->next != &shost->__devices) {
1163 next = list_entry(list->next, struct scsi_device, siblings);
1164
1165 if (!scsi_device_get(next))
1166 break;
1167 next = NULL;
1168 list = list->next;
1169 }
1170 spin_unlock_irqrestore(shost->host_lock, flags);
1171
1172 if (prev)
1173 scsi_device_put(prev);
1174 return next;
1175}
1176EXPORT_SYMBOL(__scsi_iterate_devices);
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188void starget_for_each_device(struct scsi_target *starget, void *data,
1189 void (*fn)(struct scsi_device *, void *))
1190{
1191 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1192 struct scsi_device *sdev;
1193
1194 shost_for_each_device(sdev, shost) {
1195 if ((sdev->channel == starget->channel) &&
1196 (sdev->id == starget->id))
1197 fn(sdev, data);
1198 }
1199}
1200EXPORT_SYMBOL(starget_for_each_device);
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216void __starget_for_each_device(struct scsi_target *starget, void *data,
1217 void (*fn)(struct scsi_device *, void *))
1218{
1219 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1220 struct scsi_device *sdev;
1221
1222 __shost_for_each_device(sdev, shost) {
1223 if ((sdev->channel == starget->channel) &&
1224 (sdev->id == starget->id))
1225 fn(sdev, data);
1226 }
1227}
1228EXPORT_SYMBOL(__starget_for_each_device);
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245struct scsi_device *__scsi_device_lookup_by_target(struct scsi_target *starget,
1246 uint lun)
1247{
1248 struct scsi_device *sdev;
1249
1250 list_for_each_entry(sdev, &starget->devices, same_target_siblings) {
1251 if (sdev->sdev_state == SDEV_DEL)
1252 continue;
1253 if (sdev->lun ==lun)
1254 return sdev;
1255 }
1256
1257 return NULL;
1258}
1259EXPORT_SYMBOL(__scsi_device_lookup_by_target);
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *starget,
1271 uint lun)
1272{
1273 struct scsi_device *sdev;
1274 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1275 unsigned long flags;
1276
1277 spin_lock_irqsave(shost->host_lock, flags);
1278 sdev = __scsi_device_lookup_by_target(starget, lun);
1279 if (sdev && scsi_device_get(sdev))
1280 sdev = NULL;
1281 spin_unlock_irqrestore(shost->host_lock, flags);
1282
1283 return sdev;
1284}
1285EXPORT_SYMBOL(scsi_device_lookup_by_target);
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303struct scsi_device *__scsi_device_lookup(struct Scsi_Host *shost,
1304 uint channel, uint id, uint lun)
1305{
1306 struct scsi_device *sdev;
1307
1308 list_for_each_entry(sdev, &shost->__devices, siblings) {
1309 if (sdev->channel == channel && sdev->id == id &&
1310 sdev->lun ==lun)
1311 return sdev;
1312 }
1313
1314 return NULL;
1315}
1316EXPORT_SYMBOL(__scsi_device_lookup);
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329struct scsi_device *scsi_device_lookup(struct Scsi_Host *shost,
1330 uint channel, uint id, uint lun)
1331{
1332 struct scsi_device *sdev;
1333 unsigned long flags;
1334
1335 spin_lock_irqsave(shost->host_lock, flags);
1336 sdev = __scsi_device_lookup(shost, channel, id, lun);
1337 if (sdev && scsi_device_get(sdev))
1338 sdev = NULL;
1339 spin_unlock_irqrestore(shost->host_lock, flags);
1340
1341 return sdev;
1342}
1343EXPORT_SYMBOL(scsi_device_lookup);
1344
1345MODULE_DESCRIPTION("SCSI core");
1346MODULE_LICENSE("GPL");
1347
1348module_param(scsi_logging_level, int, S_IRUGO|S_IWUSR);
1349MODULE_PARM_DESC(scsi_logging_level, "a bit mask of logging levels");
1350
1351static int __init init_scsi(void)
1352{
1353 int error;
1354
1355 error = scsi_init_queue();
1356 if (error)
1357 return error;
1358 error = scsi_init_procfs();
1359 if (error)
1360 goto cleanup_queue;
1361 error = scsi_init_devinfo();
1362 if (error)
1363 goto cleanup_procfs;
1364 error = scsi_init_hosts();
1365 if (error)
1366 goto cleanup_devlist;
1367 error = scsi_init_sysctl();
1368 if (error)
1369 goto cleanup_hosts;
1370 error = scsi_sysfs_register();
1371 if (error)
1372 goto cleanup_sysctl;
1373
1374 scsi_netlink_init();
1375
1376 printk(KERN_NOTICE "SCSI subsystem initialized\n");
1377 return 0;
1378
1379cleanup_sysctl:
1380 scsi_exit_sysctl();
1381cleanup_hosts:
1382 scsi_exit_hosts();
1383cleanup_devlist:
1384 scsi_exit_devinfo();
1385cleanup_procfs:
1386 scsi_exit_procfs();
1387cleanup_queue:
1388 scsi_exit_queue();
1389 printk(KERN_ERR "SCSI subsystem failed to initialize, error = %d\n",
1390 -error);
1391 return error;
1392}
1393
1394static void __exit exit_scsi(void)
1395{
1396 scsi_netlink_exit();
1397 scsi_sysfs_unregister();
1398 scsi_exit_sysctl();
1399 scsi_exit_hosts();
1400 scsi_exit_devinfo();
1401 scsi_exit_procfs();
1402 scsi_exit_queue();
1403 async_unregister_domain(&scsi_sd_probe_domain);
1404}
1405
1406subsys_initcall(init_scsi);
1407module_exit(exit_scsi);
1408