blob: c0d31119d6d7ba3e8a1a258b73073c3e6c44b625 [file] [log] [blame]
Thomas Gleixner457c8992019-05-19 13:08:55 +01001// SPDX-License-Identifier: GPL-2.0-only
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * scsi_sysfs.c
4 *
5 * SCSI sysfs interface routines.
6 *
7 * Created to pull SCSI mid layer sysfs routines into one file.
8 */
9
Linus Torvalds1da177e2005-04-16 15:20:36 -070010#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090011#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070012#include <linux/init.h>
13#include <linux/blkdev.h>
14#include <linux/device.h>
Alan Sternbc4f2402010-06-17 10:41:42 -040015#include <linux/pm_runtime.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016
17#include <scsi/scsi.h>
18#include <scsi/scsi_device.h>
19#include <scsi/scsi_host.h>
20#include <scsi/scsi_tcq.h>
Hannes Reinecke41f95dd2015-12-01 10:16:41 +010021#include <scsi/scsi_dh.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include <scsi/scsi_transport.h>
Adrian Bunk44818ef2007-07-09 11:59:59 -070023#include <scsi/scsi_driver.h>
Hannes Reinecke345e2962017-10-02 16:26:34 +020024#include <scsi/scsi_devinfo.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025
26#include "scsi_priv.h"
27#include "scsi_logging.h"
28
Hannes Reineckeb0ed4332008-03-18 14:32:28 +010029static struct device_type scsi_dev_type;
30
Arjan van de Ven0ad78202005-11-28 16:22:25 +010031static const struct {
Linus Torvalds1da177e2005-04-16 15:20:36 -070032 enum scsi_device_state value;
33 char *name;
34} sdev_states[] = {
35 { SDEV_CREATED, "created" },
36 { SDEV_RUNNING, "running" },
37 { SDEV_CANCEL, "cancel" },
38 { SDEV_DEL, "deleted" },
39 { SDEV_QUIESCE, "quiesce" },
40 { SDEV_OFFLINE, "offline" },
Mike Christie1b8d2622012-05-17 23:56:56 -050041 { SDEV_TRANSPORT_OFFLINE, "transport-offline" },
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 { SDEV_BLOCK, "blocked" },
James Bottomley6f4267e2008-08-22 16:53:31 -050043 { SDEV_CREATED_BLOCK, "created-blocked" },
Linus Torvalds1da177e2005-04-16 15:20:36 -070044};
45
46const char *scsi_device_state_name(enum scsi_device_state state)
47{
48 int i;
49 char *name = NULL;
50
Tobias Klauser6391a112006-06-08 22:23:48 -070051 for (i = 0; i < ARRAY_SIZE(sdev_states); i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -070052 if (sdev_states[i].value == state) {
53 name = sdev_states[i].name;
54 break;
55 }
56 }
57 return name;
58}
59
Arjan van de Ven0ad78202005-11-28 16:22:25 +010060static const struct {
Mike Andersond3301872005-06-16 11:12:38 -070061 enum scsi_host_state value;
62 char *name;
63} shost_states[] = {
64 { SHOST_CREATED, "created" },
65 { SHOST_RUNNING, "running" },
66 { SHOST_CANCEL, "cancel" },
67 { SHOST_DEL, "deleted" },
68 { SHOST_RECOVERY, "recovery" },
James Bottomley939647e2005-09-18 15:05:20 -050069 { SHOST_CANCEL_RECOVERY, "cancel/recovery" },
70 { SHOST_DEL_RECOVERY, "deleted/recovery", },
Mike Andersond3301872005-06-16 11:12:38 -070071};
72const char *scsi_host_state_name(enum scsi_host_state state)
73{
74 int i;
75 char *name = NULL;
76
Tobias Klauser6391a112006-06-08 22:23:48 -070077 for (i = 0; i < ARRAY_SIZE(shost_states); i++) {
Mike Andersond3301872005-06-16 11:12:38 -070078 if (shost_states[i].value == state) {
79 name = shost_states[i].name;
80 break;
81 }
82 }
83 return name;
84}
85
Bart Van Assched78540d2016-03-28 11:13:16 -070086#ifdef CONFIG_SCSI_DH
Hannes Reinecke77c9df92016-03-03 07:54:07 +010087static const struct {
88 unsigned char value;
89 char *name;
90} sdev_access_states[] = {
91 { SCSI_ACCESS_STATE_OPTIMAL, "active/optimized" },
92 { SCSI_ACCESS_STATE_ACTIVE, "active/non-optimized" },
93 { SCSI_ACCESS_STATE_STANDBY, "standby" },
94 { SCSI_ACCESS_STATE_UNAVAILABLE, "unavailable" },
95 { SCSI_ACCESS_STATE_LBA, "lba-dependent" },
96 { SCSI_ACCESS_STATE_OFFLINE, "offline" },
97 { SCSI_ACCESS_STATE_TRANSITIONING, "transitioning" },
98};
99
Bart Van Assched78540d2016-03-28 11:13:16 -0700100static const char *scsi_access_state_name(unsigned char state)
Hannes Reinecke77c9df92016-03-03 07:54:07 +0100101{
102 int i;
103 char *name = NULL;
104
105 for (i = 0; i < ARRAY_SIZE(sdev_access_states); i++) {
106 if (sdev_access_states[i].value == state) {
107 name = sdev_access_states[i].name;
108 break;
109 }
110 }
111 return name;
112}
Bart Van Assched78540d2016-03-28 11:13:16 -0700113#endif
Hannes Reinecke77c9df92016-03-03 07:54:07 +0100114
Hannes Reinecke9cb78c12014-06-25 15:27:36 +0200115static int check_set(unsigned long long *val, char *src)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116{
117 char *last;
118
Bart Van Assche3991e462017-08-25 13:46:30 -0700119 if (strcmp(src, "-") == 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 *val = SCAN_WILD_CARD;
121 } else {
122 /*
123 * Doesn't check for int overflow
124 */
Hannes Reinecke9cb78c12014-06-25 15:27:36 +0200125 *val = simple_strtoull(src, &last, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126 if (*last != '\0')
127 return 1;
128 }
129 return 0;
130}
131
132static int scsi_scan(struct Scsi_Host *shost, const char *str)
133{
Hannes Reinecke9cb78c12014-06-25 15:27:36 +0200134 char s1[15], s2[15], s3[17], junk;
135 unsigned long long channel, id, lun;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700136 int res;
137
Hannes Reinecke9cb78c12014-06-25 15:27:36 +0200138 res = sscanf(str, "%10s %10s %16s %c", s1, s2, s3, &junk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 if (res != 3)
140 return -EINVAL;
141 if (check_set(&channel, s1))
142 return -EINVAL;
143 if (check_set(&id, s2))
144 return -EINVAL;
145 if (check_set(&lun, s3))
146 return -EINVAL;
Christoph Hellwige02f3f52006-01-13 19:04:00 +0100147 if (shost->transportt->user_scan)
148 res = shost->transportt->user_scan(shost, channel, id, lun);
149 else
Hannes Reinecke1d645082016-03-17 08:39:45 +0100150 res = scsi_scan_host_selected(shost, channel, id, lun,
151 SCSI_SCAN_MANUAL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152 return res;
153}
154
155/*
156 * shost_show_function: macro to create an attr function that can be used to
157 * show a non-bit field.
158 */
159#define shost_show_function(name, field, format_string) \
160static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100161show_##name (struct device *dev, struct device_attribute *attr, \
162 char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700163{ \
Tony Jonesee959b02008-02-22 00:13:36 +0100164 struct Scsi_Host *shost = class_to_shost(dev); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700165 return snprintf (buf, 20, format_string, shost->field); \
166}
167
168/*
169 * shost_rd_attr: macro to create a function and attribute variable for a
170 * read only field.
171 */
172#define shost_rd_attr2(name, field, format_string) \
173 shost_show_function(name, field, format_string) \
Tony Jonesee959b02008-02-22 00:13:36 +0100174static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175
176#define shost_rd_attr(field, format_string) \
177shost_rd_attr2(field, field, format_string)
178
179/*
180 * Create the actual show/store functions and data structures.
181 */
182
Tony Jonesee959b02008-02-22 00:13:36 +0100183static ssize_t
184store_scan(struct device *dev, struct device_attribute *attr,
185 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186{
Tony Jonesee959b02008-02-22 00:13:36 +0100187 struct Scsi_Host *shost = class_to_shost(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188 int res;
189
190 res = scsi_scan(shost, buf);
191 if (res == 0)
192 res = count;
193 return res;
194};
Tony Jonesee959b02008-02-22 00:13:36 +0100195static DEVICE_ATTR(scan, S_IWUSR, NULL, store_scan);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700196
Mike Andersond3301872005-06-16 11:12:38 -0700197static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100198store_shost_state(struct device *dev, struct device_attribute *attr,
199 const char *buf, size_t count)
Mike Andersond3301872005-06-16 11:12:38 -0700200{
201 int i;
Tony Jonesee959b02008-02-22 00:13:36 +0100202 struct Scsi_Host *shost = class_to_shost(dev);
Mike Andersond3301872005-06-16 11:12:38 -0700203 enum scsi_host_state state = 0;
204
Tobias Klauser6391a112006-06-08 22:23:48 -0700205 for (i = 0; i < ARRAY_SIZE(shost_states); i++) {
Mike Andersond3301872005-06-16 11:12:38 -0700206 const int len = strlen(shost_states[i].name);
207 if (strncmp(shost_states[i].name, buf, len) == 0 &&
208 buf[len] == '\n') {
209 state = shost_states[i].value;
210 break;
211 }
212 }
213 if (!state)
214 return -EINVAL;
215
216 if (scsi_host_set_state(shost, state))
217 return -EINVAL;
218 return count;
219}
220
221static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100222show_shost_state(struct device *dev, struct device_attribute *attr, char *buf)
Mike Andersond3301872005-06-16 11:12:38 -0700223{
Tony Jonesee959b02008-02-22 00:13:36 +0100224 struct Scsi_Host *shost = class_to_shost(dev);
Mike Andersond3301872005-06-16 11:12:38 -0700225 const char *name = scsi_host_state_name(shost->shost_state);
226
227 if (!name)
228 return -EINVAL;
229
230 return snprintf(buf, 20, "%s\n", name);
231}
232
Tony Jonesee959b02008-02-22 00:13:36 +0100233/* DEVICE_ATTR(state) clashes with dev_attr_state for sdev */
Bart Van Assched78540d2016-03-28 11:13:16 -0700234static struct device_attribute dev_attr_hstate =
Tony Jonesee959b02008-02-22 00:13:36 +0100235 __ATTR(state, S_IRUGO | S_IWUSR, show_shost_state, store_shost_state);
Mike Andersond3301872005-06-16 11:12:38 -0700236
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900237static ssize_t
238show_shost_mode(unsigned int mode, char *buf)
239{
240 ssize_t len = 0;
241
242 if (mode & MODE_INITIATOR)
243 len = sprintf(buf, "%s", "Initiator");
244
245 if (mode & MODE_TARGET)
246 len += sprintf(buf + len, "%s%s", len ? ", " : "", "Target");
247
248 len += sprintf(buf + len, "\n");
249
250 return len;
251}
252
Tony Jonesee959b02008-02-22 00:13:36 +0100253static ssize_t
254show_shost_supported_mode(struct device *dev, struct device_attribute *attr,
255 char *buf)
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900256{
Tony Jonesee959b02008-02-22 00:13:36 +0100257 struct Scsi_Host *shost = class_to_shost(dev);
James Bottomley7a39ac32007-09-25 22:45:53 -0500258 unsigned int supported_mode = shost->hostt->supported_mode;
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900259
James Bottomley7a39ac32007-09-25 22:45:53 -0500260 if (supported_mode == MODE_UNKNOWN)
261 /* by default this should be initiator */
262 supported_mode = MODE_INITIATOR;
263
264 return show_shost_mode(supported_mode, buf);
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900265}
266
Tony Jonesee959b02008-02-22 00:13:36 +0100267static DEVICE_ATTR(supported_mode, S_IRUGO | S_IWUSR, show_shost_supported_mode, NULL);
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900268
Tony Jonesee959b02008-02-22 00:13:36 +0100269static ssize_t
270show_shost_active_mode(struct device *dev,
271 struct device_attribute *attr, char *buf)
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900272{
Tony Jonesee959b02008-02-22 00:13:36 +0100273 struct Scsi_Host *shost = class_to_shost(dev);
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900274
275 if (shost->active_mode == MODE_UNKNOWN)
276 return snprintf(buf, 20, "unknown\n");
277 else
278 return show_shost_mode(shost->active_mode, buf);
279}
280
Tony Jonesee959b02008-02-22 00:13:36 +0100281static DEVICE_ATTR(active_mode, S_IRUGO | S_IWUSR, show_shost_active_mode, NULL);
FUJITA Tomonori5dc2b892007-09-01 02:02:20 +0900282
Sasha Levin072f19b2012-11-15 15:51:46 -0500283static int check_reset_type(const char *str)
Vikas Chaudhary29443692011-08-12 02:51:28 -0700284{
Sasha Levin072f19b2012-11-15 15:51:46 -0500285 if (sysfs_streq(str, "adapter"))
Vikas Chaudhary29443692011-08-12 02:51:28 -0700286 return SCSI_ADAPTER_RESET;
Sasha Levin072f19b2012-11-15 15:51:46 -0500287 else if (sysfs_streq(str, "firmware"))
Vikas Chaudhary29443692011-08-12 02:51:28 -0700288 return SCSI_FIRMWARE_RESET;
289 else
290 return 0;
291}
292
293static ssize_t
294store_host_reset(struct device *dev, struct device_attribute *attr,
295 const char *buf, size_t count)
296{
297 struct Scsi_Host *shost = class_to_shost(dev);
298 struct scsi_host_template *sht = shost->hostt;
299 int ret = -EINVAL;
Vikas Chaudhary29443692011-08-12 02:51:28 -0700300 int type;
301
Sasha Levin072f19b2012-11-15 15:51:46 -0500302 type = check_reset_type(buf);
Vikas Chaudhary29443692011-08-12 02:51:28 -0700303 if (!type)
304 goto exit_store_host_reset;
305
306 if (sht->host_reset)
307 ret = sht->host_reset(shost, type);
weiping zhang92227b82017-08-11 01:52:17 +0800308 else
309 ret = -EOPNOTSUPP;
Vikas Chaudhary29443692011-08-12 02:51:28 -0700310
311exit_store_host_reset:
312 if (ret == 0)
313 ret = count;
314 return ret;
315}
316
317static DEVICE_ATTR(host_reset, S_IWUSR, NULL, store_host_reset);
318
Hannes Reineckeb4562022013-10-23 10:51:21 +0200319static ssize_t
320show_shost_eh_deadline(struct device *dev,
321 struct device_attribute *attr, char *buf)
322{
323 struct Scsi_Host *shost = class_to_shost(dev);
324
Ren Mingxinbb3b6212013-11-11 13:44:56 +0100325 if (shost->eh_deadline == -1)
326 return snprintf(buf, strlen("off") + 2, "off\n");
327 return sprintf(buf, "%u\n", shost->eh_deadline / HZ);
Hannes Reineckeb4562022013-10-23 10:51:21 +0200328}
329
330static ssize_t
331store_shost_eh_deadline(struct device *dev, struct device_attribute *attr,
332 const char *buf, size_t count)
333{
334 struct Scsi_Host *shost = class_to_shost(dev);
335 int ret = -EINVAL;
Ren Mingxinbb3b6212013-11-11 13:44:56 +0100336 unsigned long deadline, flags;
Hannes Reineckeb4562022013-10-23 10:51:21 +0200337
Hannes Reineckead469a52014-01-17 16:05:38 +0100338 if (shost->transportt &&
339 (shost->transportt->eh_strategy_handler ||
340 !shost->hostt->eh_host_reset_handler))
Hannes Reineckeb4562022013-10-23 10:51:21 +0200341 return ret;
342
Ren Mingxinbb3b6212013-11-11 13:44:56 +0100343 if (!strncmp(buf, "off", strlen("off")))
344 deadline = -1;
345 else {
346 ret = kstrtoul(buf, 10, &deadline);
347 if (ret)
348 return ret;
349 if (deadline * HZ > UINT_MAX)
350 return -EINVAL;
Hannes Reineckeb4562022013-10-23 10:51:21 +0200351 }
Ren Mingxinbb3b6212013-11-11 13:44:56 +0100352
353 spin_lock_irqsave(shost->host_lock, flags);
354 if (scsi_host_in_recovery(shost))
355 ret = -EBUSY;
356 else {
357 if (deadline == -1)
358 shost->eh_deadline = -1;
359 else
360 shost->eh_deadline = deadline * HZ;
361
362 ret = count;
363 }
364 spin_unlock_irqrestore(shost->host_lock, flags);
365
Hannes Reineckeb4562022013-10-23 10:51:21 +0200366 return ret;
367}
368
369static DEVICE_ATTR(eh_deadline, S_IRUGO | S_IWUSR, show_shost_eh_deadline, store_shost_eh_deadline);
370
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371shost_rd_attr(unique_id, "%u\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700372shost_rd_attr(cmd_per_lun, "%hd\n");
Nick Desaulniers88392822020-11-07 00:11:32 -0800373shost_rd_attr(can_queue, "%d\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374shost_rd_attr(sg_tablesize, "%hu\n");
Martin K. Petersen13f05c82010-09-10 20:50:10 +0200375shost_rd_attr(sg_prot_tablesize, "%hu\n");
Martin K. Petersen4469f982008-07-17 04:28:30 -0400376shost_rd_attr(prot_capabilities, "%u\n");
377shost_rd_attr(prot_guard_type, "%hd\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378shost_rd_attr2(proc_name, hostt->proc_name, "%s\n");
379
Christoph Hellwig74665012014-01-22 15:29:29 +0100380static ssize_t
381show_host_busy(struct device *dev, struct device_attribute *attr, char *buf)
382{
383 struct Scsi_Host *shost = class_to_shost(dev);
Ming Leic84b0232018-06-24 22:03:26 +0800384 return snprintf(buf, 20, "%d\n", scsi_host_busy(shost));
Christoph Hellwig74665012014-01-22 15:29:29 +0100385}
386static DEVICE_ATTR(host_busy, S_IRUGO, show_host_busy, NULL);
387
Jens Axboef664a3c2018-11-01 16:36:27 -0600388static ssize_t
389show_use_blk_mq(struct device *dev, struct device_attribute *attr, char *buf)
390{
391 return sprintf(buf, "1\n");
392}
393static DEVICE_ATTR(use_blk_mq, S_IRUGO, show_use_blk_mq, NULL);
394
John Garry64f15012020-08-19 23:20:31 +0800395static ssize_t
396show_nr_hw_queues(struct device *dev, struct device_attribute *attr, char *buf)
397{
398 struct Scsi_Host *shost = class_to_shost(dev);
399 struct blk_mq_tag_set *tag_set = &shost->tag_set;
400
401 return snprintf(buf, 20, "%d\n", tag_set->nr_hw_queues);
402}
403static DEVICE_ATTR(nr_hw_queues, S_IRUGO, show_nr_hw_queues, NULL);
404
Hannes Reineckef7120a42008-03-18 14:32:28 +0100405static struct attribute *scsi_sysfs_shost_attrs[] = {
Christoph Hellwigd2852032014-01-17 12:06:53 +0100406 &dev_attr_use_blk_mq.attr,
Hannes Reineckef7120a42008-03-18 14:32:28 +0100407 &dev_attr_unique_id.attr,
408 &dev_attr_host_busy.attr,
409 &dev_attr_cmd_per_lun.attr,
410 &dev_attr_can_queue.attr,
411 &dev_attr_sg_tablesize.attr,
Martin K. Petersen13f05c82010-09-10 20:50:10 +0200412 &dev_attr_sg_prot_tablesize.attr,
Hannes Reineckef7120a42008-03-18 14:32:28 +0100413 &dev_attr_proc_name.attr,
414 &dev_attr_scan.attr,
415 &dev_attr_hstate.attr,
416 &dev_attr_supported_mode.attr,
417 &dev_attr_active_mode.attr,
Martin K. Petersen4469f982008-07-17 04:28:30 -0400418 &dev_attr_prot_capabilities.attr,
419 &dev_attr_prot_guard_type.attr,
Vikas Chaudhary29443692011-08-12 02:51:28 -0700420 &dev_attr_host_reset.attr,
Hannes Reineckeb4562022013-10-23 10:51:21 +0200421 &dev_attr_eh_deadline.attr,
John Garry64f15012020-08-19 23:20:31 +0800422 &dev_attr_nr_hw_queues.attr,
Hannes Reineckef7120a42008-03-18 14:32:28 +0100423 NULL
424};
425
Bart Van Assched78540d2016-03-28 11:13:16 -0700426static struct attribute_group scsi_shost_attr_group = {
Hannes Reineckef7120a42008-03-18 14:32:28 +0100427 .attrs = scsi_sysfs_shost_attrs,
428};
429
David Brownella4dbd672009-06-24 10:06:31 -0700430const struct attribute_group *scsi_sysfs_shost_attr_groups[] = {
Hannes Reineckef7120a42008-03-18 14:32:28 +0100431 &scsi_shost_attr_group,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 NULL
433};
434
Tony Jonesee959b02008-02-22 00:13:36 +0100435static void scsi_device_cls_release(struct device *class_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436{
437 struct scsi_device *sdev;
438
439 sdev = class_to_sdev(class_dev);
440 put_device(&sdev->sdev_gendev);
441}
442
David Howells65f27f32006-11-22 14:55:48 +0000443static void scsi_device_dev_release_usercontext(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444{
445 struct scsi_device *sdev;
446 struct device *parent;
Jeff Garzika341cd02007-10-29 17:15:22 -0400447 struct list_head *this, *tmp;
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700448 struct scsi_vpd *vpd_pg80 = NULL, *vpd_pg83 = NULL;
Ryan Attardd188b062019-09-26 11:22:17 -0500449 struct scsi_vpd *vpd_pg0 = NULL, *vpd_pg89 = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450 unsigned long flags;
451
David Howells65f27f32006-11-22 14:55:48 +0000452 sdev = container_of(work, struct scsi_device, ew.work);
453
Junichi Nomura23695e42015-10-06 04:32:57 +0000454 scsi_dh_release_device(sdev);
455
David Howells65f27f32006-11-22 14:55:48 +0000456 parent = sdev->sdev_gendev.parent;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457
458 spin_lock_irqsave(sdev->host->host_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459 list_del(&sdev->siblings);
460 list_del(&sdev->same_target_siblings);
461 list_del(&sdev->starved_entry);
462 spin_unlock_irqrestore(sdev->host->host_lock, flags);
463
Jeff Garzika341cd02007-10-29 17:15:22 -0400464 cancel_work_sync(&sdev->event_work);
465
466 list_for_each_safe(this, tmp, &sdev->event_list) {
467 struct scsi_event *evt;
468
469 evt = list_entry(this, struct scsi_event, node);
470 list_del(&evt->node);
471 kfree(evt);
472 }
473
James Bottomleye73e0792011-05-25 15:52:14 -0500474 blk_put_queue(sdev->request_queue);
James Bottomley86cbfb52011-04-22 10:39:59 -0500475 /* NULL queue means the device can't be used */
476 sdev->request_queue = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700477
Ming Lei020b0f02021-01-22 10:33:17 +0800478 sbitmap_free(&sdev->budget_map);
479
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700480 mutex_lock(&sdev->inquiry_mutex);
Linus Torvaldsef2cc882019-12-02 13:37:02 -0800481 vpd_pg0 = rcu_replace_pointer(sdev->vpd_pg0, vpd_pg0,
482 lockdep_is_held(&sdev->inquiry_mutex));
Paul E. McKenneyc0eaf152019-09-23 15:26:28 -0700483 vpd_pg80 = rcu_replace_pointer(sdev->vpd_pg80, vpd_pg80,
484 lockdep_is_held(&sdev->inquiry_mutex));
485 vpd_pg83 = rcu_replace_pointer(sdev->vpd_pg83, vpd_pg83,
486 lockdep_is_held(&sdev->inquiry_mutex));
Linus Torvaldsef2cc882019-12-02 13:37:02 -0800487 vpd_pg89 = rcu_replace_pointer(sdev->vpd_pg89, vpd_pg89,
488 lockdep_is_held(&sdev->inquiry_mutex));
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700489 mutex_unlock(&sdev->inquiry_mutex);
490
Ryan Attardd188b062019-09-26 11:22:17 -0500491 if (vpd_pg0)
492 kfree_rcu(vpd_pg0, rcu);
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700493 if (vpd_pg83)
494 kfree_rcu(vpd_pg83, rcu);
495 if (vpd_pg80)
496 kfree_rcu(vpd_pg80, rcu);
Ryan Attardd188b062019-09-26 11:22:17 -0500497 if (vpd_pg89)
498 kfree_rcu(vpd_pg89, rcu);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499 kfree(sdev->inquiry);
500 kfree(sdev);
501
502 if (parent)
503 put_device(parent);
504}
505
James Bottomley65110b22006-02-14 10:48:46 -0600506static void scsi_device_dev_release(struct device *dev)
507{
James Bottomleyffedb452006-02-23 14:27:18 -0600508 struct scsi_device *sdp = to_scsi_device(dev);
David Howells65f27f32006-11-22 14:55:48 +0000509 execute_in_process_context(scsi_device_dev_release_usercontext,
James Bottomleyffedb452006-02-23 14:27:18 -0600510 &sdp->ew);
James Bottomley65110b22006-02-14 10:48:46 -0600511}
512
Adrian Bunk52c1da32005-06-23 22:05:33 -0700513static struct class sdev_class = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514 .name = "scsi_device",
Tony Jonesee959b02008-02-22 00:13:36 +0100515 .dev_release = scsi_device_cls_release,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700516};
517
518/* all probing is done in the individual ->probe routines */
519static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
520{
Hannes Reineckeb0ed4332008-03-18 14:32:28 +0100521 struct scsi_device *sdp;
522
523 if (dev->type != &scsi_dev_type)
524 return 0;
525
526 sdp = to_scsi_device(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 if (sdp->no_uld_attach)
528 return 0;
529 return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0;
530}
531
Kay Sievers7eff2e72007-08-14 15:15:12 +0200532static int scsi_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
Michael Tokarevd7b8bcb02006-10-27 16:02:37 +0400533{
James Bottomley1f42ea72008-05-22 12:34:41 +0100534 struct scsi_device *sdev;
535
536 if (dev->type != &scsi_dev_type)
537 return 0;
538
539 sdev = to_scsi_device(dev);
Michael Tokarevd7b8bcb02006-10-27 16:02:37 +0400540
Kay Sievers7eff2e72007-08-14 15:15:12 +0200541 add_uevent_var(env, "MODALIAS=" SCSI_DEVICE_MODALIAS_FMT, sdev->type);
Michael Tokarevd7b8bcb02006-10-27 16:02:37 +0400542 return 0;
543}
544
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545struct bus_type scsi_bus_type = {
546 .name = "scsi",
547 .match = scsi_bus_match,
Michael Tokarevd7b8bcb02006-10-27 16:02:37 +0400548 .uevent = scsi_bus_uevent,
Rafael J. Wysockiaa338602011-02-11 00:06:54 +0100549#ifdef CONFIG_PM
Alan Sterndb5bd1e2010-06-17 10:36:49 -0400550 .pm = &scsi_bus_pm_ops,
Alan Sterne6da54d2010-08-05 13:17:10 -0400551#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700552};
Chandra Seetharamana6a8d9f2008-05-01 14:49:46 -0700553EXPORT_SYMBOL_GPL(scsi_bus_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554
555int scsi_sysfs_register(void)
556{
557 int error;
558
559 error = bus_register(&scsi_bus_type);
560 if (!error) {
561 error = class_register(&sdev_class);
562 if (error)
563 bus_unregister(&scsi_bus_type);
564 }
565
566 return error;
567}
568
569void scsi_sysfs_unregister(void)
570{
571 class_unregister(&sdev_class);
572 bus_unregister(&scsi_bus_type);
573}
574
575/*
576 * sdev_show_function: macro to create an attr function that can be used to
577 * show a non-bit field.
578 */
579#define sdev_show_function(field, format_string) \
580static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100581sdev_show_##field (struct device *dev, struct device_attribute *attr, \
582 char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583{ \
584 struct scsi_device *sdev; \
585 sdev = to_scsi_device(dev); \
586 return snprintf (buf, 20, format_string, sdev->field); \
587} \
588
589/*
590 * sdev_rd_attr: macro to create a function and attribute variable for a
591 * read only field.
592 */
593#define sdev_rd_attr(field, format_string) \
594 sdev_show_function(field, format_string) \
595static DEVICE_ATTR(field, S_IRUGO, sdev_show_##field, NULL);
596
597
598/*
Tomohiro Kusumi160e7f62010-04-14 15:15:14 +0900599 * sdev_rw_attr: create a function and attribute variable for a
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600 * read/write field.
601 */
602#define sdev_rw_attr(field, format_string) \
603 sdev_show_function(field, format_string) \
604 \
605static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100606sdev_store_##field (struct device *dev, struct device_attribute *attr, \
607 const char *buf, size_t count) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608{ \
609 struct scsi_device *sdev; \
610 sdev = to_scsi_device(dev); \
Tomohiro Kusumi160e7f62010-04-14 15:15:14 +0900611 sscanf (buf, format_string, &sdev->field); \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700612 return count; \
613} \
614static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field);
615
616/* Currently we don't export bit fields, but we might in future,
617 * so leave this code in */
618#if 0
619/*
620 * sdev_rd_attr: create a function and attribute variable for a
621 * read/write bit field.
622 */
623#define sdev_rw_attr_bit(field) \
624 sdev_show_function(field, "%d\n") \
625 \
626static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100627sdev_store_##field (struct device *dev, struct device_attribute *attr, \
628 const char *buf, size_t count) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700629{ \
630 int ret; \
631 struct scsi_device *sdev; \
632 ret = scsi_sdev_check_buf_bit(buf); \
633 if (ret >= 0) { \
634 sdev = to_scsi_device(dev); \
635 sdev->field = ret; \
636 ret = count; \
637 } \
638 return ret; \
639} \
640static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, sdev_show_##field, sdev_store_##field);
641
642/*
643 * scsi_sdev_check_buf_bit: return 0 if buf is "0", return 1 if buf is "1",
644 * else return -EINVAL.
645 */
646static int scsi_sdev_check_buf_bit(const char *buf)
647{
648 if ((buf[1] == '\0') || ((buf[1] == '\n') && (buf[2] == '\0'))) {
649 if (buf[0] == '1')
650 return 1;
651 else if (buf[0] == '0')
652 return 0;
653 else
654 return -EINVAL;
655 } else
656 return -EINVAL;
657}
658#endif
659/*
660 * Create the actual show/store functions and data structures.
661 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662sdev_rd_attr (type, "%d\n");
663sdev_rd_attr (scsi_level, "%d\n");
664sdev_rd_attr (vendor, "%.8s\n");
665sdev_rd_attr (model, "%.16s\n");
666sdev_rd_attr (rev, "%.4s\n");
667
Christoph Hellwig71e75c92014-04-11 19:07:01 +0200668static ssize_t
669sdev_show_device_busy(struct device *dev, struct device_attribute *attr,
670 char *buf)
671{
672 struct scsi_device *sdev = to_scsi_device(dev);
Ming Lei82788072021-01-22 10:33:15 +0800673 return snprintf(buf, 20, "%d\n", scsi_device_busy(sdev));
Christoph Hellwig71e75c92014-04-11 19:07:01 +0200674}
675static DEVICE_ATTR(device_busy, S_IRUGO, sdev_show_device_busy, NULL);
676
Christoph Hellwigcd9070c2014-01-23 12:07:41 +0100677static ssize_t
678sdev_show_device_blocked(struct device *dev, struct device_attribute *attr,
679 char *buf)
680{
681 struct scsi_device *sdev = to_scsi_device(dev);
682 return snprintf(buf, 20, "%d\n", atomic_read(&sdev->device_blocked));
683}
684static DEVICE_ATTR(device_blocked, S_IRUGO, sdev_show_device_blocked, NULL);
685
Jens Axboe242f9dc2008-09-14 05:55:09 -0700686/*
687 * TODO: can we make these symlinks to the block layer ones?
688 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689static ssize_t
Yani Ioannou10523b32005-05-17 06:43:37 -0400690sdev_show_timeout (struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691{
692 struct scsi_device *sdev;
693 sdev = to_scsi_device(dev);
Jens Axboe242f9dc2008-09-14 05:55:09 -0700694 return snprintf(buf, 20, "%d\n", sdev->request_queue->rq_timeout / HZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695}
696
697static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100698sdev_store_timeout (struct device *dev, struct device_attribute *attr,
699 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700{
701 struct scsi_device *sdev;
702 int timeout;
703 sdev = to_scsi_device(dev);
704 sscanf (buf, "%d\n", &timeout);
Jens Axboe242f9dc2008-09-14 05:55:09 -0700705 blk_queue_rq_timeout(sdev->request_queue, timeout * HZ);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 return count;
707}
708static DEVICE_ATTR(timeout, S_IRUGO | S_IWUSR, sdev_show_timeout, sdev_store_timeout);
709
710static ssize_t
Martin K. Petersen0816c922013-05-10 10:36:04 -0400711sdev_show_eh_timeout(struct device *dev, struct device_attribute *attr, char *buf)
712{
713 struct scsi_device *sdev;
714 sdev = to_scsi_device(dev);
715 return snprintf(buf, 20, "%u\n", sdev->eh_timeout / HZ);
716}
717
718static ssize_t
719sdev_store_eh_timeout(struct device *dev, struct device_attribute *attr,
720 const char *buf, size_t count)
721{
722 struct scsi_device *sdev;
723 unsigned int eh_timeout;
724 int err;
725
726 if (!capable(CAP_SYS_ADMIN))
727 return -EACCES;
728
729 sdev = to_scsi_device(dev);
730 err = kstrtouint(buf, 10, &eh_timeout);
731 if (err)
732 return err;
733 sdev->eh_timeout = eh_timeout * HZ;
734
735 return count;
736}
737static DEVICE_ATTR(eh_timeout, S_IRUGO | S_IWUSR, sdev_show_eh_timeout, sdev_store_eh_timeout);
738
739static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100740store_rescan_field (struct device *dev, struct device_attribute *attr,
741 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742{
743 scsi_rescan_device(dev);
744 return count;
745}
746static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field);
747
Tony Jonesee959b02008-02-22 00:13:36 +0100748static ssize_t
749sdev_store_delete(struct device *dev, struct device_attribute *attr,
750 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751{
Bart Van Assche0ee223b2018-08-02 10:51:41 -0700752 struct kernfs_node *kn;
Yufen Yu77c30122019-10-15 21:05:56 +0800753 struct scsi_device *sdev = to_scsi_device(dev);
754
755 /*
756 * We need to try to get module, avoiding the module been removed
757 * during delete.
758 */
759 if (scsi_device_get(sdev))
760 return -ENODEV;
Bart Van Assche0ee223b2018-08-02 10:51:41 -0700761
762 kn = sysfs_break_active_protection(&dev->kobj, &attr->attr);
763 WARN_ON_ONCE(!kn);
764 /*
765 * Concurrent writes into the "delete" sysfs attribute may trigger
766 * concurrent calls to device_remove_file() and scsi_remove_device().
767 * device_remove_file() handles concurrent removal calls by
768 * serializing these and by ignoring the second and later removal
769 * attempts. Concurrent calls of scsi_remove_device() are
770 * serialized. The second and later calls of scsi_remove_device() are
771 * ignored because the first call of that function changes the device
772 * state into SDEV_DEL.
773 */
774 device_remove_file(dev, attr);
Yufen Yu77c30122019-10-15 21:05:56 +0800775 scsi_remove_device(sdev);
Bart Van Assche0ee223b2018-08-02 10:51:41 -0700776 if (kn)
777 sysfs_unbreak_active_protection(kn);
Yufen Yu77c30122019-10-15 21:05:56 +0800778 scsi_device_put(sdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779 return count;
780};
781static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);
782
783static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100784store_state_field(struct device *dev, struct device_attribute *attr,
785 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786{
Bart Van Assche0db6ca82017-06-02 14:21:55 -0700787 int i, ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 struct scsi_device *sdev = to_scsi_device(dev);
789 enum scsi_device_state state = 0;
790
Tobias Klauser6391a112006-06-08 22:23:48 -0700791 for (i = 0; i < ARRAY_SIZE(sdev_states); i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792 const int len = strlen(sdev_states[i].name);
793 if (strncmp(sdev_states[i].name, buf, len) == 0 &&
794 buf[len] == '\n') {
795 state = sdev_states[i].value;
796 break;
797 }
798 }
Bart Van Asscheac88c1f2019-06-17 08:18:18 -0700799 switch (state) {
800 case SDEV_RUNNING:
801 case SDEV_OFFLINE:
802 break;
803 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 return -EINVAL;
Bart Van Asscheac88c1f2019-06-17 08:18:18 -0700805 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806
Bart Van Assche0db6ca82017-06-02 14:21:55 -0700807 mutex_lock(&sdev->state_mutex);
808 ret = scsi_device_set_state(sdev, state);
zhengbin70fc0852019-03-22 10:56:46 +0800809 /*
lijinlinf0f82e22021-07-27 11:44:55 +0800810 * If the device state changes to SDEV_RUNNING, we need to
Li Jinlin02c6dcd2021-08-24 10:59:21 +0800811 * run the queue to avoid I/O hang, and rescan the device
812 * to revalidate it. Running the queue first is necessary
813 * because another thread may be waiting inside
814 * blk_mq_freeze_queue_wait() and because that call may be
815 * waiting for pending I/O to finish.
zhengbin70fc0852019-03-22 10:56:46 +0800816 */
lijinlinf0f82e22021-07-27 11:44:55 +0800817 if (ret == 0 && state == SDEV_RUNNING) {
zhengbin70fc0852019-03-22 10:56:46 +0800818 blk_mq_run_hw_queues(sdev->request_queue, true);
Li Jinlin02c6dcd2021-08-24 10:59:21 +0800819 scsi_rescan_device(dev);
lijinlinf0f82e22021-07-27 11:44:55 +0800820 }
Bart Van Assche0db6ca82017-06-02 14:21:55 -0700821 mutex_unlock(&sdev->state_mutex);
822
823 return ret == 0 ? count : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824}
825
826static ssize_t
Yani Ioannou10523b32005-05-17 06:43:37 -0400827show_state_field(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828{
829 struct scsi_device *sdev = to_scsi_device(dev);
830 const char *name = scsi_device_state_name(sdev->sdev_state);
831
832 if (!name)
833 return -EINVAL;
834
835 return snprintf(buf, 20, "%s\n", name);
836}
837
838static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_state_field, store_state_field);
839
840static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100841show_queue_type_field(struct device *dev, struct device_attribute *attr,
842 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843{
844 struct scsi_device *sdev = to_scsi_device(dev);
845 const char *name = "none";
846
Christoph Hellwig609aa222014-10-30 11:54:58 +0100847 if (sdev->simple_tags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 name = "simple";
849
850 return snprintf(buf, 20, "%s\n", name);
851}
852
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100853static ssize_t
854store_queue_type_field(struct device *dev, struct device_attribute *attr,
855 const char *buf, size_t count)
856{
857 struct scsi_device *sdev = to_scsi_device(dev);
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100858
Christoph Hellwigefc3c1d2014-11-24 15:36:18 +0100859 if (!sdev->tagged_supported)
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100860 return -EINVAL;
Christoph Hellwigefc3c1d2014-11-24 15:36:18 +0100861
862 sdev_printk(KERN_INFO, sdev,
863 "ignoring write to deprecated queue_type attribute");
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100864 return count;
865}
866
867static DEVICE_ATTR(queue_type, S_IRUGO | S_IWUSR, show_queue_type_field,
868 store_queue_type_field);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100870#define sdev_vpd_pg_attr(_page) \
871static ssize_t \
872show_vpd_##_page(struct file *filp, struct kobject *kobj, \
873 struct bin_attribute *bin_attr, \
874 char *buf, loff_t off, size_t count) \
875{ \
Guosong Su9e7bd9452020-02-25 18:04:11 +0800876 struct device *dev = kobj_to_dev(kobj); \
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100877 struct scsi_device *sdev = to_scsi_device(dev); \
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700878 struct scsi_vpd *vpd_page; \
879 int ret = -EINVAL; \
880 \
Hannes Reinecke09e2b0b2015-11-09 13:24:28 +0100881 rcu_read_lock(); \
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700882 vpd_page = rcu_dereference(sdev->vpd_##_page); \
883 if (vpd_page) \
884 ret = memory_read_from_buffer(buf, count, &off, \
885 vpd_page->data, vpd_page->len); \
Hannes Reinecke09e2b0b2015-11-09 13:24:28 +0100886 rcu_read_unlock(); \
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700887 return ret; \
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100888} \
889static struct bin_attribute dev_attr_vpd_##_page = { \
890 .attr = {.name = __stringify(vpd_##_page), .mode = S_IRUGO }, \
891 .size = 0, \
892 .read = show_vpd_##_page, \
893};
894
895sdev_vpd_pg_attr(pg83);
896sdev_vpd_pg_attr(pg80);
Ryan Attardd188b062019-09-26 11:22:17 -0500897sdev_vpd_pg_attr(pg89);
898sdev_vpd_pg_attr(pg0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899
Johannes Thumshirn92e62462015-11-09 10:56:57 +0100900static ssize_t show_inquiry(struct file *filep, struct kobject *kobj,
901 struct bin_attribute *bin_attr,
902 char *buf, loff_t off, size_t count)
903{
Guosong Su9e7bd9452020-02-25 18:04:11 +0800904 struct device *dev = kobj_to_dev(kobj);
Johannes Thumshirn92e62462015-11-09 10:56:57 +0100905 struct scsi_device *sdev = to_scsi_device(dev);
906
907 if (!sdev->inquiry)
908 return -EINVAL;
909
910 return memory_read_from_buffer(buf, count, &off, sdev->inquiry,
911 sdev->inquiry_len);
912}
913
914static struct bin_attribute dev_attr_inquiry = {
915 .attr = {
916 .name = "inquiry",
917 .mode = S_IRUGO,
918 },
919 .size = 0,
920 .read = show_inquiry,
921};
922
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923static ssize_t
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100924show_iostat_counterbits(struct device *dev, struct device_attribute *attr,
925 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926{
927 return snprintf(buf, 20, "%d\n", (int)sizeof(atomic_t) * 8);
928}
929
930static DEVICE_ATTR(iocounterbits, S_IRUGO, show_iostat_counterbits, NULL);
931
932#define show_sdev_iostat(field) \
933static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100934show_iostat_##field(struct device *dev, struct device_attribute *attr, \
935 char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936{ \
937 struct scsi_device *sdev = to_scsi_device(dev); \
938 unsigned long long count = atomic_read(&sdev->field); \
939 return snprintf(buf, 20, "0x%llx\n", count); \
940} \
941static DEVICE_ATTR(field, S_IRUGO, show_iostat_##field, NULL)
942
943show_sdev_iostat(iorequest_cnt);
944show_sdev_iostat(iodone_cnt);
945show_sdev_iostat(ioerr_cnt);
946
Michael Tokarevd7b8bcb02006-10-27 16:02:37 +0400947static ssize_t
948sdev_show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
949{
950 struct scsi_device *sdev;
951 sdev = to_scsi_device(dev);
952 return snprintf (buf, 20, SCSI_DEVICE_MODALIAS_FMT "\n", sdev->type);
953}
954static DEVICE_ATTR(modalias, S_IRUGO, sdev_show_modalias, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700955
Jeff Garzika341cd02007-10-29 17:15:22 -0400956#define DECLARE_EVT_SHOW(name, Cap_name) \
957static ssize_t \
958sdev_show_evt_##name(struct device *dev, struct device_attribute *attr, \
Tony Jonesee959b02008-02-22 00:13:36 +0100959 char *buf) \
Jeff Garzika341cd02007-10-29 17:15:22 -0400960{ \
961 struct scsi_device *sdev = to_scsi_device(dev); \
962 int val = test_bit(SDEV_EVT_##Cap_name, sdev->supported_events);\
963 return snprintf(buf, 20, "%d\n", val); \
964}
965
966#define DECLARE_EVT_STORE(name, Cap_name) \
967static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100968sdev_store_evt_##name(struct device *dev, struct device_attribute *attr,\
Jeff Garzika341cd02007-10-29 17:15:22 -0400969 const char *buf, size_t count) \
970{ \
971 struct scsi_device *sdev = to_scsi_device(dev); \
972 int val = simple_strtoul(buf, NULL, 0); \
973 if (val == 0) \
974 clear_bit(SDEV_EVT_##Cap_name, sdev->supported_events); \
975 else if (val == 1) \
976 set_bit(SDEV_EVT_##Cap_name, sdev->supported_events); \
977 else \
978 return -EINVAL; \
979 return count; \
980}
981
982#define DECLARE_EVT(name, Cap_name) \
983 DECLARE_EVT_SHOW(name, Cap_name) \
984 DECLARE_EVT_STORE(name, Cap_name) \
985 static DEVICE_ATTR(evt_##name, S_IRUGO, sdev_show_evt_##name, \
986 sdev_store_evt_##name);
987#define REF_EVT(name) &dev_attr_evt_##name.attr
988
989DECLARE_EVT(media_change, MEDIA_CHANGE)
Ewan D. Milne279afdf2013-08-08 15:07:48 -0400990DECLARE_EVT(inquiry_change_reported, INQUIRY_CHANGE_REPORTED)
991DECLARE_EVT(capacity_change_reported, CAPACITY_CHANGE_REPORTED)
992DECLARE_EVT(soft_threshold_reached, SOFT_THRESHOLD_REACHED_REPORTED)
993DECLARE_EVT(mode_parameter_change_reported, MODE_PARAMETER_CHANGE_REPORTED)
994DECLARE_EVT(lun_change_reported, LUN_CHANGE_REPORTED)
Jeff Garzika341cd02007-10-29 17:15:22 -0400995
Tony Jonesee959b02008-02-22 00:13:36 +0100996static ssize_t
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100997sdev_store_queue_depth(struct device *dev, struct device_attribute *attr,
998 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700999{
1000 int depth, retval;
1001 struct scsi_device *sdev = to_scsi_device(dev);
1002 struct scsi_host_template *sht = sdev->host->hostt;
1003
1004 if (!sht->change_queue_depth)
1005 return -EINVAL;
1006
1007 depth = simple_strtoul(buf, NULL, 0);
1008
Jens Axboe1278dd682015-07-13 08:24:39 -06001009 if (depth < 1 || depth > sdev->host->can_queue)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010 return -EINVAL;
1011
Christoph Hellwigdb5ed4d2014-11-13 15:08:42 +01001012 retval = sht->change_queue_depth(sdev, depth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 if (retval < 0)
1014 return retval;
1015
Vasu Dev4a840672009-10-22 15:46:33 -07001016 sdev->max_queue_depth = sdev->queue_depth;
1017
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018 return count;
1019}
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001020sdev_show_function(queue_depth, "%d\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001022static DEVICE_ATTR(queue_depth, S_IRUGO | S_IWUSR, sdev_show_queue_depth,
1023 sdev_store_queue_depth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024
Hannes Reinecke248d4fe2015-12-01 10:16:56 +01001025static ssize_t
1026sdev_show_wwid(struct device *dev, struct device_attribute *attr,
1027 char *buf)
1028{
1029 struct scsi_device *sdev = to_scsi_device(dev);
1030 ssize_t count;
1031
1032 count = scsi_vpd_lun_id(sdev, buf, PAGE_SIZE);
1033 if (count > 0) {
1034 buf[count] = '\n';
1035 count++;
1036 }
1037 return count;
1038}
1039static DEVICE_ATTR(wwid, S_IRUGO, sdev_show_wwid, NULL);
1040
Bart Van Assche093b8882017-12-12 10:23:28 -08001041#define BLIST_FLAG_NAME(name) \
Martin Wilck14098802018-04-18 01:35:08 +02001042 [const_ilog2((__force __u64)BLIST_##name)] = #name
Hannes Reinecke345e2962017-10-02 16:26:34 +02001043static const char *const sdev_bflags_name[] = {
1044#include "scsi_devinfo_tbl.c"
1045};
1046#undef BLIST_FLAG_NAME
1047
1048static ssize_t
1049sdev_show_blacklist(struct device *dev, struct device_attribute *attr,
1050 char *buf)
1051{
1052 struct scsi_device *sdev = to_scsi_device(dev);
1053 int i;
1054 ssize_t len = 0;
1055
1056 for (i = 0; i < sizeof(sdev->sdev_bflags) * BITS_PER_BYTE; i++) {
1057 const char *name = NULL;
1058
Bart Van Assche093b8882017-12-12 10:23:28 -08001059 if (!(sdev->sdev_bflags & (__force blist_flags_t)BIT(i)))
Hannes Reinecke345e2962017-10-02 16:26:34 +02001060 continue;
1061 if (i < ARRAY_SIZE(sdev_bflags_name) && sdev_bflags_name[i])
1062 name = sdev_bflags_name[i];
1063
1064 if (name)
Takashi Iwai81546b32020-03-15 10:42:40 +01001065 len += scnprintf(buf + len, PAGE_SIZE - len,
1066 "%s%s", len ? " " : "", name);
Hannes Reinecke345e2962017-10-02 16:26:34 +02001067 else
Takashi Iwai81546b32020-03-15 10:42:40 +01001068 len += scnprintf(buf + len, PAGE_SIZE - len,
1069 "%sINVALID_BIT(%d)", len ? " " : "", i);
Hannes Reinecke345e2962017-10-02 16:26:34 +02001070 }
1071 if (len)
Takashi Iwai81546b32020-03-15 10:42:40 +01001072 len += scnprintf(buf + len, PAGE_SIZE - len, "\n");
Hannes Reinecke345e2962017-10-02 16:26:34 +02001073 return len;
1074}
1075static DEVICE_ATTR(blacklist, S_IRUGO, sdev_show_blacklist, NULL);
1076
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001077#ifdef CONFIG_SCSI_DH
1078static ssize_t
1079sdev_show_dh_state(struct device *dev, struct device_attribute *attr,
1080 char *buf)
1081{
1082 struct scsi_device *sdev = to_scsi_device(dev);
1083
1084 if (!sdev->handler)
1085 return snprintf(buf, 20, "detached\n");
1086
1087 return snprintf(buf, 20, "%s\n", sdev->handler->name);
1088}
1089
1090static ssize_t
1091sdev_store_dh_state(struct device *dev, struct device_attribute *attr,
1092 const char *buf, size_t count)
1093{
1094 struct scsi_device *sdev = to_scsi_device(dev);
1095 int err = -EINVAL;
1096
1097 if (sdev->sdev_state == SDEV_CANCEL ||
1098 sdev->sdev_state == SDEV_DEL)
1099 return -ENODEV;
1100
1101 if (!sdev->handler) {
1102 /*
1103 * Attach to a device handler
1104 */
1105 err = scsi_dh_attach(sdev->request_queue, buf);
1106 } else if (!strncmp(buf, "activate", 8)) {
1107 /*
1108 * Activate a device handler
1109 */
1110 if (sdev->handler->activate)
1111 err = sdev->handler->activate(sdev, NULL, NULL);
1112 else
1113 err = 0;
1114 } else if (!strncmp(buf, "detach", 6)) {
1115 /*
1116 * Detach from a device handler
1117 */
1118 sdev_printk(KERN_WARNING, sdev,
1119 "can't detach handler %s.\n",
1120 sdev->handler->name);
1121 err = -EINVAL;
1122 }
1123
1124 return err < 0 ? err : count;
1125}
1126
1127static DEVICE_ATTR(dh_state, S_IRUGO | S_IWUSR, sdev_show_dh_state,
1128 sdev_store_dh_state);
Hannes Reinecke77c9df92016-03-03 07:54:07 +01001129
1130static ssize_t
1131sdev_show_access_state(struct device *dev,
1132 struct device_attribute *attr,
1133 char *buf)
1134{
1135 struct scsi_device *sdev = to_scsi_device(dev);
1136 unsigned char access_state;
1137 const char *access_state_name;
1138
1139 if (!sdev->handler)
1140 return -EINVAL;
1141
1142 access_state = (sdev->access_state & SCSI_ACCESS_STATE_MASK);
1143 access_state_name = scsi_access_state_name(access_state);
1144
1145 return sprintf(buf, "%s\n",
1146 access_state_name ? access_state_name : "unknown");
1147}
1148static DEVICE_ATTR(access_state, S_IRUGO, sdev_show_access_state, NULL);
1149
1150static ssize_t
1151sdev_show_preferred_path(struct device *dev,
1152 struct device_attribute *attr,
1153 char *buf)
1154{
1155 struct scsi_device *sdev = to_scsi_device(dev);
1156
1157 if (!sdev->handler)
1158 return -EINVAL;
1159
1160 if (sdev->access_state & SCSI_ACCESS_STATE_PREFERRED)
1161 return sprintf(buf, "1\n");
1162 else
1163 return sprintf(buf, "0\n");
1164}
1165static DEVICE_ATTR(preferred_path, S_IRUGO, sdev_show_preferred_path, NULL);
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001166#endif
1167
Tony Jonesee959b02008-02-22 00:13:36 +01001168static ssize_t
Vasu Dev4a840672009-10-22 15:46:33 -07001169sdev_show_queue_ramp_up_period(struct device *dev,
1170 struct device_attribute *attr,
1171 char *buf)
1172{
1173 struct scsi_device *sdev;
1174 sdev = to_scsi_device(dev);
1175 return snprintf(buf, 20, "%u\n",
1176 jiffies_to_msecs(sdev->queue_ramp_up_period));
1177}
1178
1179static ssize_t
1180sdev_store_queue_ramp_up_period(struct device *dev,
1181 struct device_attribute *attr,
1182 const char *buf, size_t count)
1183{
1184 struct scsi_device *sdev = to_scsi_device(dev);
Daniel Walterf7c65af2014-08-08 14:24:05 -07001185 unsigned int period;
Vasu Dev4a840672009-10-22 15:46:33 -07001186
Daniel Walterf7c65af2014-08-08 14:24:05 -07001187 if (kstrtouint(buf, 10, &period))
Vasu Dev4a840672009-10-22 15:46:33 -07001188 return -EINVAL;
1189
1190 sdev->queue_ramp_up_period = msecs_to_jiffies(period);
Peter Oberparleiter5cb9b402015-10-26 15:54:23 +01001191 return count;
Vasu Dev4a840672009-10-22 15:46:33 -07001192}
1193
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001194static DEVICE_ATTR(queue_ramp_up_period, S_IRUGO | S_IWUSR,
1195 sdev_show_queue_ramp_up_period,
1196 sdev_store_queue_ramp_up_period);
Vasu Dev4a840672009-10-22 15:46:33 -07001197
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001198static umode_t scsi_sdev_attr_is_visible(struct kobject *kobj,
1199 struct attribute *attr, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200{
Guosong Su9e7bd9452020-02-25 18:04:11 +08001201 struct device *dev = kobj_to_dev(kobj);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 struct scsi_device *sdev = to_scsi_device(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001205 if (attr == &dev_attr_queue_depth.attr &&
1206 !sdev->host->hostt->change_queue_depth)
1207 return S_IRUGO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001209 if (attr == &dev_attr_queue_ramp_up_period.attr &&
1210 !sdev->host->hostt->change_queue_depth)
1211 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212
Hannes Reinecke77c9df92016-03-03 07:54:07 +01001213#ifdef CONFIG_SCSI_DH
1214 if (attr == &dev_attr_access_state.attr &&
1215 !sdev->handler)
1216 return 0;
1217 if (attr == &dev_attr_preferred_path.attr &&
1218 !sdev->handler)
1219 return 0;
1220#endif
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001221 return attr->mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001222}
1223
Hannes Reinecke7e479762016-03-03 07:41:24 +01001224static umode_t scsi_sdev_bin_attr_is_visible(struct kobject *kobj,
1225 struct bin_attribute *attr, int i)
1226{
Guosong Su9e7bd9452020-02-25 18:04:11 +08001227 struct device *dev = kobj_to_dev(kobj);
Hannes Reinecke7e479762016-03-03 07:41:24 +01001228 struct scsi_device *sdev = to_scsi_device(dev);
1229
1230
Ryan Attardd188b062019-09-26 11:22:17 -05001231 if (attr == &dev_attr_vpd_pg0 && !sdev->vpd_pg0)
1232 return 0;
1233
Hannes Reinecke7e479762016-03-03 07:41:24 +01001234 if (attr == &dev_attr_vpd_pg80 && !sdev->vpd_pg80)
1235 return 0;
1236
Hannes Reinecke68887582016-03-10 11:25:26 +01001237 if (attr == &dev_attr_vpd_pg83 && !sdev->vpd_pg83)
Hannes Reinecke7e479762016-03-03 07:41:24 +01001238 return 0;
1239
Ryan Attardd188b062019-09-26 11:22:17 -05001240 if (attr == &dev_attr_vpd_pg89 && !sdev->vpd_pg89)
1241 return 0;
1242
Hannes Reinecke7e479762016-03-03 07:41:24 +01001243 return S_IRUGO;
1244}
1245
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001246/* Default template for device attributes. May NOT be modified */
1247static struct attribute *scsi_sdev_attrs[] = {
1248 &dev_attr_device_blocked.attr,
1249 &dev_attr_type.attr,
1250 &dev_attr_scsi_level.attr,
1251 &dev_attr_device_busy.attr,
1252 &dev_attr_vendor.attr,
1253 &dev_attr_model.attr,
1254 &dev_attr_rev.attr,
1255 &dev_attr_rescan.attr,
1256 &dev_attr_delete.attr,
1257 &dev_attr_state.attr,
1258 &dev_attr_timeout.attr,
1259 &dev_attr_eh_timeout.attr,
1260 &dev_attr_iocounterbits.attr,
1261 &dev_attr_iorequest_cnt.attr,
1262 &dev_attr_iodone_cnt.attr,
1263 &dev_attr_ioerr_cnt.attr,
1264 &dev_attr_modalias.attr,
1265 &dev_attr_queue_depth.attr,
1266 &dev_attr_queue_type.attr,
Hannes Reinecke248d4fe2015-12-01 10:16:56 +01001267 &dev_attr_wwid.attr,
Hannes Reinecke345e2962017-10-02 16:26:34 +02001268 &dev_attr_blacklist.attr,
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001269#ifdef CONFIG_SCSI_DH
1270 &dev_attr_dh_state.attr,
Hannes Reinecke77c9df92016-03-03 07:54:07 +01001271 &dev_attr_access_state.attr,
1272 &dev_attr_preferred_path.attr,
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001273#endif
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001274 &dev_attr_queue_ramp_up_period.attr,
1275 REF_EVT(media_change),
1276 REF_EVT(inquiry_change_reported),
1277 REF_EVT(capacity_change_reported),
1278 REF_EVT(soft_threshold_reached),
1279 REF_EVT(mode_parameter_change_reported),
1280 REF_EVT(lun_change_reported),
1281 NULL
1282};
1283
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001284static struct bin_attribute *scsi_sdev_bin_attrs[] = {
Ryan Attardd188b062019-09-26 11:22:17 -05001285 &dev_attr_vpd_pg0,
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001286 &dev_attr_vpd_pg83,
1287 &dev_attr_vpd_pg80,
Ryan Attardd188b062019-09-26 11:22:17 -05001288 &dev_attr_vpd_pg89,
Johannes Thumshirn92e62462015-11-09 10:56:57 +01001289 &dev_attr_inquiry,
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001290 NULL
1291};
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001292static struct attribute_group scsi_sdev_attr_group = {
1293 .attrs = scsi_sdev_attrs,
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001294 .bin_attrs = scsi_sdev_bin_attrs,
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001295 .is_visible = scsi_sdev_attr_is_visible,
Hannes Reinecke7e479762016-03-03 07:41:24 +01001296 .is_bin_visible = scsi_sdev_bin_attr_is_visible,
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001297};
1298
1299static const struct attribute_group *scsi_sdev_attr_groups[] = {
1300 &scsi_sdev_attr_group,
1301 NULL
1302};
1303
James Bottomley643eb2d2008-03-22 22:42:27 -05001304static int scsi_target_add(struct scsi_target *starget)
1305{
1306 int error;
1307
1308 if (starget->state != STARGET_CREATED)
1309 return 0;
1310
1311 error = device_add(&starget->dev);
1312 if (error) {
1313 dev_err(&starget->dev, "target device_add failed, error %d\n", error);
James Bottomley643eb2d2008-03-22 22:42:27 -05001314 return error;
1315 }
1316 transport_add_device(&starget->dev);
1317 starget->state = STARGET_RUNNING;
1318
Alan Sternbc4f2402010-06-17 10:41:42 -04001319 pm_runtime_set_active(&starget->dev);
1320 pm_runtime_enable(&starget->dev);
1321 device_enable_async_suspend(&starget->dev);
1322
James Bottomley643eb2d2008-03-22 22:42:27 -05001323 return 0;
1324}
1325
Linus Torvalds1da177e2005-04-16 15:20:36 -07001326/**
1327 * scsi_sysfs_add_sdev - add scsi device to sysfs
1328 * @sdev: scsi_device to add
1329 *
1330 * Return value:
1331 * 0 on Success / non-zero on Failure
1332 **/
1333int scsi_sysfs_add_sdev(struct scsi_device *sdev)
1334{
1335 int error, i;
James Bottomley80ed71c2007-07-19 10:15:10 -05001336 struct request_queue *rq = sdev->request_queue;
James Bottomley643eb2d2008-03-22 22:42:27 -05001337 struct scsi_target *starget = sdev->sdev_target;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338
James Bottomley643eb2d2008-03-22 22:42:27 -05001339 error = scsi_target_add(starget);
1340 if (error)
1341 return error;
1342
1343 transport_configure_device(&starget->dev);
Alan Sternbc4f2402010-06-17 10:41:42 -04001344
Rafael J. Wysocki4cb077d2010-02-08 19:18:26 +01001345 device_enable_async_suspend(&sdev->sdev_gendev);
Alan Sternbc4f2402010-06-17 10:41:42 -04001346 scsi_autopm_get_target(starget);
1347 pm_runtime_set_active(&sdev->sdev_gendev);
Stanley Chuc74f8052019-09-16 23:56:49 +08001348 if (!sdev->rpm_autosuspend)
1349 pm_runtime_forbid(&sdev->sdev_gendev);
Alan Sternbc4f2402010-06-17 10:41:42 -04001350 pm_runtime_enable(&sdev->sdev_gendev);
1351 scsi_autopm_put_target(starget);
1352
Alan Sternbc4f2402010-06-17 10:41:42 -04001353 scsi_autopm_get_device(sdev);
1354
Hannes Reinecke2930f812017-09-20 09:18:52 +02001355 scsi_dh_add_device(sdev);
Christoph Hellwig086b91d2015-08-27 14:16:57 +02001356
Hannes Reinecke4cd24592016-03-03 07:54:12 +01001357 error = device_add(&sdev->sdev_gendev);
1358 if (error) {
1359 sdev_printk(KERN_INFO, sdev,
1360 "failed to add device: %d\n", error);
Hannes Reinecke4cd24592016-03-03 07:54:12 +01001361 return error;
1362 }
1363
Rafael J. Wysocki4cb077d2010-02-08 19:18:26 +01001364 device_enable_async_suspend(&sdev->sdev_dev);
Tony Jonesee959b02008-02-22 00:13:36 +01001365 error = device_add(&sdev->sdev_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001366 if (error) {
Alan Stern73d8c342010-11-15 16:03:04 -05001367 sdev_printk(KERN_INFO, sdev,
1368 "failed to add class device: %d\n", error);
James Bottomley860dc732009-11-19 17:48:29 -05001369 device_del(&sdev->sdev_gendev);
Alan Sternee37e092010-02-12 12:13:55 -05001370 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371 }
James Bottomley860dc732009-11-19 17:48:29 -05001372 transport_add_device(&sdev->sdev_gendev);
1373 sdev->is_visible = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374
Christoph Hellwig17cb9602018-03-13 17:28:41 +01001375 error = bsg_scsi_register_queue(rq, &sdev->sdev_gendev);
James Bottomley80ed71c2007-07-19 10:15:10 -05001376 if (error)
James Bottomley860dc732009-11-19 17:48:29 -05001377 /* we're treating error on bsg register as non-fatal,
1378 * so pretend nothing went wrong */
James Bottomley80ed71c2007-07-19 10:15:10 -05001379 sdev_printk(KERN_INFO, sdev,
1380 "Failed to register bsg queue, errno=%d\n", error);
1381
Kay Sieversbfd12942007-09-11 17:00:14 +02001382 /* add additional host specific attributes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 if (sdev->host->hostt->sdev_attrs) {
1384 for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) {
Kay Sieversbfd12942007-09-11 17:00:14 +02001385 error = device_create_file(&sdev->sdev_gendev,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386 sdev->host->hostt->sdev_attrs[i]);
James Bottomley860dc732009-11-19 17:48:29 -05001387 if (error)
Alan Sternee37e092010-02-12 12:13:55 -05001388 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001389 }
1390 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001391
Stanislav Nijnikov86b87cd2018-02-15 14:14:08 +02001392 if (sdev->host->hostt->sdev_groups) {
1393 error = sysfs_create_groups(&sdev->sdev_gendev.kobj,
1394 sdev->host->hostt->sdev_groups);
1395 if (error)
1396 return error;
1397 }
1398
Subhash Jadavani6fe8c1d2014-09-10 14:54:09 +03001399 scsi_autopm_put_device(sdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401}
1402
Alan Stern903f4fed2005-07-26 10:20:53 -04001403void __scsi_remove_device(struct scsi_device *sdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404{
James Bottomleydf133c22005-11-06 11:47:08 -06001405 struct device *dev = &sdev->sdev_gendev;
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001406 int res;
James Bottomleydf133c22005-11-06 11:47:08 -06001407
Vitaly Kuznetsovbe821fd2015-11-19 14:02:19 +01001408 /*
1409 * This cleanup path is not reentrant and while it is impossible
1410 * to get a new reference with scsi_device_get() someone can still
1411 * hold a previously acquired one.
1412 */
1413 if (sdev->sdev_state == SDEV_DEL)
1414 return;
1415
James Bottomley860dc732009-11-19 17:48:29 -05001416 if (sdev->is_visible) {
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001417 /*
1418 * If scsi_internal_target_block() is running concurrently,
1419 * wait until it has finished before changing the device state.
1420 */
1421 mutex_lock(&sdev->state_mutex);
Bart Van Assche255ee932017-06-02 14:21:57 -07001422 /*
1423 * If blocked, we go straight to DEL and restart the queue so
1424 * any commands issued during driver shutdown (like sync
1425 * cache) are errored immediately.
1426 */
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001427 res = scsi_device_set_state(sdev, SDEV_CANCEL);
Bart Van Assche255ee932017-06-02 14:21:57 -07001428 if (res != 0) {
1429 res = scsi_device_set_state(sdev, SDEV_DEL);
1430 if (res == 0)
1431 scsi_start_queue(sdev);
1432 }
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001433 mutex_unlock(&sdev->state_mutex);
1434
1435 if (res != 0)
James Bottomley860dc732009-11-19 17:48:29 -05001436 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437
Stanislav Nijnikov86b87cd2018-02-15 14:14:08 +02001438 if (sdev->host->hostt->sdev_groups)
1439 sysfs_remove_groups(&sdev->sdev_gendev.kobj,
1440 sdev->host->hostt->sdev_groups);
1441
James Bottomley860dc732009-11-19 17:48:29 -05001442 bsg_unregister_queue(sdev->request_queue);
1443 device_unregister(&sdev->sdev_dev);
1444 transport_remove_device(dev);
Bart Van Asschee619e6c2015-11-20 14:11:01 -08001445 device_del(dev);
1446 } else
1447 put_device(&sdev->sdev_dev);
Bart Van Asscheb4854622012-06-29 15:36:07 +00001448
1449 /*
1450 * Stop accepting new requests and wait until all queuecommand() and
1451 * scsi_run_queue() invocations have finished before tearing down the
1452 * device.
1453 */
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001454 mutex_lock(&sdev->state_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 scsi_device_set_state(sdev, SDEV_DEL);
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001456 mutex_unlock(&sdev->state_mutex);
1457
Bart Van Asscheb4854622012-06-29 15:36:07 +00001458 blk_cleanup_queue(sdev->request_queue);
1459 cancel_work_sync(&sdev->requeue_work);
1460
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461 if (sdev->host->hostt->slave_destroy)
1462 sdev->host->hostt->slave_destroy(sdev);
James Bottomleydf133c22005-11-06 11:47:08 -06001463 transport_destroy_device(dev);
James Bottomley86cbfb52011-04-22 10:39:59 -05001464
James Bottomleye63ed0d2014-01-21 07:00:50 -08001465 /*
1466 * Paired with the kref_get() in scsi_sysfs_initialize(). We have
dudengkeeee89102021-03-26 14:09:02 +08001467 * removed sysfs visibility from the device, so make the target
James Bottomleye63ed0d2014-01-21 07:00:50 -08001468 * invisible if this was the last device underneath it.
1469 */
1470 scsi_target_reap(scsi_target(sdev));
1471
James Bottomleydf133c22005-11-06 11:47:08 -06001472 put_device(dev);
Alan Stern903f4fed2005-07-26 10:20:53 -04001473}
1474
1475/**
1476 * scsi_remove_device - unregister a device from the scsi bus
1477 * @sdev: scsi_device to unregister
1478 **/
1479void scsi_remove_device(struct scsi_device *sdev)
1480{
Alan Stern54195002005-09-15 21:52:51 -04001481 struct Scsi_Host *shost = sdev->host;
1482
Arjan van de Ven0b950672006-01-11 13:16:10 +01001483 mutex_lock(&shost->scan_mutex);
Alan Stern903f4fed2005-07-26 10:20:53 -04001484 __scsi_remove_device(sdev);
Arjan van de Ven0b950672006-01-11 13:16:10 +01001485 mutex_unlock(&shost->scan_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486}
1487EXPORT_SYMBOL(scsi_remove_device);
1488
Adrian Bunk44818ef2007-07-09 11:59:59 -07001489static void __scsi_remove_target(struct scsi_target *starget)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490{
1491 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1492 unsigned long flags;
Alan Sterna64358d2005-07-26 10:27:10 -04001493 struct scsi_device *sdev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494
1495 spin_lock_irqsave(shost->host_lock, flags);
Alan Sterna64358d2005-07-26 10:27:10 -04001496 restart:
1497 list_for_each_entry(sdev, &shost->__devices, siblings) {
Hannes Reineckefbce4d92017-10-04 10:28:56 +02001498 /*
1499 * We cannot call scsi_device_get() here, as
1500 * we might've been called from rmmod() causing
1501 * scsi_device_get() to fail the module_is_live()
1502 * check.
1503 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 if (sdev->channel != starget->channel ||
Hannes Reinecke81b6c992017-12-13 14:21:37 +01001505 sdev->id != starget->id)
1506 continue;
1507 if (sdev->sdev_state == SDEV_DEL ||
1508 sdev->sdev_state == SDEV_CANCEL ||
Hannes Reineckefbce4d92017-10-04 10:28:56 +02001509 !get_device(&sdev->sdev_gendev))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 continue;
1511 spin_unlock_irqrestore(shost->host_lock, flags);
1512 scsi_remove_device(sdev);
Hannes Reineckefbce4d92017-10-04 10:28:56 +02001513 put_device(&sdev->sdev_gendev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514 spin_lock_irqsave(shost->host_lock, flags);
Alan Sterna64358d2005-07-26 10:27:10 -04001515 goto restart;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 }
1517 spin_unlock_irqrestore(shost->host_lock, flags);
mochel@digitalimplant.org20b1e672005-03-24 19:03:59 -08001518}
1519
Linus Torvalds1da177e2005-04-16 15:20:36 -07001520/**
1521 * scsi_remove_target - try to remove a target and all its devices
1522 * @dev: generic starget or parent of generic stargets to be removed
1523 *
1524 * Note: This is slightly racy. It is possible that if the user
1525 * requests the addition of another device then the target won't be
1526 * removed.
1527 */
1528void scsi_remove_target(struct device *dev)
1529{
Dan Williams3b661a92012-06-21 23:47:28 -07001530 struct Scsi_Host *shost = dev_to_shost(dev->parent);
Johannes Thumshirn305c2e72016-04-05 11:50:45 +02001531 struct scsi_target *starget;
Dan Williams3b661a92012-06-21 23:47:28 -07001532 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001533
Christoph Hellwig40998192015-10-19 16:35:46 +02001534restart:
Dan Williams3b661a92012-06-21 23:47:28 -07001535 spin_lock_irqsave(shost->host_lock, flags);
1536 list_for_each_entry(starget, &shost->__targets, siblings) {
James Bottomley90a88d62016-02-10 08:03:26 -08001537 if (starget->state == STARGET_DEL ||
Ewan D. Milnef9279c92017-06-27 14:55:58 -04001538 starget->state == STARGET_REMOVE ||
1539 starget->state == STARGET_CREATED_REMOVE)
Dan Williams3b661a92012-06-21 23:47:28 -07001540 continue;
1541 if (starget->dev.parent == dev || &starget->dev == dev) {
James Bottomleye63ed0d2014-01-21 07:00:50 -08001542 kref_get(&starget->reap_ref);
Ewan D. Milnef9279c92017-06-27 14:55:58 -04001543 if (starget->state == STARGET_CREATED)
1544 starget->state = STARGET_CREATED_REMOVE;
1545 else
1546 starget->state = STARGET_REMOVE;
Dan Williamsbc3f02a2012-08-28 22:12:10 -07001547 spin_unlock_irqrestore(shost->host_lock, flags);
Dan Williamsbc3f02a2012-08-28 22:12:10 -07001548 __scsi_remove_target(starget);
Christoph Hellwig40998192015-10-19 16:35:46 +02001549 scsi_target_reap(starget);
1550 goto restart;
Dan Williams3b661a92012-06-21 23:47:28 -07001551 }
1552 }
1553 spin_unlock_irqrestore(shost->host_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001554}
1555EXPORT_SYMBOL(scsi_remove_target);
1556
1557int scsi_register_driver(struct device_driver *drv)
1558{
1559 drv->bus = &scsi_bus_type;
1560
1561 return driver_register(drv);
1562}
1563EXPORT_SYMBOL(scsi_register_driver);
1564
1565int scsi_register_interface(struct class_interface *intf)
1566{
1567 intf->class = &sdev_class;
1568
1569 return class_interface_register(intf);
1570}
1571EXPORT_SYMBOL(scsi_register_interface);
1572
Linus Torvalds1da177e2005-04-16 15:20:36 -07001573/**
1574 * scsi_sysfs_add_host - add scsi host to subsystem
1575 * @shost: scsi host struct to add to subsystem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 **/
1577int scsi_sysfs_add_host(struct Scsi_Host *shost)
1578{
1579 int error, i;
1580
Hannes Reineckef7120a42008-03-18 14:32:28 +01001581 /* add host specific attributes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582 if (shost->hostt->shost_attrs) {
1583 for (i = 0; shost->hostt->shost_attrs[i]; i++) {
Tony Jonesee959b02008-02-22 00:13:36 +01001584 error = device_create_file(&shost->shost_dev,
Hannes Reineckef7120a42008-03-18 14:32:28 +01001585 shost->hostt->shost_attrs[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 if (error)
1587 return error;
1588 }
1589 }
1590
1591 transport_register_device(&shost->shost_gendev);
James Bottomleyd52b3812008-01-05 09:38:30 -06001592 transport_configure_device(&shost->shost_gendev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 return 0;
1594}
1595
Kay Sieversbfd12942007-09-11 17:00:14 +02001596static struct device_type scsi_dev_type = {
1597 .name = "scsi_device",
1598 .release = scsi_device_dev_release,
1599 .groups = scsi_sdev_attr_groups,
1600};
1601
Linus Torvalds1da177e2005-04-16 15:20:36 -07001602void scsi_sysfs_device_initialize(struct scsi_device *sdev)
1603{
1604 unsigned long flags;
1605 struct Scsi_Host *shost = sdev->host;
1606 struct scsi_target *starget = sdev->sdev_target;
1607
1608 device_initialize(&sdev->sdev_gendev);
1609 sdev->sdev_gendev.bus = &scsi_bus_type;
Kay Sieversbfd12942007-09-11 17:00:14 +02001610 sdev->sdev_gendev.type = &scsi_dev_type;
Hannes Reinecke9cb78c12014-06-25 15:27:36 +02001611 dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
Kay Sievers71610f52008-12-03 22:41:36 +01001612 sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
1613
Tony Jonesee959b02008-02-22 00:13:36 +01001614 device_initialize(&sdev->sdev_dev);
James Bottomley37e6ba02009-10-02 13:30:08 -05001615 sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev);
Tony Jonesee959b02008-02-22 00:13:36 +01001616 sdev->sdev_dev.class = &sdev_class;
Hannes Reinecke9cb78c12014-06-25 15:27:36 +02001617 dev_set_name(&sdev->sdev_dev, "%d:%d:%d:%llu",
Kay Sievers71610f52008-12-03 22:41:36 +01001618 sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
Alan Stern50c4e962014-09-02 11:35:50 -04001619 /*
1620 * Get a default scsi_level from the target (derived from sibling
1621 * devices). This is the best we can do for guessing how to set
1622 * sdev->lun_in_cdb for the initial INQUIRY command. For LUN 0 the
1623 * setting doesn't matter, because all the bits are zero anyway.
1624 * But it does matter for higher LUNs.
1625 */
Alan Stern7c9d6f12007-01-08 11:12:32 -05001626 sdev->scsi_level = starget->scsi_level;
Alan Stern50c4e962014-09-02 11:35:50 -04001627 if (sdev->scsi_level <= SCSI_2 &&
1628 sdev->scsi_level != SCSI_UNKNOWN &&
1629 !shost->no_scsi2_lun_in_cdb)
1630 sdev->lun_in_cdb = 1;
1631
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632 transport_setup_device(&sdev->sdev_gendev);
1633 spin_lock_irqsave(shost->host_lock, flags);
1634 list_add_tail(&sdev->same_target_siblings, &starget->devices);
1635 list_add_tail(&sdev->siblings, &shost->__devices);
1636 spin_unlock_irqrestore(shost->host_lock, flags);
James Bottomleye63ed0d2014-01-21 07:00:50 -08001637 /*
1638 * device can now only be removed via __scsi_remove_device() so hold
1639 * the target. Target will be held in CREATED state until something
1640 * beneath it becomes visible (in which case it moves to RUNNING)
1641 */
1642 kref_get(&starget->reap_ref);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001643}
1644
1645int scsi_is_sdev_device(const struct device *dev)
1646{
Kay Sievers13ba9bc2007-09-26 19:54:49 +02001647 return dev->type == &scsi_dev_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001648}
1649EXPORT_SYMBOL(scsi_is_sdev_device);
1650
1651/* A blank transport template that is used in drivers that don't
1652 * yet implement Transport Attributes */
1653struct scsi_transport_template blank_transport_template = { { { {NULL, }, }, }, };