blob: 32489d25158f8e3afc91d04298f82c0fecc58660 [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 /*
810 * If the device state changes to SDEV_RUNNING, we need to run
811 * the queue to avoid I/O hang.
812 */
813 if (ret == 0 && state == SDEV_RUNNING)
814 blk_mq_run_hw_queues(sdev->request_queue, true);
Bart Van Assche0db6ca82017-06-02 14:21:55 -0700815 mutex_unlock(&sdev->state_mutex);
816
817 return ret == 0 ? count : -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818}
819
820static ssize_t
Yani Ioannou10523b32005-05-17 06:43:37 -0400821show_state_field(struct device *dev, struct device_attribute *attr, char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822{
823 struct scsi_device *sdev = to_scsi_device(dev);
824 const char *name = scsi_device_state_name(sdev->sdev_state);
825
826 if (!name)
827 return -EINVAL;
828
829 return snprintf(buf, 20, "%s\n", name);
830}
831
832static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_state_field, store_state_field);
833
834static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100835show_queue_type_field(struct device *dev, struct device_attribute *attr,
836 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837{
838 struct scsi_device *sdev = to_scsi_device(dev);
839 const char *name = "none";
840
Christoph Hellwig609aa222014-10-30 11:54:58 +0100841 if (sdev->simple_tags)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842 name = "simple";
843
844 return snprintf(buf, 20, "%s\n", name);
845}
846
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100847static ssize_t
848store_queue_type_field(struct device *dev, struct device_attribute *attr,
849 const char *buf, size_t count)
850{
851 struct scsi_device *sdev = to_scsi_device(dev);
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100852
Christoph Hellwigefc3c1d2014-11-24 15:36:18 +0100853 if (!sdev->tagged_supported)
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100854 return -EINVAL;
Christoph Hellwigefc3c1d2014-11-24 15:36:18 +0100855
856 sdev_printk(KERN_INFO, sdev,
857 "ignoring write to deprecated queue_type attribute");
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100858 return count;
859}
860
861static DEVICE_ATTR(queue_type, S_IRUGO | S_IWUSR, show_queue_type_field,
862 store_queue_type_field);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100864#define sdev_vpd_pg_attr(_page) \
865static ssize_t \
866show_vpd_##_page(struct file *filp, struct kobject *kobj, \
867 struct bin_attribute *bin_attr, \
868 char *buf, loff_t off, size_t count) \
869{ \
Guosong Su9e7bd9452020-02-25 18:04:11 +0800870 struct device *dev = kobj_to_dev(kobj); \
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100871 struct scsi_device *sdev = to_scsi_device(dev); \
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700872 struct scsi_vpd *vpd_page; \
873 int ret = -EINVAL; \
874 \
Hannes Reinecke09e2b0b2015-11-09 13:24:28 +0100875 rcu_read_lock(); \
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700876 vpd_page = rcu_dereference(sdev->vpd_##_page); \
877 if (vpd_page) \
878 ret = memory_read_from_buffer(buf, count, &off, \
879 vpd_page->data, vpd_page->len); \
Hannes Reinecke09e2b0b2015-11-09 13:24:28 +0100880 rcu_read_unlock(); \
Bart Van Asscheccf1e002017-08-29 08:50:13 -0700881 return ret; \
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100882} \
883static struct bin_attribute dev_attr_vpd_##_page = { \
884 .attr = {.name = __stringify(vpd_##_page), .mode = S_IRUGO }, \
885 .size = 0, \
886 .read = show_vpd_##_page, \
887};
888
889sdev_vpd_pg_attr(pg83);
890sdev_vpd_pg_attr(pg80);
Ryan Attardd188b062019-09-26 11:22:17 -0500891sdev_vpd_pg_attr(pg89);
892sdev_vpd_pg_attr(pg0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893
Johannes Thumshirn92e62462015-11-09 10:56:57 +0100894static ssize_t show_inquiry(struct file *filep, struct kobject *kobj,
895 struct bin_attribute *bin_attr,
896 char *buf, loff_t off, size_t count)
897{
Guosong Su9e7bd9452020-02-25 18:04:11 +0800898 struct device *dev = kobj_to_dev(kobj);
Johannes Thumshirn92e62462015-11-09 10:56:57 +0100899 struct scsi_device *sdev = to_scsi_device(dev);
900
901 if (!sdev->inquiry)
902 return -EINVAL;
903
904 return memory_read_from_buffer(buf, count, &off, sdev->inquiry,
905 sdev->inquiry_len);
906}
907
908static struct bin_attribute dev_attr_inquiry = {
909 .attr = {
910 .name = "inquiry",
911 .mode = S_IRUGO,
912 },
913 .size = 0,
914 .read = show_inquiry,
915};
916
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917static ssize_t
Hannes Reineckeb3ae8782014-03-15 09:51:49 +0100918show_iostat_counterbits(struct device *dev, struct device_attribute *attr,
919 char *buf)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920{
921 return snprintf(buf, 20, "%d\n", (int)sizeof(atomic_t) * 8);
922}
923
924static DEVICE_ATTR(iocounterbits, S_IRUGO, show_iostat_counterbits, NULL);
925
926#define show_sdev_iostat(field) \
927static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100928show_iostat_##field(struct device *dev, struct device_attribute *attr, \
929 char *buf) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930{ \
931 struct scsi_device *sdev = to_scsi_device(dev); \
932 unsigned long long count = atomic_read(&sdev->field); \
933 return snprintf(buf, 20, "0x%llx\n", count); \
934} \
935static DEVICE_ATTR(field, S_IRUGO, show_iostat_##field, NULL)
936
937show_sdev_iostat(iorequest_cnt);
938show_sdev_iostat(iodone_cnt);
939show_sdev_iostat(ioerr_cnt);
940
Michael Tokarevd7b8bcb02006-10-27 16:02:37 +0400941static ssize_t
942sdev_show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
943{
944 struct scsi_device *sdev;
945 sdev = to_scsi_device(dev);
946 return snprintf (buf, 20, SCSI_DEVICE_MODALIAS_FMT "\n", sdev->type);
947}
948static DEVICE_ATTR(modalias, S_IRUGO, sdev_show_modalias, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700949
Jeff Garzika341cd02007-10-29 17:15:22 -0400950#define DECLARE_EVT_SHOW(name, Cap_name) \
951static ssize_t \
952sdev_show_evt_##name(struct device *dev, struct device_attribute *attr, \
Tony Jonesee959b02008-02-22 00:13:36 +0100953 char *buf) \
Jeff Garzika341cd02007-10-29 17:15:22 -0400954{ \
955 struct scsi_device *sdev = to_scsi_device(dev); \
956 int val = test_bit(SDEV_EVT_##Cap_name, sdev->supported_events);\
957 return snprintf(buf, 20, "%d\n", val); \
958}
959
960#define DECLARE_EVT_STORE(name, Cap_name) \
961static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +0100962sdev_store_evt_##name(struct device *dev, struct device_attribute *attr,\
Jeff Garzika341cd02007-10-29 17:15:22 -0400963 const char *buf, size_t count) \
964{ \
965 struct scsi_device *sdev = to_scsi_device(dev); \
966 int val = simple_strtoul(buf, NULL, 0); \
967 if (val == 0) \
968 clear_bit(SDEV_EVT_##Cap_name, sdev->supported_events); \
969 else if (val == 1) \
970 set_bit(SDEV_EVT_##Cap_name, sdev->supported_events); \
971 else \
972 return -EINVAL; \
973 return count; \
974}
975
976#define DECLARE_EVT(name, Cap_name) \
977 DECLARE_EVT_SHOW(name, Cap_name) \
978 DECLARE_EVT_STORE(name, Cap_name) \
979 static DEVICE_ATTR(evt_##name, S_IRUGO, sdev_show_evt_##name, \
980 sdev_store_evt_##name);
981#define REF_EVT(name) &dev_attr_evt_##name.attr
982
983DECLARE_EVT(media_change, MEDIA_CHANGE)
Ewan D. Milne279afdf2013-08-08 15:07:48 -0400984DECLARE_EVT(inquiry_change_reported, INQUIRY_CHANGE_REPORTED)
985DECLARE_EVT(capacity_change_reported, CAPACITY_CHANGE_REPORTED)
986DECLARE_EVT(soft_threshold_reached, SOFT_THRESHOLD_REACHED_REPORTED)
987DECLARE_EVT(mode_parameter_change_reported, MODE_PARAMETER_CHANGE_REPORTED)
988DECLARE_EVT(lun_change_reported, LUN_CHANGE_REPORTED)
Jeff Garzika341cd02007-10-29 17:15:22 -0400989
Tony Jonesee959b02008-02-22 00:13:36 +0100990static ssize_t
Hannes Reinecke276b20d2014-03-15 09:51:47 +0100991sdev_store_queue_depth(struct device *dev, struct device_attribute *attr,
992 const char *buf, size_t count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700993{
994 int depth, retval;
995 struct scsi_device *sdev = to_scsi_device(dev);
996 struct scsi_host_template *sht = sdev->host->hostt;
997
998 if (!sht->change_queue_depth)
999 return -EINVAL;
1000
1001 depth = simple_strtoul(buf, NULL, 0);
1002
Jens Axboe1278dd682015-07-13 08:24:39 -06001003 if (depth < 1 || depth > sdev->host->can_queue)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004 return -EINVAL;
1005
Christoph Hellwigdb5ed4d2014-11-13 15:08:42 +01001006 retval = sht->change_queue_depth(sdev, depth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007 if (retval < 0)
1008 return retval;
1009
Vasu Dev4a840672009-10-22 15:46:33 -07001010 sdev->max_queue_depth = sdev->queue_depth;
1011
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 return count;
1013}
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001014sdev_show_function(queue_depth, "%d\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001015
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001016static DEVICE_ATTR(queue_depth, S_IRUGO | S_IWUSR, sdev_show_queue_depth,
1017 sdev_store_queue_depth);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018
Hannes Reinecke248d4fe2015-12-01 10:16:56 +01001019static ssize_t
1020sdev_show_wwid(struct device *dev, struct device_attribute *attr,
1021 char *buf)
1022{
1023 struct scsi_device *sdev = to_scsi_device(dev);
1024 ssize_t count;
1025
1026 count = scsi_vpd_lun_id(sdev, buf, PAGE_SIZE);
1027 if (count > 0) {
1028 buf[count] = '\n';
1029 count++;
1030 }
1031 return count;
1032}
1033static DEVICE_ATTR(wwid, S_IRUGO, sdev_show_wwid, NULL);
1034
Bart Van Assche093b8882017-12-12 10:23:28 -08001035#define BLIST_FLAG_NAME(name) \
Martin Wilck14098802018-04-18 01:35:08 +02001036 [const_ilog2((__force __u64)BLIST_##name)] = #name
Hannes Reinecke345e2962017-10-02 16:26:34 +02001037static const char *const sdev_bflags_name[] = {
1038#include "scsi_devinfo_tbl.c"
1039};
1040#undef BLIST_FLAG_NAME
1041
1042static ssize_t
1043sdev_show_blacklist(struct device *dev, struct device_attribute *attr,
1044 char *buf)
1045{
1046 struct scsi_device *sdev = to_scsi_device(dev);
1047 int i;
1048 ssize_t len = 0;
1049
1050 for (i = 0; i < sizeof(sdev->sdev_bflags) * BITS_PER_BYTE; i++) {
1051 const char *name = NULL;
1052
Bart Van Assche093b8882017-12-12 10:23:28 -08001053 if (!(sdev->sdev_bflags & (__force blist_flags_t)BIT(i)))
Hannes Reinecke345e2962017-10-02 16:26:34 +02001054 continue;
1055 if (i < ARRAY_SIZE(sdev_bflags_name) && sdev_bflags_name[i])
1056 name = sdev_bflags_name[i];
1057
1058 if (name)
Takashi Iwai81546b32020-03-15 10:42:40 +01001059 len += scnprintf(buf + len, PAGE_SIZE - len,
1060 "%s%s", len ? " " : "", name);
Hannes Reinecke345e2962017-10-02 16:26:34 +02001061 else
Takashi Iwai81546b32020-03-15 10:42:40 +01001062 len += scnprintf(buf + len, PAGE_SIZE - len,
1063 "%sINVALID_BIT(%d)", len ? " " : "", i);
Hannes Reinecke345e2962017-10-02 16:26:34 +02001064 }
1065 if (len)
Takashi Iwai81546b32020-03-15 10:42:40 +01001066 len += scnprintf(buf + len, PAGE_SIZE - len, "\n");
Hannes Reinecke345e2962017-10-02 16:26:34 +02001067 return len;
1068}
1069static DEVICE_ATTR(blacklist, S_IRUGO, sdev_show_blacklist, NULL);
1070
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001071#ifdef CONFIG_SCSI_DH
1072static ssize_t
1073sdev_show_dh_state(struct device *dev, struct device_attribute *attr,
1074 char *buf)
1075{
1076 struct scsi_device *sdev = to_scsi_device(dev);
1077
1078 if (!sdev->handler)
1079 return snprintf(buf, 20, "detached\n");
1080
1081 return snprintf(buf, 20, "%s\n", sdev->handler->name);
1082}
1083
1084static ssize_t
1085sdev_store_dh_state(struct device *dev, struct device_attribute *attr,
1086 const char *buf, size_t count)
1087{
1088 struct scsi_device *sdev = to_scsi_device(dev);
1089 int err = -EINVAL;
1090
1091 if (sdev->sdev_state == SDEV_CANCEL ||
1092 sdev->sdev_state == SDEV_DEL)
1093 return -ENODEV;
1094
1095 if (!sdev->handler) {
1096 /*
1097 * Attach to a device handler
1098 */
1099 err = scsi_dh_attach(sdev->request_queue, buf);
1100 } else if (!strncmp(buf, "activate", 8)) {
1101 /*
1102 * Activate a device handler
1103 */
1104 if (sdev->handler->activate)
1105 err = sdev->handler->activate(sdev, NULL, NULL);
1106 else
1107 err = 0;
1108 } else if (!strncmp(buf, "detach", 6)) {
1109 /*
1110 * Detach from a device handler
1111 */
1112 sdev_printk(KERN_WARNING, sdev,
1113 "can't detach handler %s.\n",
1114 sdev->handler->name);
1115 err = -EINVAL;
1116 }
1117
1118 return err < 0 ? err : count;
1119}
1120
1121static DEVICE_ATTR(dh_state, S_IRUGO | S_IWUSR, sdev_show_dh_state,
1122 sdev_store_dh_state);
Hannes Reinecke77c9df92016-03-03 07:54:07 +01001123
1124static ssize_t
1125sdev_show_access_state(struct device *dev,
1126 struct device_attribute *attr,
1127 char *buf)
1128{
1129 struct scsi_device *sdev = to_scsi_device(dev);
1130 unsigned char access_state;
1131 const char *access_state_name;
1132
1133 if (!sdev->handler)
1134 return -EINVAL;
1135
1136 access_state = (sdev->access_state & SCSI_ACCESS_STATE_MASK);
1137 access_state_name = scsi_access_state_name(access_state);
1138
1139 return sprintf(buf, "%s\n",
1140 access_state_name ? access_state_name : "unknown");
1141}
1142static DEVICE_ATTR(access_state, S_IRUGO, sdev_show_access_state, NULL);
1143
1144static ssize_t
1145sdev_show_preferred_path(struct device *dev,
1146 struct device_attribute *attr,
1147 char *buf)
1148{
1149 struct scsi_device *sdev = to_scsi_device(dev);
1150
1151 if (!sdev->handler)
1152 return -EINVAL;
1153
1154 if (sdev->access_state & SCSI_ACCESS_STATE_PREFERRED)
1155 return sprintf(buf, "1\n");
1156 else
1157 return sprintf(buf, "0\n");
1158}
1159static DEVICE_ATTR(preferred_path, S_IRUGO, sdev_show_preferred_path, NULL);
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001160#endif
1161
Tony Jonesee959b02008-02-22 00:13:36 +01001162static ssize_t
Vasu Dev4a840672009-10-22 15:46:33 -07001163sdev_show_queue_ramp_up_period(struct device *dev,
1164 struct device_attribute *attr,
1165 char *buf)
1166{
1167 struct scsi_device *sdev;
1168 sdev = to_scsi_device(dev);
1169 return snprintf(buf, 20, "%u\n",
1170 jiffies_to_msecs(sdev->queue_ramp_up_period));
1171}
1172
1173static ssize_t
1174sdev_store_queue_ramp_up_period(struct device *dev,
1175 struct device_attribute *attr,
1176 const char *buf, size_t count)
1177{
1178 struct scsi_device *sdev = to_scsi_device(dev);
Daniel Walterf7c65af2014-08-08 14:24:05 -07001179 unsigned int period;
Vasu Dev4a840672009-10-22 15:46:33 -07001180
Daniel Walterf7c65af2014-08-08 14:24:05 -07001181 if (kstrtouint(buf, 10, &period))
Vasu Dev4a840672009-10-22 15:46:33 -07001182 return -EINVAL;
1183
1184 sdev->queue_ramp_up_period = msecs_to_jiffies(period);
Peter Oberparleiter5cb9b402015-10-26 15:54:23 +01001185 return count;
Vasu Dev4a840672009-10-22 15:46:33 -07001186}
1187
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001188static DEVICE_ATTR(queue_ramp_up_period, S_IRUGO | S_IWUSR,
1189 sdev_show_queue_ramp_up_period,
1190 sdev_store_queue_ramp_up_period);
Vasu Dev4a840672009-10-22 15:46:33 -07001191
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001192static umode_t scsi_sdev_attr_is_visible(struct kobject *kobj,
1193 struct attribute *attr, int i)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194{
Guosong Su9e7bd9452020-02-25 18:04:11 +08001195 struct device *dev = kobj_to_dev(kobj);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196 struct scsi_device *sdev = to_scsi_device(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001199 if (attr == &dev_attr_queue_depth.attr &&
1200 !sdev->host->hostt->change_queue_depth)
1201 return S_IRUGO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001203 if (attr == &dev_attr_queue_ramp_up_period.attr &&
1204 !sdev->host->hostt->change_queue_depth)
1205 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206
Hannes Reinecke77c9df92016-03-03 07:54:07 +01001207#ifdef CONFIG_SCSI_DH
1208 if (attr == &dev_attr_access_state.attr &&
1209 !sdev->handler)
1210 return 0;
1211 if (attr == &dev_attr_preferred_path.attr &&
1212 !sdev->handler)
1213 return 0;
1214#endif
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001215 return attr->mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216}
1217
Hannes Reinecke7e479762016-03-03 07:41:24 +01001218static umode_t scsi_sdev_bin_attr_is_visible(struct kobject *kobj,
1219 struct bin_attribute *attr, int i)
1220{
Guosong Su9e7bd9452020-02-25 18:04:11 +08001221 struct device *dev = kobj_to_dev(kobj);
Hannes Reinecke7e479762016-03-03 07:41:24 +01001222 struct scsi_device *sdev = to_scsi_device(dev);
1223
1224
Ryan Attardd188b062019-09-26 11:22:17 -05001225 if (attr == &dev_attr_vpd_pg0 && !sdev->vpd_pg0)
1226 return 0;
1227
Hannes Reinecke7e479762016-03-03 07:41:24 +01001228 if (attr == &dev_attr_vpd_pg80 && !sdev->vpd_pg80)
1229 return 0;
1230
Hannes Reinecke68887582016-03-10 11:25:26 +01001231 if (attr == &dev_attr_vpd_pg83 && !sdev->vpd_pg83)
Hannes Reinecke7e479762016-03-03 07:41:24 +01001232 return 0;
1233
Ryan Attardd188b062019-09-26 11:22:17 -05001234 if (attr == &dev_attr_vpd_pg89 && !sdev->vpd_pg89)
1235 return 0;
1236
Hannes Reinecke7e479762016-03-03 07:41:24 +01001237 return S_IRUGO;
1238}
1239
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001240/* Default template for device attributes. May NOT be modified */
1241static struct attribute *scsi_sdev_attrs[] = {
1242 &dev_attr_device_blocked.attr,
1243 &dev_attr_type.attr,
1244 &dev_attr_scsi_level.attr,
1245 &dev_attr_device_busy.attr,
1246 &dev_attr_vendor.attr,
1247 &dev_attr_model.attr,
1248 &dev_attr_rev.attr,
1249 &dev_attr_rescan.attr,
1250 &dev_attr_delete.attr,
1251 &dev_attr_state.attr,
1252 &dev_attr_timeout.attr,
1253 &dev_attr_eh_timeout.attr,
1254 &dev_attr_iocounterbits.attr,
1255 &dev_attr_iorequest_cnt.attr,
1256 &dev_attr_iodone_cnt.attr,
1257 &dev_attr_ioerr_cnt.attr,
1258 &dev_attr_modalias.attr,
1259 &dev_attr_queue_depth.attr,
1260 &dev_attr_queue_type.attr,
Hannes Reinecke248d4fe2015-12-01 10:16:56 +01001261 &dev_attr_wwid.attr,
Hannes Reinecke345e2962017-10-02 16:26:34 +02001262 &dev_attr_blacklist.attr,
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001263#ifdef CONFIG_SCSI_DH
1264 &dev_attr_dh_state.attr,
Hannes Reinecke77c9df92016-03-03 07:54:07 +01001265 &dev_attr_access_state.attr,
1266 &dev_attr_preferred_path.attr,
Hannes Reinecke41f95dd2015-12-01 10:16:41 +01001267#endif
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001268 &dev_attr_queue_ramp_up_period.attr,
1269 REF_EVT(media_change),
1270 REF_EVT(inquiry_change_reported),
1271 REF_EVT(capacity_change_reported),
1272 REF_EVT(soft_threshold_reached),
1273 REF_EVT(mode_parameter_change_reported),
1274 REF_EVT(lun_change_reported),
1275 NULL
1276};
1277
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001278static struct bin_attribute *scsi_sdev_bin_attrs[] = {
Ryan Attardd188b062019-09-26 11:22:17 -05001279 &dev_attr_vpd_pg0,
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001280 &dev_attr_vpd_pg83,
1281 &dev_attr_vpd_pg80,
Ryan Attardd188b062019-09-26 11:22:17 -05001282 &dev_attr_vpd_pg89,
Johannes Thumshirn92e62462015-11-09 10:56:57 +01001283 &dev_attr_inquiry,
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001284 NULL
1285};
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001286static struct attribute_group scsi_sdev_attr_group = {
1287 .attrs = scsi_sdev_attrs,
Hannes Reineckeb3ae8782014-03-15 09:51:49 +01001288 .bin_attrs = scsi_sdev_bin_attrs,
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001289 .is_visible = scsi_sdev_attr_is_visible,
Hannes Reinecke7e479762016-03-03 07:41:24 +01001290 .is_bin_visible = scsi_sdev_bin_attr_is_visible,
Hannes Reinecke276b20d2014-03-15 09:51:47 +01001291};
1292
1293static const struct attribute_group *scsi_sdev_attr_groups[] = {
1294 &scsi_sdev_attr_group,
1295 NULL
1296};
1297
James Bottomley643eb2d2008-03-22 22:42:27 -05001298static int scsi_target_add(struct scsi_target *starget)
1299{
1300 int error;
1301
1302 if (starget->state != STARGET_CREATED)
1303 return 0;
1304
1305 error = device_add(&starget->dev);
1306 if (error) {
1307 dev_err(&starget->dev, "target device_add failed, error %d\n", error);
James Bottomley643eb2d2008-03-22 22:42:27 -05001308 return error;
1309 }
1310 transport_add_device(&starget->dev);
1311 starget->state = STARGET_RUNNING;
1312
Alan Sternbc4f2402010-06-17 10:41:42 -04001313 pm_runtime_set_active(&starget->dev);
1314 pm_runtime_enable(&starget->dev);
1315 device_enable_async_suspend(&starget->dev);
1316
James Bottomley643eb2d2008-03-22 22:42:27 -05001317 return 0;
1318}
1319
Linus Torvalds1da177e2005-04-16 15:20:36 -07001320/**
1321 * scsi_sysfs_add_sdev - add scsi device to sysfs
1322 * @sdev: scsi_device to add
1323 *
1324 * Return value:
1325 * 0 on Success / non-zero on Failure
1326 **/
1327int scsi_sysfs_add_sdev(struct scsi_device *sdev)
1328{
1329 int error, i;
James Bottomley80ed71c2007-07-19 10:15:10 -05001330 struct request_queue *rq = sdev->request_queue;
James Bottomley643eb2d2008-03-22 22:42:27 -05001331 struct scsi_target *starget = sdev->sdev_target;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001332
James Bottomley643eb2d2008-03-22 22:42:27 -05001333 error = scsi_target_add(starget);
1334 if (error)
1335 return error;
1336
1337 transport_configure_device(&starget->dev);
Alan Sternbc4f2402010-06-17 10:41:42 -04001338
Rafael J. Wysocki4cb077d2010-02-08 19:18:26 +01001339 device_enable_async_suspend(&sdev->sdev_gendev);
Alan Sternbc4f2402010-06-17 10:41:42 -04001340 scsi_autopm_get_target(starget);
1341 pm_runtime_set_active(&sdev->sdev_gendev);
Stanley Chuc74f8052019-09-16 23:56:49 +08001342 if (!sdev->rpm_autosuspend)
1343 pm_runtime_forbid(&sdev->sdev_gendev);
Alan Sternbc4f2402010-06-17 10:41:42 -04001344 pm_runtime_enable(&sdev->sdev_gendev);
1345 scsi_autopm_put_target(starget);
1346
Alan Sternbc4f2402010-06-17 10:41:42 -04001347 scsi_autopm_get_device(sdev);
1348
Hannes Reinecke2930f812017-09-20 09:18:52 +02001349 scsi_dh_add_device(sdev);
Christoph Hellwig086b91d2015-08-27 14:16:57 +02001350
Hannes Reinecke4cd24592016-03-03 07:54:12 +01001351 error = device_add(&sdev->sdev_gendev);
1352 if (error) {
1353 sdev_printk(KERN_INFO, sdev,
1354 "failed to add device: %d\n", error);
Hannes Reinecke4cd24592016-03-03 07:54:12 +01001355 return error;
1356 }
1357
Rafael J. Wysocki4cb077d2010-02-08 19:18:26 +01001358 device_enable_async_suspend(&sdev->sdev_dev);
Tony Jonesee959b02008-02-22 00:13:36 +01001359 error = device_add(&sdev->sdev_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001360 if (error) {
Alan Stern73d8c342010-11-15 16:03:04 -05001361 sdev_printk(KERN_INFO, sdev,
1362 "failed to add class device: %d\n", error);
James Bottomley860dc732009-11-19 17:48:29 -05001363 device_del(&sdev->sdev_gendev);
Alan Sternee37e092010-02-12 12:13:55 -05001364 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365 }
James Bottomley860dc732009-11-19 17:48:29 -05001366 transport_add_device(&sdev->sdev_gendev);
1367 sdev->is_visible = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001368
Christoph Hellwig17cb9602018-03-13 17:28:41 +01001369 error = bsg_scsi_register_queue(rq, &sdev->sdev_gendev);
James Bottomley80ed71c2007-07-19 10:15:10 -05001370 if (error)
James Bottomley860dc732009-11-19 17:48:29 -05001371 /* we're treating error on bsg register as non-fatal,
1372 * so pretend nothing went wrong */
James Bottomley80ed71c2007-07-19 10:15:10 -05001373 sdev_printk(KERN_INFO, sdev,
1374 "Failed to register bsg queue, errno=%d\n", error);
1375
Kay Sieversbfd12942007-09-11 17:00:14 +02001376 /* add additional host specific attributes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377 if (sdev->host->hostt->sdev_attrs) {
1378 for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) {
Kay Sieversbfd12942007-09-11 17:00:14 +02001379 error = device_create_file(&sdev->sdev_gendev,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 sdev->host->hostt->sdev_attrs[i]);
James Bottomley860dc732009-11-19 17:48:29 -05001381 if (error)
Alan Sternee37e092010-02-12 12:13:55 -05001382 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 }
1384 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385
Stanislav Nijnikov86b87cd2018-02-15 14:14:08 +02001386 if (sdev->host->hostt->sdev_groups) {
1387 error = sysfs_create_groups(&sdev->sdev_gendev.kobj,
1388 sdev->host->hostt->sdev_groups);
1389 if (error)
1390 return error;
1391 }
1392
Subhash Jadavani6fe8c1d2014-09-10 14:54:09 +03001393 scsi_autopm_put_device(sdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394 return error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001395}
1396
Alan Stern903f4fed2005-07-26 10:20:53 -04001397void __scsi_remove_device(struct scsi_device *sdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398{
James Bottomleydf133c22005-11-06 11:47:08 -06001399 struct device *dev = &sdev->sdev_gendev;
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001400 int res;
James Bottomleydf133c22005-11-06 11:47:08 -06001401
Vitaly Kuznetsovbe821fd2015-11-19 14:02:19 +01001402 /*
1403 * This cleanup path is not reentrant and while it is impossible
1404 * to get a new reference with scsi_device_get() someone can still
1405 * hold a previously acquired one.
1406 */
1407 if (sdev->sdev_state == SDEV_DEL)
1408 return;
1409
James Bottomley860dc732009-11-19 17:48:29 -05001410 if (sdev->is_visible) {
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001411 /*
1412 * If scsi_internal_target_block() is running concurrently,
1413 * wait until it has finished before changing the device state.
1414 */
1415 mutex_lock(&sdev->state_mutex);
Bart Van Assche255ee932017-06-02 14:21:57 -07001416 /*
1417 * If blocked, we go straight to DEL and restart the queue so
1418 * any commands issued during driver shutdown (like sync
1419 * cache) are errored immediately.
1420 */
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001421 res = scsi_device_set_state(sdev, SDEV_CANCEL);
Bart Van Assche255ee932017-06-02 14:21:57 -07001422 if (res != 0) {
1423 res = scsi_device_set_state(sdev, SDEV_DEL);
1424 if (res == 0)
1425 scsi_start_queue(sdev);
1426 }
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001427 mutex_unlock(&sdev->state_mutex);
1428
1429 if (res != 0)
James Bottomley860dc732009-11-19 17:48:29 -05001430 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431
Stanislav Nijnikov86b87cd2018-02-15 14:14:08 +02001432 if (sdev->host->hostt->sdev_groups)
1433 sysfs_remove_groups(&sdev->sdev_gendev.kobj,
1434 sdev->host->hostt->sdev_groups);
1435
James Bottomley860dc732009-11-19 17:48:29 -05001436 bsg_unregister_queue(sdev->request_queue);
1437 device_unregister(&sdev->sdev_dev);
1438 transport_remove_device(dev);
Bart Van Asschee619e6c2015-11-20 14:11:01 -08001439 device_del(dev);
1440 } else
1441 put_device(&sdev->sdev_dev);
Bart Van Asscheb4854622012-06-29 15:36:07 +00001442
1443 /*
1444 * Stop accepting new requests and wait until all queuecommand() and
1445 * scsi_run_queue() invocations have finished before tearing down the
1446 * device.
1447 */
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001448 mutex_lock(&sdev->state_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 scsi_device_set_state(sdev, SDEV_DEL);
Bart Van Assche0db6ca82017-06-02 14:21:55 -07001450 mutex_unlock(&sdev->state_mutex);
1451
Bart Van Asscheb4854622012-06-29 15:36:07 +00001452 blk_cleanup_queue(sdev->request_queue);
1453 cancel_work_sync(&sdev->requeue_work);
1454
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 if (sdev->host->hostt->slave_destroy)
1456 sdev->host->hostt->slave_destroy(sdev);
James Bottomleydf133c22005-11-06 11:47:08 -06001457 transport_destroy_device(dev);
James Bottomley86cbfb52011-04-22 10:39:59 -05001458
James Bottomleye63ed0d2014-01-21 07:00:50 -08001459 /*
1460 * Paired with the kref_get() in scsi_sysfs_initialize(). We have
dudengkeeee89102021-03-26 14:09:02 +08001461 * removed sysfs visibility from the device, so make the target
James Bottomleye63ed0d2014-01-21 07:00:50 -08001462 * invisible if this was the last device underneath it.
1463 */
1464 scsi_target_reap(scsi_target(sdev));
1465
James Bottomleydf133c22005-11-06 11:47:08 -06001466 put_device(dev);
Alan Stern903f4fed2005-07-26 10:20:53 -04001467}
1468
1469/**
1470 * scsi_remove_device - unregister a device from the scsi bus
1471 * @sdev: scsi_device to unregister
1472 **/
1473void scsi_remove_device(struct scsi_device *sdev)
1474{
Alan Stern54195002005-09-15 21:52:51 -04001475 struct Scsi_Host *shost = sdev->host;
1476
Arjan van de Ven0b950672006-01-11 13:16:10 +01001477 mutex_lock(&shost->scan_mutex);
Alan Stern903f4fed2005-07-26 10:20:53 -04001478 __scsi_remove_device(sdev);
Arjan van de Ven0b950672006-01-11 13:16:10 +01001479 mutex_unlock(&shost->scan_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001480}
1481EXPORT_SYMBOL(scsi_remove_device);
1482
Adrian Bunk44818ef2007-07-09 11:59:59 -07001483static void __scsi_remove_target(struct scsi_target *starget)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484{
1485 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1486 unsigned long flags;
Alan Sterna64358d2005-07-26 10:27:10 -04001487 struct scsi_device *sdev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001488
1489 spin_lock_irqsave(shost->host_lock, flags);
Alan Sterna64358d2005-07-26 10:27:10 -04001490 restart:
1491 list_for_each_entry(sdev, &shost->__devices, siblings) {
Hannes Reineckefbce4d92017-10-04 10:28:56 +02001492 /*
1493 * We cannot call scsi_device_get() here, as
1494 * we might've been called from rmmod() causing
1495 * scsi_device_get() to fail the module_is_live()
1496 * check.
1497 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 if (sdev->channel != starget->channel ||
Hannes Reinecke81b6c992017-12-13 14:21:37 +01001499 sdev->id != starget->id)
1500 continue;
1501 if (sdev->sdev_state == SDEV_DEL ||
1502 sdev->sdev_state == SDEV_CANCEL ||
Hannes Reineckefbce4d92017-10-04 10:28:56 +02001503 !get_device(&sdev->sdev_gendev))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001504 continue;
1505 spin_unlock_irqrestore(shost->host_lock, flags);
1506 scsi_remove_device(sdev);
Hannes Reineckefbce4d92017-10-04 10:28:56 +02001507 put_device(&sdev->sdev_gendev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508 spin_lock_irqsave(shost->host_lock, flags);
Alan Sterna64358d2005-07-26 10:27:10 -04001509 goto restart;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 }
1511 spin_unlock_irqrestore(shost->host_lock, flags);
mochel@digitalimplant.org20b1e672005-03-24 19:03:59 -08001512}
1513
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514/**
1515 * scsi_remove_target - try to remove a target and all its devices
1516 * @dev: generic starget or parent of generic stargets to be removed
1517 *
1518 * Note: This is slightly racy. It is possible that if the user
1519 * requests the addition of another device then the target won't be
1520 * removed.
1521 */
1522void scsi_remove_target(struct device *dev)
1523{
Dan Williams3b661a92012-06-21 23:47:28 -07001524 struct Scsi_Host *shost = dev_to_shost(dev->parent);
Johannes Thumshirn305c2e72016-04-05 11:50:45 +02001525 struct scsi_target *starget;
Dan Williams3b661a92012-06-21 23:47:28 -07001526 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527
Christoph Hellwig40998192015-10-19 16:35:46 +02001528restart:
Dan Williams3b661a92012-06-21 23:47:28 -07001529 spin_lock_irqsave(shost->host_lock, flags);
1530 list_for_each_entry(starget, &shost->__targets, siblings) {
James Bottomley90a88d62016-02-10 08:03:26 -08001531 if (starget->state == STARGET_DEL ||
Ewan D. Milnef9279c92017-06-27 14:55:58 -04001532 starget->state == STARGET_REMOVE ||
1533 starget->state == STARGET_CREATED_REMOVE)
Dan Williams3b661a92012-06-21 23:47:28 -07001534 continue;
1535 if (starget->dev.parent == dev || &starget->dev == dev) {
James Bottomleye63ed0d2014-01-21 07:00:50 -08001536 kref_get(&starget->reap_ref);
Ewan D. Milnef9279c92017-06-27 14:55:58 -04001537 if (starget->state == STARGET_CREATED)
1538 starget->state = STARGET_CREATED_REMOVE;
1539 else
1540 starget->state = STARGET_REMOVE;
Dan Williamsbc3f02a2012-08-28 22:12:10 -07001541 spin_unlock_irqrestore(shost->host_lock, flags);
Dan Williamsbc3f02a2012-08-28 22:12:10 -07001542 __scsi_remove_target(starget);
Christoph Hellwig40998192015-10-19 16:35:46 +02001543 scsi_target_reap(starget);
1544 goto restart;
Dan Williams3b661a92012-06-21 23:47:28 -07001545 }
1546 }
1547 spin_unlock_irqrestore(shost->host_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001548}
1549EXPORT_SYMBOL(scsi_remove_target);
1550
1551int scsi_register_driver(struct device_driver *drv)
1552{
1553 drv->bus = &scsi_bus_type;
1554
1555 return driver_register(drv);
1556}
1557EXPORT_SYMBOL(scsi_register_driver);
1558
1559int scsi_register_interface(struct class_interface *intf)
1560{
1561 intf->class = &sdev_class;
1562
1563 return class_interface_register(intf);
1564}
1565EXPORT_SYMBOL(scsi_register_interface);
1566
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567/**
1568 * scsi_sysfs_add_host - add scsi host to subsystem
1569 * @shost: scsi host struct to add to subsystem
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570 **/
1571int scsi_sysfs_add_host(struct Scsi_Host *shost)
1572{
1573 int error, i;
1574
Hannes Reineckef7120a42008-03-18 14:32:28 +01001575 /* add host specific attributes */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001576 if (shost->hostt->shost_attrs) {
1577 for (i = 0; shost->hostt->shost_attrs[i]; i++) {
Tony Jonesee959b02008-02-22 00:13:36 +01001578 error = device_create_file(&shost->shost_dev,
Hannes Reineckef7120a42008-03-18 14:32:28 +01001579 shost->hostt->shost_attrs[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001580 if (error)
1581 return error;
1582 }
1583 }
1584
1585 transport_register_device(&shost->shost_gendev);
James Bottomleyd52b3812008-01-05 09:38:30 -06001586 transport_configure_device(&shost->shost_gendev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587 return 0;
1588}
1589
Kay Sieversbfd12942007-09-11 17:00:14 +02001590static struct device_type scsi_dev_type = {
1591 .name = "scsi_device",
1592 .release = scsi_device_dev_release,
1593 .groups = scsi_sdev_attr_groups,
1594};
1595
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596void scsi_sysfs_device_initialize(struct scsi_device *sdev)
1597{
1598 unsigned long flags;
1599 struct Scsi_Host *shost = sdev->host;
1600 struct scsi_target *starget = sdev->sdev_target;
1601
1602 device_initialize(&sdev->sdev_gendev);
1603 sdev->sdev_gendev.bus = &scsi_bus_type;
Kay Sieversbfd12942007-09-11 17:00:14 +02001604 sdev->sdev_gendev.type = &scsi_dev_type;
Hannes Reinecke9cb78c12014-06-25 15:27:36 +02001605 dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu",
Kay Sievers71610f52008-12-03 22:41:36 +01001606 sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
1607
Tony Jonesee959b02008-02-22 00:13:36 +01001608 device_initialize(&sdev->sdev_dev);
James Bottomley37e6ba02009-10-02 13:30:08 -05001609 sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev);
Tony Jonesee959b02008-02-22 00:13:36 +01001610 sdev->sdev_dev.class = &sdev_class;
Hannes Reinecke9cb78c12014-06-25 15:27:36 +02001611 dev_set_name(&sdev->sdev_dev, "%d:%d:%d:%llu",
Kay Sievers71610f52008-12-03 22:41:36 +01001612 sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
Alan Stern50c4e962014-09-02 11:35:50 -04001613 /*
1614 * Get a default scsi_level from the target (derived from sibling
1615 * devices). This is the best we can do for guessing how to set
1616 * sdev->lun_in_cdb for the initial INQUIRY command. For LUN 0 the
1617 * setting doesn't matter, because all the bits are zero anyway.
1618 * But it does matter for higher LUNs.
1619 */
Alan Stern7c9d6f12007-01-08 11:12:32 -05001620 sdev->scsi_level = starget->scsi_level;
Alan Stern50c4e962014-09-02 11:35:50 -04001621 if (sdev->scsi_level <= SCSI_2 &&
1622 sdev->scsi_level != SCSI_UNKNOWN &&
1623 !shost->no_scsi2_lun_in_cdb)
1624 sdev->lun_in_cdb = 1;
1625
Linus Torvalds1da177e2005-04-16 15:20:36 -07001626 transport_setup_device(&sdev->sdev_gendev);
1627 spin_lock_irqsave(shost->host_lock, flags);
1628 list_add_tail(&sdev->same_target_siblings, &starget->devices);
1629 list_add_tail(&sdev->siblings, &shost->__devices);
1630 spin_unlock_irqrestore(shost->host_lock, flags);
James Bottomleye63ed0d2014-01-21 07:00:50 -08001631 /*
1632 * device can now only be removed via __scsi_remove_device() so hold
1633 * the target. Target will be held in CREATED state until something
1634 * beneath it becomes visible (in which case it moves to RUNNING)
1635 */
1636 kref_get(&starget->reap_ref);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001637}
1638
1639int scsi_is_sdev_device(const struct device *dev)
1640{
Kay Sievers13ba9bc2007-09-26 19:54:49 +02001641 return dev->type == &scsi_dev_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642}
1643EXPORT_SYMBOL(scsi_is_sdev_device);
1644
1645/* A blank transport template that is used in drivers that don't
1646 * yet implement Transport Attributes */
1647struct scsi_transport_template blank_transport_template = { { { {NULL, }, }, }, };