@@ -227,7 +227,7 @@ static ssize_t nullb_device_uint_attr_store(unsigned int *val,
227
227
int result ;
228
228
229
229
result = kstrtouint (page , 0 , & tmp );
230
- if (result )
230
+ if (result < 0 )
231
231
return result ;
232
232
233
233
* val = tmp ;
@@ -241,7 +241,7 @@ static ssize_t nullb_device_ulong_attr_store(unsigned long *val,
241
241
unsigned long tmp ;
242
242
243
243
result = kstrtoul (page , 0 , & tmp );
244
- if (result )
244
+ if (result < 0 )
245
245
return result ;
246
246
247
247
* val = tmp ;
@@ -255,15 +255,15 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page,
255
255
int result ;
256
256
257
257
result = kstrtobool (page , & tmp );
258
- if (result )
258
+ if (result < 0 )
259
259
return result ;
260
260
261
261
* val = tmp ;
262
262
return count ;
263
263
}
264
264
265
265
/* The following macro should only be used with TYPE = {uint, ulong, bool}. */
266
- #define NULLB_DEVICE_ATTR (NAME , TYPE ) \
266
+ #define NULLB_DEVICE_ATTR (NAME , TYPE , APPLY ) \
267
267
static ssize_t \
268
268
nullb_device_##NAME##_show(struct config_item *item, char *page) \
269
269
{ \
@@ -274,32 +274,57 @@ static ssize_t \
274
274
nullb_device_##NAME##_store(struct config_item *item, const char *page, \
275
275
size_t count) \
276
276
{ \
277
+ int (*apply_fn)(struct nullb_device *dev, TYPE new_value) = APPLY; \
277
278
struct nullb_device *dev = to_nullb_device(item); \
279
+ TYPE new_value; \
280
+ int ret; \
278
281
\
279
- if (test_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags)) \
280
- return -EBUSY; \
281
- return nullb_device_##TYPE##_attr_store(&dev->NAME, page, count); \
282
+ ret = nullb_device_##TYPE##_attr_store(&new_value, page, count); \
283
+ if (ret < 0) \
284
+ return ret; \
285
+ if (apply_fn) \
286
+ ret = apply_fn(dev, new_value); \
287
+ else if (test_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags)) \
288
+ ret = -EBUSY; \
289
+ if (ret < 0) \
290
+ return ret; \
291
+ dev->NAME = new_value; \
292
+ return count; \
282
293
} \
283
294
CONFIGFS_ATTR(nullb_device_, NAME);
284
295
285
- NULLB_DEVICE_ATTR (size , ulong );
286
- NULLB_DEVICE_ATTR (completion_nsec , ulong );
287
- NULLB_DEVICE_ATTR (submit_queues , uint );
288
- NULLB_DEVICE_ATTR (home_node , uint );
289
- NULLB_DEVICE_ATTR (queue_mode , uint );
290
- NULLB_DEVICE_ATTR (blocksize , uint );
291
- NULLB_DEVICE_ATTR (irqmode , uint );
292
- NULLB_DEVICE_ATTR (hw_queue_depth , uint );
293
- NULLB_DEVICE_ATTR (index , uint );
294
- NULLB_DEVICE_ATTR (blocking , bool );
295
- NULLB_DEVICE_ATTR (use_per_node_hctx , bool );
296
- NULLB_DEVICE_ATTR (memory_backed , bool );
297
- NULLB_DEVICE_ATTR (discard , bool );
298
- NULLB_DEVICE_ATTR (mbps , uint );
299
- NULLB_DEVICE_ATTR (cache_size , ulong );
300
- NULLB_DEVICE_ATTR (zoned , bool );
301
- NULLB_DEVICE_ATTR (zone_size , ulong );
302
- NULLB_DEVICE_ATTR (zone_nr_conv , uint );
296
+ static int nullb_apply_submit_queues (struct nullb_device * dev ,
297
+ unsigned int submit_queues )
298
+ {
299
+ struct nullb * nullb = dev -> nullb ;
300
+ struct blk_mq_tag_set * set ;
301
+
302
+ if (!nullb )
303
+ return 0 ;
304
+
305
+ set = nullb -> tag_set ;
306
+ blk_mq_update_nr_hw_queues (set , submit_queues );
307
+ return set -> nr_hw_queues == submit_queues ? 0 : - ENOMEM ;
308
+ }
309
+
310
+ NULLB_DEVICE_ATTR (size , ulong , NULL );
311
+ NULLB_DEVICE_ATTR (completion_nsec , ulong , NULL );
312
+ NULLB_DEVICE_ATTR (submit_queues , uint , nullb_apply_submit_queues );
313
+ NULLB_DEVICE_ATTR (home_node , uint , NULL );
314
+ NULLB_DEVICE_ATTR (queue_mode , uint , NULL );
315
+ NULLB_DEVICE_ATTR (blocksize , uint , NULL );
316
+ NULLB_DEVICE_ATTR (irqmode , uint , NULL );
317
+ NULLB_DEVICE_ATTR (hw_queue_depth , uint , NULL );
318
+ NULLB_DEVICE_ATTR (index , uint , NULL );
319
+ NULLB_DEVICE_ATTR (blocking , bool , NULL );
320
+ NULLB_DEVICE_ATTR (use_per_node_hctx , bool , NULL );
321
+ NULLB_DEVICE_ATTR (memory_backed , bool , NULL );
322
+ NULLB_DEVICE_ATTR (discard , bool , NULL );
323
+ NULLB_DEVICE_ATTR (mbps , uint , NULL );
324
+ NULLB_DEVICE_ATTR (cache_size , ulong , NULL );
325
+ NULLB_DEVICE_ATTR (zoned , bool , NULL );
326
+ NULLB_DEVICE_ATTR (zone_size , ulong , NULL );
327
+ NULLB_DEVICE_ATTR (zone_nr_conv , uint , NULL );
303
328
304
329
static ssize_t nullb_device_power_show (struct config_item * item , char * page )
305
330
{
0 commit comments