@@ -426,9 +426,17 @@ static ssize_t queue_poll_store(struct request_queue *q, const char *page,
unsigned long poll_on;
ssize_t ret;
- if (!q->tag_set || q->tag_set->nr_maps <= HCTX_TYPE_POLL ||
- !q->tag_set->map[HCTX_TYPE_POLL].nr_queues)
- return -EINVAL;
+ if (queue_is_mq(q)) {
+ if (!q->tag_set || q->tag_set->nr_maps <= HCTX_TYPE_POLL ||
+ !q->tag_set->map[HCTX_TYPE_POLL].nr_queues)
+ return -EINVAL;
+ } else {
+ struct gendisk *disk = queue_to_disk(q);
+
+ if (!disk->fops->poll_capable ||
+ !disk->fops->poll_capable(disk))
+ return -EINVAL;
+ }
ret = queue_var_store(&poll_on, page, count);
if (ret < 0)
@@ -1881,6 +1881,7 @@ struct block_device_operations {
int (*report_zones)(struct gendisk *, sector_t sector,
unsigned int nr_zones, report_zones_cb cb, void *data);
char *(*devnode)(struct gendisk *disk, umode_t *mode);
+ bool (*poll_capable)(struct gendisk *disk);
struct module *owner;
const struct pr_ops *pr_ops;
};