Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a8ef414 authored by Robert Love's avatar Robert Love Committed by James Bottomley
Browse files

[SCSI] fcoe: Remove reference counting on 'stuct fcoe_interface'



The reference counting was necessary on these instances
because it was possible for NPIV ports to be destroyed
after the N_Port. A previous patch ensures that all NPIV
ports are destroyed before the N_Port making the need to
track references on the interface unnecessary.

Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent ccefd23e
Loading
Loading
Loading
Loading
+5 −43
Original line number Diff line number Diff line
@@ -384,7 +384,6 @@ static struct fcoe_interface *fcoe_interface_create(struct net_device *netdev,
	}

	dev_hold(netdev);
	kref_init(&fcoe->kref);

	/*
	 * Initialize FIP.
@@ -411,42 +410,6 @@ out:
	return fcoe;
}

/**
 * fcoe_interface_release() - fcoe_port kref release function
 * @kref: Embedded reference count in an fcoe_interface struct
 */
static void fcoe_interface_release(struct kref *kref)
{
	struct fcoe_interface *fcoe;
	struct net_device *netdev;

	fcoe = container_of(kref, struct fcoe_interface, kref);
	netdev = fcoe->netdev;
	/* tear-down the FCoE controller */
	fcoe_ctlr_destroy(&fcoe->ctlr);
	kfree(fcoe);
	dev_put(netdev);
	module_put(THIS_MODULE);
}

/**
 * fcoe_interface_get() - Get a reference to a FCoE interface
 * @fcoe: The FCoE interface to be held
 */
static inline void fcoe_interface_get(struct fcoe_interface *fcoe)
{
	kref_get(&fcoe->kref);
}

/**
 * fcoe_interface_put() - Put a reference to a FCoE interface
 * @fcoe: The FCoE interface to be released
 */
static inline void fcoe_interface_put(struct fcoe_interface *fcoe)
{
	kref_put(&fcoe->kref, fcoe_interface_release);
}

/**
 * fcoe_interface_cleanup() - Clean up a FCoE interface
 * @fcoe: The FCoE interface to be cleaned up
@@ -494,7 +457,11 @@ static void fcoe_interface_cleanup(struct fcoe_interface *fcoe)
	rtnl_unlock();

	/* Release the self-reference taken during fcoe_interface_create() */
	fcoe_interface_put(fcoe);
	/* tear-down the FCoE controller */
	fcoe_ctlr_destroy(fip);
	kfree(fcoe);
	dev_put(netdev);
	module_put(THIS_MODULE);
}

/**
@@ -976,9 +943,6 @@ static void fcoe_if_destroy(struct fc_lport *lport)
		dev_uc_del(netdev, port->data_src_addr);
	rtnl_unlock();

	/* Release reference held in fcoe_if_create() */
	fcoe_interface_put(fcoe);

	/* Free queued packets for the per-CPU receive threads */
	fcoe_percpu_clean(lport);

@@ -1168,7 +1132,6 @@ static struct fc_lport *fcoe_if_create(struct fcoe_interface *fcoe,
		goto out_lp_destroy;
	}

	fcoe_interface_get(fcoe);
	return lport;

out_lp_destroy:
@@ -2113,7 +2076,6 @@ static void fcoe_destroy_work(struct work_struct *work)

	fcoe = port->priv;
	fcoe_if_destroy(port->lport);

	fcoe_interface_cleanup(fcoe);

	mutex_unlock(&fcoe_config_mutex);
+0 −3
Original line number Diff line number Diff line
@@ -71,8 +71,6 @@ do { \
 * @ctlr:	      The FCoE controller (for FIP)
 * @oem:	      The offload exchange manager for all local port
 *		      instances associated with this port
 * @kref:	      The kernel reference
 *
 * This structure is 1:1 with a net devive.
 */
struct fcoe_interface {
@@ -83,7 +81,6 @@ struct fcoe_interface {
	struct packet_type fip_packet_type;
	struct fcoe_ctlr   ctlr;
	struct fc_exch_mgr *oem;
	struct kref	   kref;
};

#define fcoe_from_ctlr(fip) container_of(fip, struct fcoe_interface, ctlr)