@@ -2133,51 +2133,86 @@ SE_DEV_ALUA_TG_PT_ATTR(alua_access_type, S_IRUGO | S_IWUSR);
2133
2133
/*
2134
2134
* alua_supported_states
2135
2135
*/
2136
- static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_supported_states (
2137
- struct t10_alua_tg_pt_gp * tg_pt_gp ,
2138
- char * page )
2139
- {
2140
- return sprintf (page , "%02x\n" ,
2141
- tg_pt_gp -> tg_pt_gp_alua_supported_states );
2142
- }
2143
-
2144
- static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_supported_states (
2145
- struct t10_alua_tg_pt_gp * tg_pt_gp ,
2146
- const char * page ,
2147
- size_t count )
2148
- {
2149
- unsigned long tmp ;
2150
- int new_states , valid_states , ret ;
2151
2136
2152
- if (!tg_pt_gp -> tg_pt_gp_valid_id ) {
2153
- pr_err ("Unable to do set supported ALUA states on non"
2154
- " valid tg_pt_gp ID: %hu\n" ,
2155
- tg_pt_gp -> tg_pt_gp_valid_id );
2156
- return - EINVAL ;
2157
- }
2158
-
2159
- ret = strict_strtoul (page , 0 , & tmp );
2160
- if (ret < 0 ) {
2161
- pr_err ("Unable to extract new supported ALUA states"
2162
- " from %s\n" , page );
2163
- return - EINVAL ;
2164
- }
2165
- new_states = (int )tmp ;
2166
- valid_states = ALUA_T_SUP | ALUA_O_SUP | ALUA_LBD_SUP | \
2167
- ALUA_U_SUP | ALUA_S_SUP | ALUA_AN_SUP | ALUA_AO_SUP ;
2168
-
2169
-
2170
- if (new_states & ~valid_states ) {
2171
- pr_err ("Illegal supported ALUA states: 0x%02x\n" ,
2172
- new_states );
2173
- return - EINVAL ;
2174
- }
2175
-
2176
- tg_pt_gp -> tg_pt_gp_alua_supported_states = new_states ;
2177
- return count ;
2137
+ #define SE_DEV_ALUA_SUPPORT_STATE_SHOW (_name , _var , _bit ) \
2138
+ static ssize_t target_core_alua_tg_pt_gp_show_attr_alua_support_##_name( \
2139
+ struct t10_alua_tg_pt_gp *t, char *p) \
2140
+ { \
2141
+ return sprintf(p, "%d\n", !!(t->_var & _bit)); \
2178
2142
}
2179
2143
2180
- SE_DEV_ALUA_TG_PT_ATTR (alua_supported_states , S_IRUGO | S_IWUSR );
2144
+ #define SE_DEV_ALUA_SUPPORT_STATE_STORE (_name , _var , _bit ) \
2145
+ static ssize_t target_core_alua_tg_pt_gp_store_attr_alua_support_##_name(\
2146
+ struct t10_alua_tg_pt_gp *t, const char *p, size_t c) \
2147
+ { \
2148
+ unsigned long tmp; \
2149
+ int ret; \
2150
+ \
2151
+ if (!t->tg_pt_gp_valid_id) { \
2152
+ pr_err("Unable to do set ##_name ALUA state on non" \
2153
+ " valid tg_pt_gp ID: %hu\n", \
2154
+ t->tg_pt_gp_valid_id); \
2155
+ return -EINVAL; \
2156
+ } \
2157
+ \
2158
+ ret = kstrtoul(p, 0, &tmp); \
2159
+ if (ret < 0) { \
2160
+ pr_err("Invalid value '%s', must be '0' or '1'\n", p); \
2161
+ return -EINVAL; \
2162
+ } \
2163
+ if (tmp > 1) { \
2164
+ pr_err("Invalid value '%ld', must be '0' or '1'\n", tmp); \
2165
+ return -EINVAL; \
2166
+ } \
2167
+ if (!tmp) \
2168
+ t->_var |= _bit; \
2169
+ else \
2170
+ t->_var &= ~_bit; \
2171
+ \
2172
+ return c; \
2173
+ }
2174
+
2175
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (transitioning ,
2176
+ tg_pt_gp_alua_supported_states , ALUA_T_SUP );
2177
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (transitioning ,
2178
+ tg_pt_gp_alua_supported_states , ALUA_T_SUP );
2179
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_transitioning , S_IRUGO | S_IWUSR );
2180
+
2181
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (offline ,
2182
+ tg_pt_gp_alua_supported_states , ALUA_O_SUP );
2183
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (offline ,
2184
+ tg_pt_gp_alua_supported_states , ALUA_O_SUP );
2185
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_offline , S_IRUGO | S_IWUSR );
2186
+
2187
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (lba_dependent ,
2188
+ tg_pt_gp_alua_supported_states , ALUA_LBD_SUP );
2189
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (lba_dependent ,
2190
+ tg_pt_gp_alua_supported_states , ALUA_LBD_SUP );
2191
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_lba_dependent , S_IRUGO | S_IWUSR );
2192
+
2193
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (unavailable ,
2194
+ tg_pt_gp_alua_supported_states , ALUA_U_SUP );
2195
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (unavailable ,
2196
+ tg_pt_gp_alua_supported_states , ALUA_U_SUP );
2197
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_unavailable , S_IRUGO | S_IWUSR );
2198
+
2199
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (standby ,
2200
+ tg_pt_gp_alua_supported_states , ALUA_S_SUP );
2201
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (standby ,
2202
+ tg_pt_gp_alua_supported_states , ALUA_S_SUP );
2203
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_standby , S_IRUGO | S_IWUSR );
2204
+
2205
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (active_optimized ,
2206
+ tg_pt_gp_alua_supported_states , ALUA_AO_SUP );
2207
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (active_optimized ,
2208
+ tg_pt_gp_alua_supported_states , ALUA_AO_SUP );
2209
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_active_optimized , S_IRUGO | S_IWUSR );
2210
+
2211
+ SE_DEV_ALUA_SUPPORT_STATE_SHOW (active_nonoptimized ,
2212
+ tg_pt_gp_alua_supported_states , ALUA_AN_SUP );
2213
+ SE_DEV_ALUA_SUPPORT_STATE_STORE (active_nonoptimized ,
2214
+ tg_pt_gp_alua_supported_states , ALUA_AN_SUP );
2215
+ SE_DEV_ALUA_TG_PT_ATTR (alua_support_active_nonoptimized , S_IRUGO | S_IWUSR );
2181
2216
2182
2217
/*
2183
2218
* alua_write_metadata
@@ -2399,7 +2434,13 @@ static struct configfs_attribute *target_core_alua_tg_pt_gp_attrs[] = {
2399
2434
& target_core_alua_tg_pt_gp_alua_access_state .attr ,
2400
2435
& target_core_alua_tg_pt_gp_alua_access_status .attr ,
2401
2436
& target_core_alua_tg_pt_gp_alua_access_type .attr ,
2402
- & target_core_alua_tg_pt_gp_alua_supported_states .attr ,
2437
+ & target_core_alua_tg_pt_gp_alua_support_transitioning .attr ,
2438
+ & target_core_alua_tg_pt_gp_alua_support_offline .attr ,
2439
+ & target_core_alua_tg_pt_gp_alua_support_lba_dependent .attr ,
2440
+ & target_core_alua_tg_pt_gp_alua_support_unavailable .attr ,
2441
+ & target_core_alua_tg_pt_gp_alua_support_standby .attr ,
2442
+ & target_core_alua_tg_pt_gp_alua_support_active_nonoptimized .attr ,
2443
+ & target_core_alua_tg_pt_gp_alua_support_active_optimized .attr ,
2403
2444
& target_core_alua_tg_pt_gp_alua_write_metadata .attr ,
2404
2445
& target_core_alua_tg_pt_gp_nonop_delay_msecs .attr ,
2405
2446
& target_core_alua_tg_pt_gp_trans_delay_msecs .attr ,
0 commit comments