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 /block/elevator.c | |
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>
Diffstat (limited to 'block/elevator.c')
-rw-r--r-- | block/elevator.c | 13 |
1 files changed, 12 insertions, 1 deletions
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)) |