> + > + 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;