aboutsummaryrefslogtreecommitdiffstats
path: root/block/blk-sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/blk-sysfs.c')
-rw-r--r--block/blk-sysfs.c72
1 files changed, 67 insertions, 5 deletions
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 8a6d81afb284..306759bbdf1b 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -2,6 +2,7 @@
2 * Functions related to sysfs handling 2 * Functions related to sysfs handling
3 */ 3 */
4#include <linux/kernel.h> 4#include <linux/kernel.h>
5#include <linux/slab.h>
5#include <linux/module.h> 6#include <linux/module.h>
6#include <linux/bio.h> 7#include <linux/bio.h>
7#include <linux/blkdev.h> 8#include <linux/blkdev.h>
@@ -106,6 +107,19 @@ static ssize_t queue_max_sectors_show(struct request_queue *q, char *page)
106 return queue_var_show(max_sectors_kb, (page)); 107 return queue_var_show(max_sectors_kb, (page));
107} 108}
108 109
110static ssize_t queue_max_segments_show(struct request_queue *q, char *page)
111{
112 return queue_var_show(queue_max_segments(q), (page));
113}
114
115static ssize_t queue_max_segment_size_show(struct request_queue *q, char *page)
116{
117 if (test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags))
118 return queue_var_show(queue_max_segment_size(q), (page));
119
120 return queue_var_show(PAGE_CACHE_SIZE, (page));
121}
122
109static ssize_t queue_logical_block_size_show(struct request_queue *q, char *page) 123static ssize_t queue_logical_block_size_show(struct request_queue *q, char *page)
110{ 124{
111 return queue_var_show(queue_logical_block_size(q), page); 125 return queue_var_show(queue_logical_block_size(q), page);
@@ -126,6 +140,21 @@ static ssize_t queue_io_opt_show(struct request_queue *q, char *page)
126 return queue_var_show(queue_io_opt(q), page); 140 return queue_var_show(queue_io_opt(q), page);
127} 141}
128 142
143static ssize_t queue_discard_granularity_show(struct request_queue *q, char *page)
144{
145 return queue_var_show(q->limits.discard_granularity, page);
146}
147
148static ssize_t queue_discard_max_show(struct request_queue *q, char *page)
149{
150 return queue_var_show(q->limits.max_discard_sectors << 9, page);
151}
152
153static ssize_t queue_discard_zeroes_data_show(struct request_queue *q, char *page)
154{
155 return queue_var_show(queue_discard_zeroes_data(q), page);
156}
157
129static ssize_t 158static ssize_t
130queue_max_sectors_store(struct request_queue *q, const char *page, size_t count) 159queue_max_sectors_store(struct request_queue *q, const char *page, size_t count)
131{ 160{
@@ -174,7 +203,8 @@ static ssize_t queue_nonrot_store(struct request_queue *q, const char *page,
174 203
175static ssize_t queue_nomerges_show(struct request_queue *q, char *page) 204static ssize_t queue_nomerges_show(struct request_queue *q, char *page)
176{ 205{
177 return queue_var_show(blk_queue_nomerges(q), page); 206 return queue_var_show((blk_queue_nomerges(q) << 1) |
207 blk_queue_noxmerges(q), page);
178} 208}
179 209
180static ssize_t queue_nomerges_store(struct request_queue *q, const char *page, 210static ssize_t queue_nomerges_store(struct request_queue *q, const char *page,
@@ -184,10 +214,12 @@ static ssize_t queue_nomerges_store(struct request_queue *q, const char *page,
184 ssize_t ret = queue_var_store(&nm, page, count); 214 ssize_t ret = queue_var_store(&nm, page, count);
185 215
186 spin_lock_irq(q->queue_lock); 216 spin_lock_irq(q->queue_lock);
187 if (nm) 217 queue_flag_clear(QUEUE_FLAG_NOMERGES, q);
218 queue_flag_clear(QUEUE_FLAG_NOXMERGES, q);
219 if (nm == 2)
188 queue_flag_set(QUEUE_FLAG_NOMERGES, q); 220 queue_flag_set(QUEUE_FLAG_NOMERGES, q);
189 else 221 else if (nm)
190 queue_flag_clear(QUEUE_FLAG_NOMERGES, q); 222 queue_flag_set(QUEUE_FLAG_NOXMERGES, q);
191 spin_unlock_irq(q->queue_lock); 223 spin_unlock_irq(q->queue_lock);
192 224
193 return ret; 225 return ret;
@@ -262,6 +294,16 @@ static struct queue_sysfs_entry queue_max_hw_sectors_entry = {
262 .show = queue_max_hw_sectors_show, 294 .show = queue_max_hw_sectors_show,
263}; 295};
264 296
297static struct queue_sysfs_entry queue_max_segments_entry = {
298 .attr = {.name = "max_segments", .mode = S_IRUGO },
299 .show = queue_max_segments_show,
300};
301
302static struct queue_sysfs_entry queue_max_segment_size_entry = {
303 .attr = {.name = "max_segment_size", .mode = S_IRUGO },
304 .show = queue_max_segment_size_show,
305};
306
265static struct queue_sysfs_entry queue_iosched_entry = { 307static struct queue_sysfs_entry queue_iosched_entry = {
266 .attr = {.name = "scheduler", .mode = S_IRUGO | S_IWUSR }, 308 .attr = {.name = "scheduler", .mode = S_IRUGO | S_IWUSR },
267 .show = elv_iosched_show, 309 .show = elv_iosched_show,
@@ -293,6 +335,21 @@ static struct queue_sysfs_entry queue_io_opt_entry = {
293 .show = queue_io_opt_show, 335 .show = queue_io_opt_show,
294}; 336};
295 337
338static struct queue_sysfs_entry queue_discard_granularity_entry = {
339 .attr = {.name = "discard_granularity", .mode = S_IRUGO },
340 .show = queue_discard_granularity_show,
341};
342
343static struct queue_sysfs_entry queue_discard_max_entry = {
344 .attr = {.name = "discard_max_bytes", .mode = S_IRUGO },
345 .show = queue_discard_max_show,
346};
347
348static struct queue_sysfs_entry queue_discard_zeroes_data_entry = {
349 .attr = {.name = "discard_zeroes_data", .mode = S_IRUGO },
350 .show = queue_discard_zeroes_data_show,
351};
352
296static struct queue_sysfs_entry queue_nonrot_entry = { 353static struct queue_sysfs_entry queue_nonrot_entry = {
297 .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR }, 354 .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR },
298 .show = queue_nonrot_show, 355 .show = queue_nonrot_show,
@@ -322,12 +379,17 @@ static struct attribute *default_attrs[] = {
322 &queue_ra_entry.attr, 379 &queue_ra_entry.attr,
323 &queue_max_hw_sectors_entry.attr, 380 &queue_max_hw_sectors_entry.attr,
324 &queue_max_sectors_entry.attr, 381 &queue_max_sectors_entry.attr,
382 &queue_max_segments_entry.attr,
383 &queue_max_segment_size_entry.attr,
325 &queue_iosched_entry.attr, 384 &queue_iosched_entry.attr,
326 &queue_hw_sector_size_entry.attr, 385 &queue_hw_sector_size_entry.attr,
327 &queue_logical_block_size_entry.attr, 386 &queue_logical_block_size_entry.attr,
328 &queue_physical_block_size_entry.attr, 387 &queue_physical_block_size_entry.attr,
329 &queue_io_min_entry.attr, 388 &queue_io_min_entry.attr,
330 &queue_io_opt_entry.attr, 389 &queue_io_opt_entry.attr,
390 &queue_discard_granularity_entry.attr,
391 &queue_discard_max_entry.attr,
392 &queue_discard_zeroes_data_entry.attr,
331 &queue_nonrot_entry.attr, 393 &queue_nonrot_entry.attr,
332 &queue_nomerges_entry.attr, 394 &queue_nomerges_entry.attr,
333 &queue_rq_affinity_entry.attr, 395 &queue_rq_affinity_entry.attr,
@@ -414,7 +476,7 @@ static void blk_release_queue(struct kobject *kobj)
414 kmem_cache_free(blk_requestq_cachep, q); 476 kmem_cache_free(blk_requestq_cachep, q);
415} 477}
416 478
417static struct sysfs_ops queue_sysfs_ops = { 479static const struct sysfs_ops queue_sysfs_ops = {
418 .show = queue_attr_show, 480 .show = queue_attr_show,
419 .store = queue_attr_store, 481 .store = queue_attr_store,
420}; 482};