Re: [PATCH 2/4] scsi_transport_fc: refactor event posting routines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <jsmart2021@xxxxxxxxx>
> ---
>  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 <emilne@xxxxxxxxxx>




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux