diff options
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/scsi_transport_srp.h | 83 |
1 files changed, 81 insertions, 2 deletions
diff --git a/include/scsi/scsi_transport_srp.h b/include/scsi/scsi_transport_srp.h index ff0f04ac91aa..4ebf6913b7b2 100644 --- a/include/scsi/scsi_transport_srp.h +++ b/include/scsi/scsi_transport_srp.h | |||
@@ -13,6 +13,27 @@ struct srp_rport_identifiers { | |||
13 | u8 roles; | 13 | u8 roles; |
14 | }; | 14 | }; |
15 | 15 | ||
16 | /** | ||
17 | * enum srp_rport_state - SRP transport layer state | ||
18 | * @SRP_RPORT_RUNNING: Transport layer operational. | ||
19 | * @SRP_RPORT_BLOCKED: Transport layer not operational; fast I/O fail timer | ||
20 | * is running and I/O has been blocked. | ||
21 | * @SRP_RPORT_FAIL_FAST: Fast I/O fail timer has expired; fail I/O fast. | ||
22 | * @SRP_RPORT_LOST: Device loss timer has expired; port is being removed. | ||
23 | */ | ||
24 | enum srp_rport_state { | ||
25 | SRP_RPORT_RUNNING, | ||
26 | SRP_RPORT_BLOCKED, | ||
27 | SRP_RPORT_FAIL_FAST, | ||
28 | SRP_RPORT_LOST, | ||
29 | }; | ||
30 | |||
31 | /** | ||
32 | * struct srp_rport | ||
33 | * @lld_data: LLD private data. | ||
34 | * @mutex: Protects against concurrent rport reconnect / fast_io_fail / | ||
35 | * dev_loss_tmo activity. | ||
36 | */ | ||
16 | struct srp_rport { | 37 | struct srp_rport { |
17 | /* for initiator and target drivers */ | 38 | /* for initiator and target drivers */ |
18 | 39 | ||
@@ -23,11 +44,43 @@ struct srp_rport { | |||
23 | 44 | ||
24 | /* for initiator drivers */ | 45 | /* for initiator drivers */ |
25 | 46 | ||
26 | void *lld_data; /* LLD private data */ | 47 | void *lld_data; |
48 | |||
49 | struct mutex mutex; | ||
50 | enum srp_rport_state state; | ||
51 | bool deleted; | ||
52 | int reconnect_delay; | ||
53 | int failed_reconnects; | ||
54 | struct delayed_work reconnect_work; | ||
55 | int fast_io_fail_tmo; | ||
56 | int dev_loss_tmo; | ||
57 | struct delayed_work fast_io_fail_work; | ||
58 | struct delayed_work dev_loss_work; | ||
27 | }; | 59 | }; |
28 | 60 | ||
61 | /** | ||
62 | * struct srp_function_template | ||
63 | * @has_rport_state: Whether or not to create the state, fast_io_fail_tmo and | ||
64 | * dev_loss_tmo sysfs attribute for an rport. | ||
65 | * @reset_timer_if_blocked: Whether or srp_timed_out() should reset the command | ||
66 | * timer if the device on which it has been queued is blocked. | ||
67 | * @reconnect_delay: If not NULL, points to the default reconnect_delay value. | ||
68 | * @fast_io_fail_tmo: If not NULL, points to the default fast_io_fail_tmo value. | ||
69 | * @dev_loss_tmo: If not NULL, points to the default dev_loss_tmo value. | ||
70 | * @reconnect: Callback function for reconnecting to the target. See also | ||
71 | * srp_reconnect_rport(). | ||
72 | * @terminate_rport_io: Callback function for terminating all outstanding I/O | ||
73 | * requests for an rport. | ||
74 | */ | ||
29 | struct srp_function_template { | 75 | struct srp_function_template { |
30 | /* for initiator drivers */ | 76 | /* for initiator drivers */ |
77 | bool has_rport_state; | ||
78 | bool reset_timer_if_blocked; | ||
79 | int *reconnect_delay; | ||
80 | int *fast_io_fail_tmo; | ||
81 | int *dev_loss_tmo; | ||
82 | int (*reconnect)(struct srp_rport *rport); | ||
83 | void (*terminate_rport_io)(struct srp_rport *rport); | ||
31 | void (*rport_delete)(struct srp_rport *rport); | 84 | void (*rport_delete)(struct srp_rport *rport); |
32 | /* for target drivers */ | 85 | /* for target drivers */ |
33 | int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int); | 86 | int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int); |
@@ -38,10 +91,36 @@ extern struct scsi_transport_template * | |||
38 | srp_attach_transport(struct srp_function_template *); | 91 | srp_attach_transport(struct srp_function_template *); |
39 | extern void srp_release_transport(struct scsi_transport_template *); | 92 | extern void srp_release_transport(struct scsi_transport_template *); |
40 | 93 | ||
94 | extern void srp_rport_get(struct srp_rport *rport); | ||
95 | extern void srp_rport_put(struct srp_rport *rport); | ||
41 | extern struct srp_rport *srp_rport_add(struct Scsi_Host *, | 96 | extern struct srp_rport *srp_rport_add(struct Scsi_Host *, |
42 | struct srp_rport_identifiers *); | 97 | struct srp_rport_identifiers *); |
43 | extern void srp_rport_del(struct srp_rport *); | 98 | extern void srp_rport_del(struct srp_rport *); |
44 | 99 | extern int srp_tmo_valid(int reconnect_delay, int fast_io_fail_tmo, | |
100 | int dev_loss_tmo); | ||
101 | extern int srp_reconnect_rport(struct srp_rport *rport); | ||
102 | extern void srp_start_tl_fail_timers(struct srp_rport *rport); | ||
45 | extern void srp_remove_host(struct Scsi_Host *); | 103 | extern void srp_remove_host(struct Scsi_Host *); |
46 | 104 | ||
105 | /** | ||
106 | * srp_chkready() - evaluate the transport layer state before I/O | ||
107 | * | ||
108 | * Returns a SCSI result code that can be returned by the LLD queuecommand() | ||
109 | * implementation. The role of this function is similar to that of | ||
110 | * fc_remote_port_chkready(). | ||
111 | */ | ||
112 | static inline int srp_chkready(struct srp_rport *rport) | ||
113 | { | ||
114 | switch (rport->state) { | ||
115 | case SRP_RPORT_RUNNING: | ||
116 | case SRP_RPORT_BLOCKED: | ||
117 | default: | ||
118 | return 0; | ||
119 | case SRP_RPORT_FAIL_FAST: | ||
120 | return DID_TRANSPORT_FAILFAST << 16; | ||
121 | case SRP_RPORT_LOST: | ||
122 | return DID_NO_CONNECT << 16; | ||
123 | } | ||
124 | } | ||
125 | |||
47 | #endif | 126 | #endif |