This seems pretty basic, but I'm having trouble with it.
The current libfc code has a private structure called fc_rport_libfc_priv
that gets allocated along with the fc_rport structure.
I'm working on patches that restructure this to be separately allocated,
since we need a the private structure to be around before we can do
fc_remote_port_add(). It's a long story, but my question applies to
any FC driver that wants to allocate its rport private data separately.
How should rport->dd_data be set to NULL before/after calling
fc_rport_delete().
I used to set it to NULL before, but figure it's safer to clear it after
terminate_io has been called. I did a get_device(&rport->dev) first
to be sure the rport doesn't get freed in the meantime.
However, other threads may be in queuecommand already and already
beyond their call to fc_remote_port_chkready() and will reference dd_data.
Maybe they just aren't allowed do that?
Or maybe dd_data isn't allowed to go NULL until the rport times
out and is getting deleted?
Maybe we need a small private rport data with just enough info for the I/O
that's already in progress, or I can recode the I/O path to not use
dd_data (it's mostly stuff that can be gotten through scsi_host instead).
Or maybe we need to do more in our fc_rport_terminate_io callback
from fc_remote_port_delete() to be sure that all I/O really ceases.
We currently do an exch_mgr_reset(), but perhaps some I/O thread hasn't
allocated an exchange yet.
Ideas?
Thanks,
Joe
_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel