Commit 8d64daf7 authored by James Smart's avatar James Smart Committed by Christoph Hellwig

nvme_fc: Add ls aborts on remote port teardown

remoteport teardown never aborted the LS opertions. Add support.
Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
parent c913a8b0
...@@ -61,12 +61,19 @@ struct nvme_fc_queue { ...@@ -61,12 +61,19 @@ struct nvme_fc_queue {
unsigned long flags; unsigned long flags;
} __aligned(sizeof(u64)); /* alignment for other things alloc'd with */ } __aligned(sizeof(u64)); /* alignment for other things alloc'd with */
enum nvme_fcop_flags {
FCOP_FLAGS_TERMIO = (1 << 0),
FCOP_FLAGS_RELEASED = (1 << 1),
FCOP_FLAGS_COMPLETE = (1 << 2),
};
struct nvmefc_ls_req_op { struct nvmefc_ls_req_op {
struct nvmefc_ls_req ls_req; struct nvmefc_ls_req ls_req;
struct nvme_fc_rport *rport; struct nvme_fc_rport *rport;
struct nvme_fc_queue *queue; struct nvme_fc_queue *queue;
struct request *rq; struct request *rq;
u32 flags;
int ls_error; int ls_error;
struct completion ls_done; struct completion ls_done;
...@@ -491,6 +498,30 @@ nvme_fc_rport_get(struct nvme_fc_rport *rport) ...@@ -491,6 +498,30 @@ nvme_fc_rport_get(struct nvme_fc_rport *rport)
return kref_get_unless_zero(&rport->ref); return kref_get_unless_zero(&rport->ref);
} }
static int
nvme_fc_abort_lsops(struct nvme_fc_rport *rport)
{
struct nvmefc_ls_req_op *lsop;
unsigned long flags;
restart:
spin_lock_irqsave(&rport->lock, flags);
list_for_each_entry(lsop, &rport->ls_req_list, lsreq_list) {
if (!(lsop->flags & FCOP_FLAGS_TERMIO)) {
lsop->flags |= FCOP_FLAGS_TERMIO;
spin_unlock_irqrestore(&rport->lock, flags);
rport->lport->ops->ls_abort(&rport->lport->localport,
&rport->remoteport,
&lsop->ls_req);
goto restart;
}
}
spin_unlock_irqrestore(&rport->lock, flags);
return 0;
}
/** /**
* nvme_fc_unregister_remoteport - transport entry point called by an * nvme_fc_unregister_remoteport - transport entry point called by an
* LLDD to deregister/remove a previously * LLDD to deregister/remove a previously
...@@ -526,6 +557,8 @@ nvme_fc_unregister_remoteport(struct nvme_fc_remote_port *portptr) ...@@ -526,6 +557,8 @@ nvme_fc_unregister_remoteport(struct nvme_fc_remote_port *portptr)
spin_unlock_irqrestore(&rport->lock, flags); spin_unlock_irqrestore(&rport->lock, flags);
nvme_fc_abort_lsops(rport);
nvme_fc_rport_put(rport); nvme_fc_rport_put(rport);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment