@@ -24,6 +24,8 @@ struct queue_sysfs_entry {
2424 struct attribute attr ;
2525 ssize_t (* show )(struct gendisk * disk , char * page );
2626 ssize_t (* store )(struct gendisk * disk , const char * page , size_t count );
27+ int (* store_limit )(struct gendisk * disk , const char * page ,
28+ size_t count , struct queue_limits * lim );
2729 void (* load_module )(struct gendisk * disk , const char * page , size_t count );
2830};
2931
@@ -153,13 +155,11 @@ QUEUE_SYSFS_SHOW_CONST(discard_zeroes_data, 0)
153155QUEUE_SYSFS_SHOW_CONST (write_same_max , 0 )
154156QUEUE_SYSFS_SHOW_CONST (poll_delay , -1 )
155157
156- static ssize_t queue_max_discard_sectors_store (struct gendisk * disk ,
157- const char * page , size_t count )
158+ static int queue_max_discard_sectors_store (struct gendisk * disk ,
159+ const char * page , size_t count , struct queue_limits * lim )
158160{
159161 unsigned long max_discard_bytes ;
160- struct queue_limits lim ;
161162 ssize_t ret ;
162- int err ;
163163
164164 ret = queue_var_store (& max_discard_bytes , page , count );
165165 if (ret < 0 )
@@ -171,54 +171,40 @@ static ssize_t queue_max_discard_sectors_store(struct gendisk *disk,
171171 if ((max_discard_bytes >> SECTOR_SHIFT ) > UINT_MAX )
172172 return - EINVAL ;
173173
174- lim = queue_limits_start_update (disk -> queue );
175- lim .max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT ;
176- err = queue_limits_commit_update (disk -> queue , & lim );
177- if (err )
178- return err ;
179- return ret ;
174+ lim -> max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT ;
175+ return 0 ;
180176}
181177
182- static ssize_t
183- queue_max_sectors_store (struct gendisk * disk , const char * page , size_t count )
178+ static int
179+ queue_max_sectors_store (struct gendisk * disk , const char * page , size_t count ,
180+ struct queue_limits * lim )
184181{
185182 unsigned long max_sectors_kb ;
186- struct queue_limits lim ;
187183 ssize_t ret ;
188- int err ;
189184
190185 ret = queue_var_store (& max_sectors_kb , page , count );
191186 if (ret < 0 )
192187 return ret ;
193188
194- lim = queue_limits_start_update (disk -> queue );
195- lim .max_user_sectors = max_sectors_kb << 1 ;
196- err = queue_limits_commit_update (disk -> queue , & lim );
197- if (err )
198- return err ;
199- return ret ;
189+ lim -> max_user_sectors = max_sectors_kb << 1 ;
190+ return 0 ;
200191}
201192
202193static ssize_t queue_feature_store (struct gendisk * disk , const char * page ,
203- size_t count , blk_features_t feature )
194+ size_t count , struct queue_limits * lim , blk_features_t feature )
204195{
205- struct queue_limits lim ;
206196 unsigned long val ;
207197 ssize_t ret ;
208198
209199 ret = queue_var_store (& val , page , count );
210200 if (ret < 0 )
211201 return ret ;
212202
213- lim = queue_limits_start_update (disk -> queue );
214203 if (val )
215- lim . features |= feature ;
204+ lim -> features |= feature ;
216205 else
217- lim .features &= ~feature ;
218- ret = queue_limits_commit_update (disk -> queue , & lim );
219- if (ret )
220- return ret ;
221- return count ;
206+ lim -> features &= ~feature ;
207+ return 0 ;
222208}
223209
224210#define QUEUE_SYSFS_FEATURE (_name , _feature ) \
@@ -227,10 +213,10 @@ static ssize_t queue_##_name##_show(struct gendisk *disk, char *page) \
227213 return sysfs_emit(page, "%u\n", \
228214 !!(disk->queue->limits.features & _feature)); \
229215} \
230- static ssize_t queue_##_name##_store(struct gendisk *disk, \
231- const char *page, size_t count) \
216+ static int queue_##_name##_store(struct gendisk *disk, \
217+ const char *page, size_t count, struct queue_limits *lim) \
232218{ \
233- return queue_feature_store(disk, page, count, _feature); \
219+ return queue_feature_store(disk, page, count, lim, _feature); \
234220}
235221
236222QUEUE_SYSFS_FEATURE (rotational , BLK_FEAT_ROTATIONAL )
@@ -273,29 +259,23 @@ static ssize_t queue_iostats_passthrough_show(struct gendisk *disk, char *page)
273259 return queue_var_show (!!blk_queue_passthrough_stat (disk -> queue ), page );
274260}
275261
276- static ssize_t queue_iostats_passthrough_store (struct gendisk * disk ,
277- const char * page , size_t count )
262+ static int queue_iostats_passthrough_store (struct gendisk * disk ,
263+ const char * page , size_t count , struct queue_limits * lim )
278264{
279- struct queue_limits lim ;
280265 unsigned long ios ;
281266 ssize_t ret ;
282267
283268 ret = queue_var_store (& ios , page , count );
284269 if (ret < 0 )
285270 return ret ;
286271
287- lim = queue_limits_start_update (disk -> queue );
288272 if (ios )
289- lim . flags |= BLK_FLAG_IOSTATS_PASSTHROUGH ;
273+ lim -> flags |= BLK_FLAG_IOSTATS_PASSTHROUGH ;
290274 else
291- lim .flags &= ~BLK_FLAG_IOSTATS_PASSTHROUGH ;
292-
293- ret = queue_limits_commit_update (disk -> queue , & lim );
294- if (ret )
295- return ret ;
296-
297- return count ;
275+ lim -> flags &= ~BLK_FLAG_IOSTATS_PASSTHROUGH ;
276+ return 0 ;
298277}
278+
299279static ssize_t queue_nomerges_show (struct gendisk * disk , char * page )
300280{
301281 return queue_var_show ((blk_queue_nomerges (disk -> queue ) << 1 ) |
@@ -398,12 +378,10 @@ static ssize_t queue_wc_show(struct gendisk *disk, char *page)
398378 return sysfs_emit (page , "write through\n" );
399379}
400380
401- static ssize_t queue_wc_store (struct gendisk * disk , const char * page ,
402- size_t count )
381+ static int queue_wc_store (struct gendisk * disk , const char * page ,
382+ size_t count , struct queue_limits * lim )
403383{
404- struct queue_limits lim ;
405384 bool disable ;
406- int err ;
407385
408386 if (!strncmp (page , "write back" , 10 )) {
409387 disable = false;
@@ -414,15 +392,11 @@ static ssize_t queue_wc_store(struct gendisk *disk, const char *page,
414392 return - EINVAL ;
415393 }
416394
417- lim = queue_limits_start_update (disk -> queue );
418395 if (disable )
419- lim . flags |= BLK_FLAG_WRITE_CACHE_DISABLED ;
396+ lim -> flags |= BLK_FLAG_WRITE_CACHE_DISABLED ;
420397 else
421- lim .flags &= ~BLK_FLAG_WRITE_CACHE_DISABLED ;
422- err = queue_limits_commit_update (disk -> queue , & lim );
423- if (err )
424- return err ;
425- return count ;
398+ lim -> flags &= ~BLK_FLAG_WRITE_CACHE_DISABLED ;
399+ return 0 ;
426400}
427401
428402#define QUEUE_RO_ENTRY (_prefix , _name ) \
@@ -438,6 +412,13 @@ static struct queue_sysfs_entry _prefix##_entry = { \
438412 .store = _prefix##_store, \
439413};
440414
415+ #define QUEUE_LIM_RW_ENTRY (_prefix , _name ) \
416+ static struct queue_sysfs_entry _prefix##_entry = { \
417+ .attr = { .name = _name, .mode = 0644 }, \
418+ .show = _prefix##_show, \
419+ .store_limit = _prefix##_store, \
420+ }
421+
441422#define QUEUE_RW_LOAD_MODULE_ENTRY (_prefix , _name ) \
442423static struct queue_sysfs_entry _prefix##_entry = { \
443424 .attr = { .name = _name, .mode = 0644 }, \
@@ -448,7 +429,7 @@ static struct queue_sysfs_entry _prefix##_entry = { \
448429
449430QUEUE_RW_ENTRY (queue_requests , "nr_requests" );
450431QUEUE_RW_ENTRY (queue_ra , "read_ahead_kb" );
451- QUEUE_RW_ENTRY (queue_max_sectors , "max_sectors_kb" );
432+ QUEUE_LIM_RW_ENTRY (queue_max_sectors , "max_sectors_kb" );
452433QUEUE_RO_ENTRY (queue_max_hw_sectors , "max_hw_sectors_kb" );
453434QUEUE_RO_ENTRY (queue_max_segments , "max_segments" );
454435QUEUE_RO_ENTRY (queue_max_integrity_segments , "max_integrity_segments" );
@@ -464,7 +445,7 @@ QUEUE_RO_ENTRY(queue_io_opt, "optimal_io_size");
464445QUEUE_RO_ENTRY (queue_max_discard_segments , "max_discard_segments" );
465446QUEUE_RO_ENTRY (queue_discard_granularity , "discard_granularity" );
466447QUEUE_RO_ENTRY (queue_max_hw_discard_sectors , "discard_max_hw_bytes" );
467- QUEUE_RW_ENTRY (queue_max_discard_sectors , "discard_max_bytes" );
448+ QUEUE_LIM_RW_ENTRY (queue_max_discard_sectors , "discard_max_bytes" );
468449QUEUE_RO_ENTRY (queue_discard_zeroes_data , "discard_zeroes_data" );
469450
470451QUEUE_RO_ENTRY (queue_atomic_write_max_sectors , "atomic_write_max_bytes" );
@@ -484,11 +465,11 @@ QUEUE_RO_ENTRY(queue_max_open_zones, "max_open_zones");
484465QUEUE_RO_ENTRY (queue_max_active_zones , "max_active_zones" );
485466
486467QUEUE_RW_ENTRY (queue_nomerges , "nomerges" );
487- QUEUE_RW_ENTRY (queue_iostats_passthrough , "iostats_passthrough" );
468+ QUEUE_LIM_RW_ENTRY (queue_iostats_passthrough , "iostats_passthrough" );
488469QUEUE_RW_ENTRY (queue_rq_affinity , "rq_affinity" );
489470QUEUE_RW_ENTRY (queue_poll , "io_poll" );
490471QUEUE_RW_ENTRY (queue_poll_delay , "io_poll_delay" );
491- QUEUE_RW_ENTRY (queue_wc , "write_cache" );
472+ QUEUE_LIM_RW_ENTRY (queue_wc , "write_cache" );
492473QUEUE_RO_ENTRY (queue_fua , "fua" );
493474QUEUE_RO_ENTRY (queue_dax , "dax" );
494475QUEUE_RW_ENTRY (queue_io_timeout , "io_timeout" );
@@ -501,10 +482,10 @@ static struct queue_sysfs_entry queue_hw_sector_size_entry = {
501482 .show = queue_logical_block_size_show ,
502483};
503484
504- QUEUE_RW_ENTRY (queue_rotational , "rotational" );
505- QUEUE_RW_ENTRY (queue_iostats , "iostats" );
506- QUEUE_RW_ENTRY (queue_add_random , "add_random" );
507- QUEUE_RW_ENTRY (queue_stable_writes , "stable_writes" );
485+ QUEUE_LIM_RW_ENTRY (queue_rotational , "rotational" );
486+ QUEUE_LIM_RW_ENTRY (queue_iostats , "iostats" );
487+ QUEUE_LIM_RW_ENTRY (queue_add_random , "add_random" );
488+ QUEUE_LIM_RW_ENTRY (queue_stable_writes , "stable_writes" );
508489
509490#ifdef CONFIG_BLK_WBT
510491static ssize_t queue_var_store64 (s64 * var , const char * page )
@@ -702,7 +683,7 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
702683 struct request_queue * q = disk -> queue ;
703684 ssize_t res ;
704685
705- if (!entry -> store )
686+ if (!entry -> store_limit && ! entry -> store )
706687 return - EIO ;
707688
708689 /*
@@ -713,11 +694,24 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
713694 if (entry -> load_module )
714695 entry -> load_module (disk , page , length );
715696
716- blk_mq_freeze_queue (q );
717697 mutex_lock (& q -> sysfs_lock );
718- res = entry -> store (disk , page , length );
719- mutex_unlock (& q -> sysfs_lock );
698+ blk_mq_freeze_queue (q );
699+ if (entry -> store_limit ) {
700+ struct queue_limits lim = queue_limits_start_update (q );
701+
702+ res = entry -> store_limit (disk , page , length , & lim );
703+ if (res < 0 ) {
704+ queue_limits_cancel_update (q );
705+ } else {
706+ res = queue_limits_commit_update (q , & lim );
707+ if (!res )
708+ res = length ;
709+ }
710+ } else {
711+ res = entry -> store (disk , page , length );
712+ }
720713 blk_mq_unfreeze_queue (q );
714+ mutex_unlock (& q -> sysfs_lock );
721715 return res ;
722716}
723717
0 commit comments