Messages in this thread | | | Date | Tue, 19 Dec 2023 12:47:10 +0100 | Subject | Re: [PATCH v3 16/16] nvmet-fc: take ref count on tgtport before delete assoc | From | Hannes Reinecke <> |
| |
On 12/18/23 16:31, Daniel Wagner wrote: > We have to ensure that the tgtport is not going away > before be have remove all the associations.
before we have removed all the associations.
> > Signed-off-by: Daniel Wagner <dwagner@suse.de> > --- > drivers/nvme/target/fc.c | 31 +++++++++++++++++++++++-------- > 1 file changed, 23 insertions(+), 8 deletions(-) > > diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c > index 30ba4ede333f..455d35ef97eb 100644 > --- a/drivers/nvme/target/fc.c > +++ b/drivers/nvme/target/fc.c > @@ -1092,13 +1092,28 @@ nvmet_fc_alloc_hostport(struct nvmet_fc_tgtport *tgtport, void *hosthandle) > } > > static void > -nvmet_fc_delete_assoc(struct work_struct *work) > +nvmet_fc_delete_assoc(struct nvmet_fc_tgt_assoc *assoc) > +{ > + nvmet_fc_delete_target_assoc(assoc); > + nvmet_fc_tgt_a_put(assoc); > +} > + > +static void > +nvmet_fc_delete_assoc_work(struct work_struct *work) > { > struct nvmet_fc_tgt_assoc *assoc = > container_of(work, struct nvmet_fc_tgt_assoc, del_work); > + struct nvmet_fc_tgtport *tgtport = assoc->tgtport; > > - nvmet_fc_delete_target_assoc(assoc); > - nvmet_fc_tgt_a_put(assoc); > + nvmet_fc_delete_assoc(assoc); > + nvmet_fc_tgtport_put(tgtport); > +} > + > +static void > +nvmet_fc_schedule_delete_assoc(struct nvmet_fc_tgt_assoc *assoc) > +{ > + nvmet_fc_tgtport_get(assoc->tgtport); > + queue_work(nvmet_wq, &assoc->del_work);
Errm. That is dangerous, as it will leak a reference if 'del_work' is already queued. And we already took a reference from the caller. Why do we need two references here?
Cheers,
Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@suse.de +49 911 74053 688 SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809 (AG Nürnberg), GF: Ivo Totev, Andrew McDonald, Werner Knoblich
| |