nvmet-fcloop: Remove remote port from list when unlinking
authorDaniel Wagner <dwagner@suse.de>
Mon, 18 Dec 2023 15:30:53 +0000 (16:30 +0100)
committerKeith Busch <kbusch@kernel.org>
Fri, 5 Jan 2024 21:15:40 +0000 (13:15 -0800)
The remote port is removed too late from fcloop_nports list. Remove it
when port is unregistered.

This prevents a busy loop in fcloop_exit, because it is possible the
remote port is found in the list and thus we will never progress.

The kernel log will be spammed with

  nvme_fcloop: fcloop_exit: Failed deleting remote port
  nvme_fcloop: fcloop_exit: Failed deleting target port

Signed-off-by: Daniel Wagner <dwagner@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/fcloop.c

index c65a734..ead349a 100644 (file)
@@ -995,11 +995,6 @@ fcloop_nport_free(struct kref *ref)
 {
        struct fcloop_nport *nport =
                container_of(ref, struct fcloop_nport, ref);
-       unsigned long flags;
-
-       spin_lock_irqsave(&fcloop_lock, flags);
-       list_del(&nport->nport_list);
-       spin_unlock_irqrestore(&fcloop_lock, flags);
 
        kfree(nport);
 }
@@ -1357,6 +1352,8 @@ __unlink_remote_port(struct fcloop_nport *nport)
                nport->tport->remoteport = NULL;
        nport->rport = NULL;
 
+       list_del(&nport->nport_list);
+
        return rport;
 }