RE: [PATCH 1/1] scsi: storvsc: Support manual scan of FC hosts on Hyper-V

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

 




> -----Original Message-----
> From: KY Srinivasan
> Sent: Sunday, March 20, 2016 11:59 AM
> To: 'James Bottomley' <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>; Martin
> K. Petersen <martin.petersen@xxxxxxxxxx>
> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx>; gregkh@xxxxxxxxxxxxxxxxxxx;
> linux-kernel@xxxxxxxxxxxxxxx; devel@xxxxxxxxxxxxxxxxxxxxxx;
> ohering@xxxxxxxx; jbottomley@xxxxxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx;
> apw@xxxxxxxxxxxxx; vkuznets@xxxxxxxxxx; jasowang@xxxxxxxxxx;
> hare@xxxxxxx
> Subject: RE: [PATCH 1/1] scsi: storvsc: Support manual scan of FC hosts on
> Hyper-V
> 
> 
> 
> > -----Original Message-----
> > From: James Bottomley
> [mailto:James.Bottomley@xxxxxxxxxxxxxxxxxxxxx]
> > Sent: Friday, March 18, 2016 3:41 PM
> > To: KY Srinivasan <kys@xxxxxxxxxxxxx>; Martin K. Petersen
> > <martin.petersen@xxxxxxxxxx>
> > Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx>; gregkh@xxxxxxxxxxxxxxxxxxx;
> > linux-kernel@xxxxxxxxxxxxxxx; devel@xxxxxxxxxxxxxxxxxxxxxx;
> > ohering@xxxxxxxx; jbottomley@xxxxxxxxxxxxx; linux-scsi@xxxxxxxxxxxxxxx;
> > apw@xxxxxxxxxxxxx; vkuznets@xxxxxxxxxx; jasowang@xxxxxxxxxx;
> > hare@xxxxxxx
> > Subject: Re: [PATCH 1/1] scsi: storvsc: Support manual scan of FC hosts on
> > Hyper-V
> >
> > On Thu, 2016-03-17 at 00:01 +0000, KY Srinivasan wrote:
> > > The only attributes I would be interested are:
> > > 1) node name
> > > 2) port name
> > >
> > > Ideally, if this can show under /sys/class/fc_host/hostx/port_name
> > > and node_name,
> > > it will be ideal since all user scripts can work.
> >
> > OK, like this?
> 
> Yes; thank you very much James. Looking at the patch though, it may be an
> overkill considering how much of the code is duplicated. The current fc
> transport
> class does give us the flexibility to control the attributes we want to surface
> (fc_function_template). In any case I will test this code and get back to you
> soon.

Today I got a chance to test this patch. Looks like all the state is not getting
properly set in this new transport class. I am hitting this NULL pointer reference fault in
get_device_parent(). Looks like the device class is not properly setup for
this transport class. class_dir_create_and_add() is not called for this class
and so the glue_dirs is NULL.   I fixed the issue:

1) You will need to call the transport_class_register() for this new transport class in
fc_transport_init()
2) We cannot use fc_host as the name in this new class since the standard fc transport already
Uses that name. I changed the name to get this to work. This will create a new directory under /sys/class.
So my original goal of  being compatible with existing scripts that expect to find the information under
/sys/class/fc_host will not be met.

Regards,

K. Y


