> +
> + struct request_queue *q;
Do you really need the queue backpointer? At least as far as this
patch is concerned we could just pass the queue on to
deadline_enable_zones_wlock and be fine. And in general we should
always passing the q, as we can trivial go from queue to deadline_data
using queue->elevator->elevator_data.
> +static int deadline_zoned_init_queue(struct request_queue *q,
> + struct deadline_data *dd)
> +{
> + if (!blk_queue_is_zoned(q) ||
> + !blk_queue_nr_zones(q)) {
Shouldn't !blk_queue_nr_zones(q) be enough? If not both conditionals
could easily fit into the same line, and I'd be tempted to move them
to the caller and call deadline_enable_zones_wlock straight from there.
> @@ -341,6 +387,15 @@ static int dd_init_queue(struct request_queue *q, struct
> elevator_type *e)
> spin_lock_init(&dd->lock);
> INIT_LIST_HEAD(&dd->dispatch);
>
> + dd->q = q;
> + spin_lock_init(&dd->zone_lock);
> + ret = deadline_zoned_init_queue(q, dd);
> + if (ret) {
> + kfree(dd);
> + kobject_put(&eq->kobj);
> + return ret;
> + }
> +
> q->elevator = eq;
> return 0;
This should probably grow goto based unwinding, e.g.
int ret = -ENOMEM;
...
dd = kzalloc_node(sizeof(*dd), GFP_KERNEL, q->node);
if (!dd)
goto out_put_object;
...
if (blk_queue_nr_zones(q))) {
ret = deadline_enable_zones_wlock(...);
if (ret)
goto out_free_dd;
}
q->elevator = eq;
return 0;
out_free_dd:
kfree(dd);
out_put_object
kobject_put(&eq->kobj);
return ret;