On Fri, 2019-04-05 at 16:04 -0700, James Smart wrote:
> There are two routines generating transport events that do the
> same thing with only a couple of values set differently.
> 
> Refactor so there's a single routine doing the netlink
> operations to send the event. All the differences are passed as
> arguments. Export the symbol so the generic routine can be
> called by llds.
> 
> Modify the existing two event routines to use the helper.
> 
> Signed-off-by: James Smart <jsmart2...@gmail.com>
> ---
>  drivers/scsi/scsi_transport_fc.c | 100 
> ++++++++++++++++-----------------------
>  include/scsi/scsi_transport_fc.h |  11 +++--
>  2 files changed, 49 insertions(+), 62 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_transport_fc.c 
> b/drivers/scsi/scsi_transport_fc.c
> index d7035270d274..9bea4dfbe128 100644
> --- a/drivers/scsi/scsi_transport_fc.c
> +++ b/drivers/scsi/scsi_transport_fc.c
> @@ -523,20 +523,23 @@ fc_get_event_number(void)
>  }
>  EXPORT_SYMBOL(fc_get_event_number);
>  
> -
>  /**
> - * fc_host_post_event - called to post an even on an fc_host.
> + * fc_host_post_fc_event - routine to do the work of posting an event
> + *                      on an fc_host.
>   * @shost:           host the event occurred on
>   * @event_number:    fc event number obtained from get_fc_event_number()
>   * @event_code:              fc_host event being posted
> - * @event_data:              32bits of data for the event being posted
> + * @data_len:                amount, in bytes, of event data
> + * @data_buf:                pointer to event data
> + * @vendor_id:          value for Vendor id
>   *
>   * Notes:
>   *   This routine assumes no locks are held on entry.
>   */
>  void
> -fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
> -             enum fc_host_event_code event_code, u32 event_data)
> +fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number,
> +             enum fc_host_event_code event_code,
> +             u32 data_len, char *data_buf, u64 vendor_id)
>  {
>       struct sk_buff *skb;
>       struct nlmsghdr *nlh;
> @@ -545,12 +548,15 @@ fc_host_post_event(struct Scsi_Host *shost, u32 
> event_number,
>       u32 len;
>       int err;
>  
> +     if (!data_buf || data_len < 4)
> +             data_len = 0;
> +
>       if (!scsi_nl_sock) {
>               err = -ENOENT;
>               goto send_fail;
>       }
>  
> -     len = FC_NL_MSGALIGN(sizeof(*event));
> +     len = FC_NL_MSGALIGN(sizeof(*event) + data_len);
>  
>       skb = nlmsg_new(len, GFP_KERNEL);
>       if (!skb) {
> @@ -568,12 +574,13 @@ fc_host_post_event(struct Scsi_Host *shost, u32 
> event_number,
>       INIT_SCSI_NL_HDR(&event->snlh, SCSI_NL_TRANSPORT_FC,
>                               FC_NL_ASYNC_EVENT, len);
>       event->seconds = ktime_get_real_seconds();
> -     event->vendor_id = 0;
> +     event->vendor_id = vendor_id;
>       event->host_no = shost->host_no;
> -     event->event_datalen = sizeof(u32);     /* bytes */
> +     event->event_datalen = data_len;        /* bytes */
>       event->event_num = event_number;
>       event->event_code = event_code;
> -     event->event_data = event_data;
> +     if (data_len)
> +             memcpy(&event->event_data, data_buf, data_len);
>  
>       nlmsg_multicast(scsi_nl_sock, skb, 0, SCSI_NL_GRP_FC_EVENTS,
>                       GFP_KERNEL);
> @@ -586,14 +593,35 @@ fc_host_post_event(struct Scsi_Host *shost, u32 
> event_number,
>       printk(KERN_WARNING
>               "%s: Dropped Event : host %d %s data 0x%08x - err %d\n",
>               __func__, shost->host_no,
> -             (name) ? name : "<unknown>", event_data, err);
> +             (name) ? name : "<unknown>",
> +             (data_len) ? *((u32 *)data_buf) : 0xFFFFFFFF, err);
>       return;
>  }
> +EXPORT_SYMBOL(fc_host_post_fc_event);
> +
> +/**
> + * fc_host_post_event - called to post an even on an fc_host.
> + * @shost:           host the event occurred on
> + * @event_number:    fc event number obtained from get_fc_event_number()
> + * @event_code:              fc_host event being posted
> + * @event_data:              32bits of data for the event being posted
> + *
> + * Notes:
> + *   This routine assumes no locks are held on entry.
> + */
> +void
> +fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
> +             enum fc_host_event_code event_code, u32 event_data)
> +{
> +     fc_host_post_fc_event(shost, event_number, event_code,
> +             (u32)sizeof(u32), (char *)&event_data, 0);
> +}
>  EXPORT_SYMBOL(fc_host_post_event);
>  
>  
>  /**
> - * fc_host_post_vendor_event - called to post a vendor unique event on an 
> fc_host
> + * fc_host_post_vendor_event - called to post a vendor unique event
> + *                      on an fc_host
>   * @shost:           host the event occurred on
>   * @event_number:    fc event number obtained from get_fc_event_number()
>   * @data_len:                amount, in bytes, of vendor unique data
> @@ -607,58 +635,12 @@ void
>  fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
>               u32 data_len, char * data_buf, u64 vendor_id)
>  {
> -     struct sk_buff *skb;
> -     struct nlmsghdr *nlh;
> -     struct fc_nl_event *event;
> -     u32 len;
> -     int err;
> -
> -     if (!scsi_nl_sock) {
> -             err = -ENOENT;
> -             goto send_vendor_fail;
> -     }
> -
> -     len = FC_NL_MSGALIGN(sizeof(*event) + data_len);
> -
> -     skb = nlmsg_new(len, GFP_KERNEL);
> -     if (!skb) {
> -             err = -ENOBUFS;
> -             goto send_vendor_fail;
> -     }
> -
> -     nlh = nlmsg_put(skb, 0, 0, SCSI_TRANSPORT_MSG, len, 0);
> -     if (!nlh) {
> -             err = -ENOBUFS;
> -             goto send_vendor_fail_skb;
> -     }
> -     event = nlmsg_data(nlh);
> -
> -     INIT_SCSI_NL_HDR(&event->snlh, SCSI_NL_TRANSPORT_FC,
> -                             FC_NL_ASYNC_EVENT, len);
> -     event->seconds = ktime_get_real_seconds();
> -     event->vendor_id = vendor_id;
> -     event->host_no = shost->host_no;
> -     event->event_datalen = data_len;        /* bytes */
> -     event->event_num = event_number;
> -     event->event_code = FCH_EVT_VENDOR_UNIQUE;
> -     memcpy(&event->event_data, data_buf, data_len);
> -
> -     nlmsg_multicast(scsi_nl_sock, skb, 0, SCSI_NL_GRP_FC_EVENTS,
> -                     GFP_KERNEL);
> -     return;
> -
> -send_vendor_fail_skb:
> -     kfree_skb(skb);
> -send_vendor_fail:
> -     printk(KERN_WARNING
> -             "%s: Dropped Event : host %d vendor_unique - err %d\n",
> -             __func__, shost->host_no, err);
> -     return;
> +     fc_host_post_fc_event(shost, event_number, FCH_EVT_VENDOR_UNIQUE,
> +             data_len, data_buf, vendor_id);
>  }
>  EXPORT_SYMBOL(fc_host_post_vendor_event);
>  
>  
> -
>  static __init int fc_transport_init(void)
>  {
>       int error;
> diff --git a/include/scsi/scsi_transport_fc.h 
> b/include/scsi/scsi_transport_fc.h
> index 15da45dc2a5d..7998b322ed13 100644
> --- a/include/scsi/scsi_transport_fc.h
> +++ b/include/scsi/scsi_transport_fc.h
> @@ -798,10 +798,15 @@ u32 fc_get_event_number(void);
>  void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
>               enum fc_host_event_code event_code, u32 event_data);
>  void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
> -             u32 data_len, char * data_buf, u64 vendor_id);
> +             u32 data_len, char *data_buf, u64 vendor_id);
> +void fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number,
> +             enum fc_host_event_code event_code,
> +             u32 data_len, char *data_buf, u64 vendor_id);
>       /* Note: when specifying vendor_id to fc_host_post_vendor_event()
> -      *   be sure to read the Vendor Type and ID formatting requirements
> -      *   specified in scsi_netlink.h
> +      *   or fc_host_post_fc_event(), be sure to read the Vendor Type
> +      *   and ID formatting requirements specified in scsi_netlink.h
> +      * Note: when calling fc_host_post_fc_event(), vendor_id may be
> +      *   specified as 0.
>        */
>  struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
>               struct fc_vport_identifiers *);

Reviewed-by: Ewan D. Milne <emi...@redhat.com>

Reply via email to