diff options
author | Martin K. Petersen <martin.petersen@oracle.com> | 2009-05-22 17:17:52 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-05-22 17:22:55 -0400 |
commit | cd43e26f071524647e660706b784ebcbefbd2e44 (patch) | |
tree | 11625a25ba8a7c5cd4fe41b54d53506a7982433b | |
parent | 025146e13b63483add912706c101fb0fb6f015cc (diff) |
block: Expose stacked device queues in sysfs
Currently stacking devices do not have a queue directory in sysfs.
However, many of the I/O characteristics like sector size, maximum
request size, etc. are queue properties.
This patch enables the queue directory for MD/DM devices. The elevator
code has been modified to deal with queues that do not have an I/O
scheduler.
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r-- | block/blk-sysfs.c | 6 | ||||
-rw-r--r-- | block/elevator.c | 13 |
2 files changed, 15 insertions, 4 deletions
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 142a4acddd43..3ccdadb8e204 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c | |||
@@ -395,9 +395,6 @@ int blk_register_queue(struct gendisk *disk) | |||
395 | if (WARN_ON(!q)) | 395 | if (WARN_ON(!q)) |
396 | return -ENXIO; | 396 | return -ENXIO; |
397 | 397 | ||
398 | if (!q->request_fn) | ||
399 | return 0; | ||
400 | |||
401 | ret = kobject_add(&q->kobj, kobject_get(&disk_to_dev(disk)->kobj), | 398 | ret = kobject_add(&q->kobj, kobject_get(&disk_to_dev(disk)->kobj), |
402 | "%s", "queue"); | 399 | "%s", "queue"); |
403 | if (ret < 0) | 400 | if (ret < 0) |
@@ -405,6 +402,9 @@ int blk_register_queue(struct gendisk *disk) | |||
405 | 402 | ||
406 | kobject_uevent(&q->kobj, KOBJ_ADD); | 403 | kobject_uevent(&q->kobj, KOBJ_ADD); |
407 | 404 | ||
405 | if (!q->request_fn) | ||
406 | return 0; | ||
407 | |||
408 | ret = elv_register_queue(q); | 408 | ret = elv_register_queue(q); |
409 | if (ret) { | 409 | if (ret) { |
410 | kobject_uevent(&q->kobj, KOBJ_REMOVE); | 410 | kobject_uevent(&q->kobj, KOBJ_REMOVE); |
diff --git a/block/elevator.c b/block/elevator.c index ebee948293eb..bd78f693fcf2 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
@@ -575,6 +575,9 @@ void elv_drain_elevator(struct request_queue *q) | |||
575 | */ | 575 | */ |
576 | void elv_quiesce_start(struct request_queue *q) | 576 | void elv_quiesce_start(struct request_queue *q) |
577 | { | 577 | { |
578 | if (!q->elevator) | ||
579 | return; | ||
580 | |||
578 | queue_flag_set(QUEUE_FLAG_ELVSWITCH, q); | 581 | queue_flag_set(QUEUE_FLAG_ELVSWITCH, q); |
579 | 582 | ||
580 | /* | 583 | /* |
@@ -1050,6 +1053,9 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name, | |||
1050 | char elevator_name[ELV_NAME_MAX]; | 1053 | char elevator_name[ELV_NAME_MAX]; |
1051 | struct elevator_type *e; | 1054 | struct elevator_type *e; |
1052 | 1055 | ||
1056 | if (!q->elevator) | ||
1057 | return count; | ||
1058 | |||
1053 | strlcpy(elevator_name, name, sizeof(elevator_name)); | 1059 | strlcpy(elevator_name, name, sizeof(elevator_name)); |
1054 | strstrip(elevator_name); | 1060 | strstrip(elevator_name); |
1055 | 1061 | ||
@@ -1073,10 +1079,15 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name, | |||
1073 | ssize_t elv_iosched_show(struct request_queue *q, char *name) | 1079 | ssize_t elv_iosched_show(struct request_queue *q, char *name) |
1074 | { | 1080 | { |
1075 | struct elevator_queue *e = q->elevator; | 1081 | struct elevator_queue *e = q->elevator; |
1076 | struct elevator_type *elv = e->elevator_type; | 1082 | struct elevator_type *elv; |
1077 | struct elevator_type *__e; | 1083 | struct elevator_type *__e; |
1078 | int len = 0; | 1084 | int len = 0; |
1079 | 1085 | ||
1086 | if (!q->elevator) | ||
1087 | return sprintf(name, "none\n"); | ||
1088 | |||
1089 | elv = e->elevator_type; | ||
1090 | |||
1080 | spin_lock(&elv_list_lock); | 1091 | spin_lock(&elv_list_lock); |
1081 | list_for_each_entry(__e, &elv_list, list) { | 1092 | list_for_each_entry(__e, &elv_list, list) { |
1082 | if (!strcmp(elv->elevator_name, __e->elevator_name)) | 1093 | if (!strcmp(elv->elevator_name, __e->elevator_name)) |