> 
> Regards,
> 
> K. Y
> 
> 
> >
> > From 7af7c428e7e04ddcc87fda12d6571e3dff8ae024 Mon Sep 17 00:00:00
> > 2001
> > From: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>
> > Date: Fri, 18 Mar 2016 15:35:45 -0700
> > Subject: scsi_transport_fc: introduce lightweight class for virtualization
> >  systems
> >
> > The FC transport class is very heavily tilted towards helping things
> > which operate a fabric (as it should be).  However, there seems to be
> > a need for a lightweight version for use in virtual systems that
> > simply want to show pass through FC information without making any use
> > of the heavyweight functions.  This is an attempt to give them what
> > they want: the lightweight class has no vports or rports and only two
> > host attributes.  Essentially, it's designed for the HV storvsc
> > driver, but if other virtualizataion systems have similar problems, we
> > can add more attributes.
> >
> > Signed-off-by: James Bottomley <jejb@xxxxxxxxxxxxxxxxxx>
> > ---
> >  drivers/scsi/scsi_transport_fc.c | 94
> > ++++++++++++++++++++++++++++++++++++++++
> >  include/scsi/scsi_transport_fc.h |  3 ++
> >  2 files changed, 97 insertions(+)
> >
> > diff --git a/drivers/scsi/scsi_transport_fc.c
> b/drivers/scsi/scsi_transport_fc.c
> > index 8a88226..a9fcb4d 100644
> > --- a/drivers/scsi/scsi_transport_fc.c
> > +++ b/drivers/scsi/scsi_transport_fc.c
> > @@ -351,6 +351,27 @@ struct fc_internal {
> >
> >  #define to_fc_internal(tmpl)	container_of(tmpl, struct fc_internal, t)
> >
> > +#define FC_LW_HOST_NUM_ATTRS 	2
> > +struct fc_lw_internal {
> > +	struct scsi_transport_template t;
> > +	struct fc_function_template *f;
> > +
> > +	/*
> > +	 * For attributes : each object has :
> > +	 *   An array of the actual attributes structures
> > +	 *   An array of null-terminated pointers to the attribute
> > +	 *     structures - used for mid-layer interaction.
> > +	 *
> > +	 * The attribute containers for the starget and host are are
> > +	 * part of the midlayer. As the remote port is specific to the
> > +	 * fc transport, we must provide the attribute container.
> > +	 */
> > +	struct device_attribute
> > private_host_attrs[FC_LW_HOST_NUM_ATTRS];
> > +	struct device_attribute *host_attrs[FC_LW_HOST_NUM_ATTRS + 1];
> > +};
> > +
> > +#define to_fc_lw_internal(tmpl)	container_of(tmpl, struct
> > fc_lw_internal, t)
> > +
> >  static int fc_target_setup(struct transport_container *tc, struct device
> *dev,
> >  			   struct device *cdev)
> >  {
> > @@ -472,6 +493,12 @@ static int fc_host_remove(struct
> transport_container
> > *tc, struct device *dev,
> >  	return 0;
> >  }
> >
> > +static DECLARE_TRANSPORT_CLASS(fc_lw_host_class,
> > +			       "fc_host",
> > +			       NULL,
> > +			       NULL,
> > +			       NULL);
> > +
> >  static DECLARE_TRANSPORT_CLASS(fc_host_class,
> >  			       "fc_host",
> >  			       fc_host_setup,
> > @@ -1968,6 +1995,25 @@ static int fc_host_match(struct
> > attribute_container *cont,
> >  	return &i->t.host_attrs.ac == cont;
> >  }
> >
> > +static int fc_lw_host_match(struct attribute_container *cont,
> > +			  struct device *dev)
> > +{
> > +	struct Scsi_Host *shost;
> > +	struct fc_lw_internal *i;
> > +
> > +	if (!scsi_is_host_device(dev))
> > +		return 0;
> > +
> > +	shost = dev_to_shost(dev);
> > +	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
> > +	    != &fc_lw_host_class.class)
> > +		return 0;
> > +
> > +	i = to_fc_lw_internal(shost->transportt);
> > +
> > +	return &i->t.host_attrs.ac == cont;
> > +}
> > +
> >  static int fc_target_match(struct attribute_container *cont,
> >  			    struct device *dev)
> >  {
> > @@ -2171,6 +2217,54 @@ static int fc_it_nexus_response(struct Scsi_Host
> > *shost, u64 nexus, int result)
> >  	return i->f->it_nexus_response(shost, nexus, result);
> >  }
> >
> > +/**
> > + * fc_attach_lw_transport - light weight attach function
> > + * @ft:		function template for optional attributes
> > + *
> > + * This attach function is to be used only for virtual FC emulators
> > + * which do not have a physical fabric underneath them and thus only
> > + * need a few attributes and no helper functions
> > + */
> > +struct scsi_transport_template *
> > +fc_lw_attach_transport(struct fc_function_template *ft)
> > +{
> > +	int count;
> > +	struct fc_lw_internal *i = kzalloc(sizeof(struct fc_lw_internal),
> > +					   GFP_KERNEL);
> > +
> > +	if (unlikely(!i))
> > +		return NULL;
> > +
> > +	i->t.host_attrs.ac.attrs = &i->host_attrs[0];
> > +	i->t.host_attrs.ac.class = &fc_lw_host_class.class;
> > +	i->t.host_attrs.ac.match = fc_lw_host_match;
> > +	i->t.host_size = sizeof(struct fc_host_attrs);
> > +	transport_container_register(&i->t.host_attrs);
> > +
> > +	i->f = ft;
> > +
> > +	count = 0;
> > +	SETUP_HOST_ATTRIBUTE_RD(node_name);
> > +	SETUP_HOST_ATTRIBUTE_RD(port_name);
> > +
> > +	BUG_ON(count > FC_HOST_NUM_ATTRS);
> > +
> > +	i->host_attrs[count] = NULL;
> > +
> > +	return &i->t;
> > +}
> > +EXPORT_SYMBOL(fc_lw_attach_transport);
> > +
> > +void fc_lw_release_transport(struct scsi_transport_template *t)
> > +{
> > +	struct fc_lw_internal *i = to_fc_lw_internal(t);
> > +
> > +	transport_container_unregister(&i->t.host_attrs);
> > +
> > +	kfree(i);
> > +}
> > +EXPORT_SYMBOL(fc_lw_release_transport);
> > +
> >  struct scsi_transport_template *
> >  fc_attach_transport(struct fc_function_template *ft)
> >  {
> > diff --git a/include/scsi/scsi_transport_fc.h
> b/include/scsi/scsi_transport_fc.h
> > index 784bc2c..b0a9a64 100644
> > --- a/include/scsi/scsi_transport_fc.h
> > +++ b/include/scsi/scsi_transport_fc.h
> > @@ -835,6 +835,9 @@ fc_vport_set_state(struct fc_vport *vport, enum
> > fc_vport_state new_state)
> >  	vport->vport_state = new_state;
> >  }
> >
> > +struct scsi_transport_template *fc_lw_attach_transport(
> > +			struct fc_function_template *);
> > +void fc_lw_release_transport(struct scsi_transport_template *);
> >  struct scsi_transport_template *fc_attach_transport(
> >  			struct fc_function_template *);
> >  void fc_release_transport(struct scsi_transport_template *);
> > --
> > 2.6.2

��.n��������+%������w��{.n�����{������ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f




[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