@@ -24,6 +24,8 @@ struct queue_sysfs_entry {
24
24
struct attribute attr ;
25
25
ssize_t (* show )(struct gendisk * disk , char * page );
26
26
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 );
27
29
void (* load_module )(struct gendisk * disk , const char * page , size_t count );
28
30
};
29
31
@@ -153,13 +155,11 @@ QUEUE_SYSFS_SHOW_CONST(discard_zeroes_data, 0)
153
155
QUEUE_SYSFS_SHOW_CONST (write_same_max , 0 )
154
156
QUEUE_SYSFS_SHOW_CONST (poll_delay , -1 )
155
157
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 )
158
160
{
159
161
unsigned long max_discard_bytes ;
160
- struct queue_limits lim ;
161
162
ssize_t ret ;
162
- int err ;
163
163
164
164
ret = queue_var_store (& max_discard_bytes , page , count );
165
165
if (ret < 0 )
@@ -171,54 +171,40 @@ static ssize_t queue_max_discard_sectors_store(struct gendisk *disk,
171
171
if ((max_discard_bytes >> SECTOR_SHIFT ) > UINT_MAX )
172
172
return - EINVAL ;
173
173
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 ;
180
176
}
181
177
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 )
184
181
{
185
182
unsigned long max_sectors_kb ;
186
- struct queue_limits lim ;
187
183
ssize_t ret ;
188
- int err ;
189
184
190
185
ret = queue_var_store (& max_sectors_kb , page , count );
191
186
if (ret < 0 )
192
187
return ret ;
193
188
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 ;
200
191
}
201
192
202
193
static 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 )
204
195
{
205
- struct queue_limits lim ;
206
196
unsigned long val ;
207
197
ssize_t ret ;
208
198
209
199
ret = queue_var_store (& val , page , count );
210
200
if (ret < 0 )
211
201
return ret ;
212
202
213
- lim = queue_limits_start_update (disk -> queue );
214
203
if (val )
215
- lim . features |= feature ;
204
+ lim -> features |= feature ;
216
205
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 ;
222
208
}
223
209
224
210
#define QUEUE_SYSFS_FEATURE (_name , _feature ) \
@@ -227,10 +213,10 @@ static ssize_t queue_##_name##_show(struct gendisk *disk, char *page) \
227
213
return sysfs_emit(page, "%u\n", \
228
214
!!(disk->queue->limits.features & _feature)); \
229
215
} \
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) \
232
218
{ \
233
- return queue_feature_store(disk, page, count, _feature); \
219
+ return queue_feature_store(disk, page, count, lim, _feature); \
234
220
}
235
221
236
222
QUEUE_SYSFS_FEATURE (rotational , BLK_FEAT_ROTATIONAL )
@@ -273,29 +259,23 @@ static ssize_t queue_iostats_passthrough_show(struct gendisk *disk, char *page)
273
259
return queue_var_show (!!blk_queue_passthrough_stat (disk -> queue ), page );
274
260
}
275
261
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 )
278
264
{
279
- struct queue_limits lim ;
280
265
unsigned long ios ;
281
266
ssize_t ret ;
282
267
283
268
ret = queue_var_store (& ios , page , count );
284
269
if (ret < 0 )
285
270
return ret ;
286
271
287
- lim = queue_limits_start_update (disk -> queue );
288
272
if (ios )
289
- lim . flags |= BLK_FLAG_IOSTATS_PASSTHROUGH ;
273
+ lim -> flags |= BLK_FLAG_IOSTATS_PASSTHROUGH ;
290
274
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 ;
298
277
}
278
+
299
279
static ssize_t queue_nomerges_show (struct gendisk * disk , char * page )
300
280
{
301
281
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)
398
378
return sysfs_emit (page , "write through\n" );
399
379
}
400
380
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 )
403
383
{
404
- struct queue_limits lim ;
405
384
bool disable ;
406
- int err ;
407
385
408
386
if (!strncmp (page , "write back" , 10 )) {
409
387
disable = false;
@@ -414,15 +392,11 @@ static ssize_t queue_wc_store(struct gendisk *disk, const char *page,
414
392
return - EINVAL ;
415
393
}
416
394
417
- lim = queue_limits_start_update (disk -> queue );
418
395
if (disable )
419
- lim . flags |= BLK_FLAG_WRITE_CACHE_DISABLED ;
396
+ lim -> flags |= BLK_FLAG_WRITE_CACHE_DISABLED ;
420
397
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 ;
426
400
}
427
401
428
402
#define QUEUE_RO_ENTRY (_prefix , _name ) \
@@ -438,6 +412,13 @@ static struct queue_sysfs_entry _prefix##_entry = { \
438
412
.store = _prefix##_store, \
439
413
};
440
414
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
+
441
422
#define QUEUE_RW_LOAD_MODULE_ENTRY (_prefix , _name ) \
442
423
static struct queue_sysfs_entry _prefix##_entry = { \
443
424
.attr = { .name = _name, .mode = 0644 }, \
@@ -448,7 +429,7 @@ static struct queue_sysfs_entry _prefix##_entry = { \
448
429
449
430
QUEUE_RW_ENTRY (queue_requests , "nr_requests" );
450
431
QUEUE_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" );
452
433
QUEUE_RO_ENTRY (queue_max_hw_sectors , "max_hw_sectors_kb" );
453
434
QUEUE_RO_ENTRY (queue_max_segments , "max_segments" );
454
435
QUEUE_RO_ENTRY (queue_max_integrity_segments , "max_integrity_segments" );
@@ -464,7 +445,7 @@ QUEUE_RO_ENTRY(queue_io_opt, "optimal_io_size");
464
445
QUEUE_RO_ENTRY (queue_max_discard_segments , "max_discard_segments" );
465
446
QUEUE_RO_ENTRY (queue_discard_granularity , "discard_granularity" );
466
447
QUEUE_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" );
468
449
QUEUE_RO_ENTRY (queue_discard_zeroes_data , "discard_zeroes_data" );
469
450
470
451
QUEUE_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");
484
465
QUEUE_RO_ENTRY (queue_max_active_zones , "max_active_zones" );
485
466
486
467
QUEUE_RW_ENTRY (queue_nomerges , "nomerges" );
487
- QUEUE_RW_ENTRY (queue_iostats_passthrough , "iostats_passthrough" );
468
+ QUEUE_LIM_RW_ENTRY (queue_iostats_passthrough , "iostats_passthrough" );
488
469
QUEUE_RW_ENTRY (queue_rq_affinity , "rq_affinity" );
489
470
QUEUE_RW_ENTRY (queue_poll , "io_poll" );
490
471
QUEUE_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" );
492
473
QUEUE_RO_ENTRY (queue_fua , "fua" );
493
474
QUEUE_RO_ENTRY (queue_dax , "dax" );
494
475
QUEUE_RW_ENTRY (queue_io_timeout , "io_timeout" );
@@ -501,10 +482,10 @@ static struct queue_sysfs_entry queue_hw_sector_size_entry = {
501
482
.show = queue_logical_block_size_show ,
502
483
};
503
484
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" );
508
489
509
490
#ifdef CONFIG_BLK_WBT
510
491
static ssize_t queue_var_store64 (s64 * var , const char * page )
@@ -702,7 +683,7 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
702
683
struct request_queue * q = disk -> queue ;
703
684
ssize_t res ;
704
685
705
- if (!entry -> store )
686
+ if (!entry -> store_limit && ! entry -> store )
706
687
return - EIO ;
707
688
708
689
/*
@@ -713,11 +694,24 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
713
694
if (entry -> load_module )
714
695
entry -> load_module (disk , page , length );
715
696
716
- blk_mq_freeze_queue (q );
717
697
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
+ }
720
713
blk_mq_unfreeze_queue (q );
714
+ mutex_unlock (& q -> sysfs_lock );
721
715
return res ;
722
716
}
723
717
0 commit comments