aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMing Lei <ming.lei@redhat.com>2017-04-15 08:38:22 -0400
committerJens Axboe <axboe@fb.com>2017-04-19 16:15:43 -0400
commit3a5088c8c11ac9d56f7e90acaaae9e0e98c1ff94 (patch)
treeea83e5447676e30b767103c665668932656c239b
parent005882e53d62f25dae10351a8d3f13326051e8f5 (diff)
block: respect BLK_MQ_F_NO_SCHED
If one driver claims that it doesn't support io scheduler via BLK_MQ_F_NO_SCHED, we should not allow to change and show the availabe io schedulers. This patch adds check to enhance this behaviour. Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--block/elevator.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/block/elevator.c b/block/elevator.c
index dbeecf7be719..4d9084a14c10 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -1098,12 +1098,20 @@ int elevator_change(struct request_queue *q, const char *name)
1098} 1098}
1099EXPORT_SYMBOL(elevator_change); 1099EXPORT_SYMBOL(elevator_change);
1100 1100
1101static inline bool elv_support_iosched(struct request_queue *q)
1102{
1103 if (q->mq_ops && q->tag_set && (q->tag_set->flags &
1104 BLK_MQ_F_NO_SCHED))
1105 return false;
1106 return true;
1107}
1108
1101ssize_t elv_iosched_store(struct request_queue *q, const char *name, 1109ssize_t elv_iosched_store(struct request_queue *q, const char *name,
1102 size_t count) 1110 size_t count)
1103{ 1111{
1104 int ret; 1112 int ret;
1105 1113
1106 if (!(q->mq_ops || q->request_fn)) 1114 if (!(q->mq_ops || q->request_fn) || !elv_support_iosched(q))
1107 return count; 1115 return count;
1108 1116
1109 ret = __elevator_change(q, name); 1117 ret = __elevator_change(q, name);
@@ -1135,7 +1143,7 @@ ssize_t elv_iosched_show(struct request_queue *q, char *name)
1135 len += sprintf(name+len, "[%s] ", elv->elevator_name); 1143 len += sprintf(name+len, "[%s] ", elv->elevator_name);
1136 continue; 1144 continue;
1137 } 1145 }
1138 if (__e->uses_mq && q->mq_ops) 1146 if (__e->uses_mq && q->mq_ops && elv_support_iosched(q))
1139 len += sprintf(name+len, "%s ", __e->elevator_name); 1147 len += sprintf(name+len, "%s ", __e->elevator_name);
1140 else if (!__e->uses_mq && !q->mq_ops) 1148 else if (!__e->uses_mq && !q->mq_ops)
1141 len += sprintf(name+len, "%s ", __e->elevator_name); 1149 len += sprintf(name+len, "%s ", __e->elevator_name);