@@ -227,7 +227,7 @@ static ssize_t nullb_device_uint_attr_store(unsigned int *val,
227227 int result ;
228228
229229 result = kstrtouint (page , 0 , & tmp );
230- if (result )
230+ if (result < 0 )
231231 return result ;
232232
233233 * val = tmp ;
@@ -241,7 +241,7 @@ static ssize_t nullb_device_ulong_attr_store(unsigned long *val,
241241 unsigned long tmp ;
242242
243243 result = kstrtoul (page , 0 , & tmp );
244- if (result )
244+ if (result < 0 )
245245 return result ;
246246
247247 * val = tmp ;
@@ -255,15 +255,15 @@ static ssize_t nullb_device_bool_attr_store(bool *val, const char *page,
255255 int result ;
256256
257257 result = kstrtobool (page , & tmp );
258- if (result )
258+ if (result < 0 )
259259 return result ;
260260
261261 * val = tmp ;
262262 return count ;
263263}
264264
265265/* 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 ) \
267267static ssize_t \
268268nullb_device_##NAME##_show(struct config_item *item, char *page) \
269269{ \
@@ -274,32 +274,57 @@ static ssize_t \
274274nullb_device_##NAME##_store(struct config_item *item, const char *page, \
275275 size_t count) \
276276{ \
277+ int (*apply_fn)(struct nullb_device *dev, TYPE new_value) = APPLY; \
277278 struct nullb_device *dev = to_nullb_device(item); \
279+ TYPE new_value; \
280+ int ret; \
278281 \
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; \
282293} \
283294CONFIGFS_ATTR(nullb_device_, NAME);
284295
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 );
303328
304329static ssize_t nullb_device_power_show (struct config_item * item , char * page )
305330{
0 commit comments