| From: Chris Leech <christopher.leech@intel.com> |
| Subject: [FcOE] make fc_disc inline with the fc_lport structure |
| References: bnc #459142 |
| |
| The extra memory allocation we're not being checked for failure. Rather than |
| further complicating things, just make the discovery code required fields be |
| part of the lport structure. |
| |
| Signed-off-by: Chris Leech <christopher.leech@intel.com> |
| Acked-by: Bernhard Walle <bwalle@suse.de> |
| |
| |
| drivers/scsi/libfc/fc_disc.c | 80 +++++++----------------------------------- |
| drivers/scsi/libfc/fc_lport.c | 2 - |
| include/scsi/libfc.h | 22 ++++++++++- |
| 3 files changed, 35 insertions(+), 69 deletions(-) |
| |
| |
| |
| |
| @@ -45,26 +45,6 @@ static int fc_disc_debug; |
| FC_DBG(fmt); \ |
| } while (0) |
| |
| -struct fc_disc { |
| - unsigned char retry_count; |
| - unsigned char delay; |
| - unsigned char pending; |
| - unsigned char requested; |
| - unsigned short seq_count; |
| - unsigned char buf_len; |
| - enum fc_disc_event event; |
| - |
| - void (*disc_callback)(struct fc_lport *, |
| - enum fc_disc_event); |
| - |
| - struct list_head rports; |
| - struct fc_lport *lport; |
| - struct mutex disc_mutex; |
| - struct fc_gpn_ft_resp partial_buf; /* partial name buffer */ |
| - struct delayed_work disc_work; |
| - |
| -}; |
| - |
| static void fc_disc_gpn_ft_req(struct fc_disc *); |
| static void fc_disc_gpn_ft_resp(struct fc_seq *, struct fc_frame *, void *); |
| static int fc_disc_new_target(struct fc_disc *, struct fc_rport *, |
| @@ -83,14 +63,11 @@ static void fc_disc_restart(struct fc_di |
| struct fc_rport *fc_disc_lookup_rport(const struct fc_lport *lport, |
| u32 port_id) |
| { |
| - struct fc_disc *disc = lport->disc; |
| + const struct fc_disc *disc = &lport->disc; |
| struct fc_rport *rport, *found = NULL; |
| struct fc_rport_libfc_priv *rdata; |
| int disc_found = 0; |
| |
| - if (!disc) |
| - return NULL; |
| - |
| list_for_each_entry(rdata, &disc->rports, peers) { |
| rport = PRIV_TO_RPORT(rdata); |
| if (rport->port_id == port_id) { |
| @@ -108,27 +85,6 @@ struct fc_rport *fc_disc_lookup_rport(co |
| } |
| |
| /** |
| - * fc_disc_alloc - Allocate a discovery work object |
| - * @lport: The FC lport associated with the discovery job |
| - */ |
| -static inline struct fc_disc *fc_disc_alloc(struct fc_lport *lport) |
| -{ |
| - struct fc_disc *disc; |
| - |
| - disc = kzalloc(sizeof(struct fc_disc), GFP_KERNEL); |
| - INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout); |
| - mutex_init(&disc->disc_mutex); |
| - INIT_LIST_HEAD(&disc->rports); |
| - |
| - disc->lport = lport; |
| - lport->disc = disc; |
| - disc->delay = FC_DISC_DELAY; |
| - disc->event = DISC_EV_NONE; |
| - |
| - return disc; |
| -} |
| - |
| -/** |
| * fc_disc_stop_rports - delete all the remote ports associated with the lport |
| * @disc: The discovery job to stop rports on |
| * |
| @@ -167,7 +123,7 @@ static void fc_disc_rport_callback(struc |
| enum fc_rport_event event) |
| { |
| struct fc_rport_libfc_priv *rdata = rport->dd_data; |
| - struct fc_disc *disc = lport->disc; |
| + struct fc_disc *disc = &lport->disc; |
| int found = 0; |
| |
| FC_DEBUG_DISC("Received a %d event for port (%6x)\n", event, |
| @@ -304,13 +260,7 @@ static void fc_disc_recv_req(struct fc_s |
| struct fc_lport *lport) |
| { |
| u8 op; |
| - struct fc_disc *disc = lport->disc; |
| - |
| - if (!disc) { |
| - FC_DBG("Received a request for an lport not managed " |
| - "by the discovery engine\n"); |
| - return; |
| - } |
| + struct fc_disc *disc = &lport->disc; |
| |
| op = fc_frame_payload_op(fp); |
| switch (op) { |
| @@ -365,17 +315,7 @@ static void fc_disc_start(void (*disc_ca |
| { |
| struct fc_rport *rport; |
| struct fc_rport_identifiers ids; |
| - struct fc_disc *disc = lport->disc; |
| - |
| - if (!disc) { |
| - FC_DEBUG_DISC("No existing discovery job, " |
| - "creating one for lport (%6x)\n", |
| - fc_host_port_id(lport->host)); |
| - disc = fc_disc_alloc(lport); |
| - } else |
| - FC_DEBUG_DISC("Found an existing discovery job " |
| - "for lport (%6x)\n", |
| - fc_host_port_id(lport->host)); |
| + struct fc_disc *disc = &lport->disc; |
| |
| /* |
| * At this point we may have a new disc job or an existing |
| @@ -831,7 +771,7 @@ out: |
| */ |
| void fc_disc_stop(struct fc_lport *lport) |
| { |
| - struct fc_disc *disc = lport->disc; |
| + struct fc_disc *disc = &lport->disc; |
| |
| if (disc) { |
| cancel_delayed_work_sync(&disc->disc_work); |
| @@ -858,6 +798,7 @@ void fc_disc_stop_final(struct fc_lport |
| */ |
| int fc_disc_init(struct fc_lport *lport) |
| { |
| + struct fc_disc *disc; |
| |
| if (!lport->tt.disc_start) |
| lport->tt.disc_start = fc_disc_start; |
| @@ -874,6 +815,15 @@ int fc_disc_init(struct fc_lport *lport) |
| if (!lport->tt.rport_lookup) |
| lport->tt.rport_lookup = fc_disc_lookup_rport; |
| |
| + disc = &lport->disc; |
| + INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout); |
| + mutex_init(&disc->disc_mutex); |
| + INIT_LIST_HEAD(&disc->rports); |
| + |
| + disc->lport = lport; |
| + disc->delay = FC_DISC_DELAY; |
| + disc->event = DISC_EV_NONE; |
| + |
| return 0; |
| } |
| EXPORT_SYMBOL(fc_disc_init); |
| |
| |
| @@ -627,8 +627,6 @@ int fc_fabric_logoff(struct fc_lport *lp |
| { |
| lport->tt.disc_stop_final(lport); |
| mutex_lock(&lport->lp_mutex); |
| - kfree(lport->disc); |
| - lport->disc = NULL; |
| fc_lport_enter_logo(lport); |
| mutex_unlock(&lport->lp_mutex); |
| return 0; |
| |
| |
| @@ -572,7 +572,25 @@ struct libfc_function_template { |
| void (*disc_stop_final) (struct fc_lport *); |
| }; |
| |
| -struct fc_disc; |
| +/* information used by the discovery layer */ |
| +struct fc_disc { |
| + unsigned char retry_count; |
| + unsigned char delay; |
| + unsigned char pending; |
| + unsigned char requested; |
| + unsigned short seq_count; |
| + unsigned char buf_len; |
| + enum fc_disc_event event; |
| + |
| + void (*disc_callback)(struct fc_lport *, |
| + enum fc_disc_event); |
| + |
| + struct list_head rports; |
| + struct fc_lport *lport; |
| + struct mutex disc_mutex; |
| + struct fc_gpn_ft_resp partial_buf; /* partial name buffer */ |
| + struct delayed_work disc_work; |
| +}; |
| |
| struct fc_lport { |
| struct list_head list; |
| @@ -582,8 +600,8 @@ struct fc_lport { |
| struct fc_exch_mgr *emp; |
| struct fc_rport *dns_rp; |
| struct fc_rport *ptp_rp; |
| - struct fc_disc *disc; |
| void *scsi_priv; |
| + struct fc_disc disc; |
| |
| /* Operational Information */ |
| struct libfc_function_template tt; |
| |