[SeaBIOS] [PATCH 0/9] add support for generic lun enumeration

Roman Kagan rkagan at virtuozzo.com
Tue Mar 28 18:34:32 CEST 2017


On Mon, Mar 27, 2017 at 12:54:03PM -0400, Kevin O'Connor wrote:
> On Mon, Mar 27, 2017 at 06:31:29PM +0300, Roman Kagan wrote:
> > On Tue, Mar 14, 2017 at 06:16:04PM +0300, Roman Kagan wrote:
> > > On Mon, Mar 13, 2017 at 12:11:49PM -0400, Kevin O'Connor wrote:
> > > > On Thu, Mar 02, 2017 at 07:37:38PM +0300, Roman Kagan wrote:
> > > > > On Thu, Mar 02, 2017 at 11:14:37AM -0500, Kevin O'Connor wrote:
> > > > I have a few high-level comments on the series.  I wonder if there is
> > > > a way to reduce the amount of control passing between the generic scsi
> > > > code and the driver code.  Specifically, I wonder if the callback
> > > > function scsi_add_lun could be simplified.  Some thoughts:
> > > > 
> > > > - instead of scsi_rep_luns_scan() being passed a callback, perhaps
> > > >   introduce a scsi_get_luns() command that returns a malloc'd struct
> > > >   containing the list of luns.  The driver code could then iterate
> > > >   over the list.
> > > 
> > > I considered this at first, but it looked like more boilerplate code in
> > > the drivers so I decided to go with the callback.
> 
> I was thinking the driver could have something like:
> 
>     struct scsi_luns *luns = scsi_get_luns(&vlun0.drive);
>     for (i = 0; luns && i < luns->count; i++)
>         xxx_add_lun(&vlun0, luns->luns[i]);
>     free(luns);
> 
> One could layout 'struct scsi_luns' to use the same memory as
> cdbres_report_luns:
> 
>     struct scsi_luns {
>         u32 count, pad;
>         u64 luns[0];
>     }
> 
> And scsi_get_luns() could fixup the big-endian conversion in-place (or
> the driver loop above could just directly call
> be32_to_cpu/be64_to_cpu).  If REPORT LUNS fails then scsi_get_luns()
> could just fill in 'struct scsi_luns' with count=1, lun[0]=0.

I'm not convinced that exposing all this boilerplate is simpler than
hiding the details under the hood of a single function.  Or is perhaps
anything wrong with passing function pointers in general?
Anyway I can do it the way you suggest if this is what you want.


>   - malloc_high shouldn't be used on temporary reservations (as it
>     can fragment the permanent memory pool) - use malloc_tmp instead.

OK

>   - scsilun2u64() looks like be64_to_cpu - or did I miss something?

No it would've been too simple :)  It's a funny mix: the luns are
encoded as four be16-s LE-ordered wrt each other.

>   - I'd prefer to avoid backwards goto's - a "for (;;)" loop would be
>     preferabale

OK

I'll rework and resubmit the patchset once I have your final word on the
interface.

Thanks!
Roman.



More information about the SeaBIOS mailing list