diff options
Diffstat (limited to 'block/blk-sysfs.c')
-rw-r--r-- | block/blk-sysfs.c | 72 |
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 | ||
110 | static 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 | |||
115 | static 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 | |||
109 | static ssize_t queue_logical_block_size_show(struct request_queue *q, char *page) | 123 | static 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 | ||
143 | static 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 | |||
148 | static 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 | |||
153 | static 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 | |||
129 | static ssize_t | 158 | static ssize_t |
130 | queue_max_sectors_store(struct request_queue *q, const char *page, size_t count) | 159 | queue_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 | ||
175 | static ssize_t queue_nomerges_show(struct request_queue *q, char *page) | 204 | static 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 | ||
180 | static ssize_t queue_nomerges_store(struct request_queue *q, const char *page, | 210 | static 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 | ||
297 | static struct queue_sysfs_entry queue_max_segments_entry = { | ||
298 | .attr = {.name = "max_segments", .mode = S_IRUGO }, | ||
299 | .show = queue_max_segments_show, | ||
300 | }; | ||
301 | |||
302 | static 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 | |||
265 | static struct queue_sysfs_entry queue_iosched_entry = { | 307 | static 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 | ||
338 | static struct queue_sysfs_entry queue_discard_granularity_entry = { | ||
339 | .attr = {.name = "discard_granularity", .mode = S_IRUGO }, | ||
340 | .show = queue_discard_granularity_show, | ||
341 | }; | ||
342 | |||
343 | static 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 | |||
348 | static 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 | |||
296 | static struct queue_sysfs_entry queue_nonrot_entry = { | 353 | static 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 | ||
417 | static struct sysfs_ops queue_sysfs_ops = { | 479 | static 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 | }; |