[Stgt-devel] [Patch 3/3] Re-work of SMC support
FUJITA Tomonori
fujita.tomonori
Thu Jun 28 07:49:31 CEST 2007
From: "Mark Harvey" <markh794 at gmail.com>
Subject: Re: [Stgt-devel] [Patch 3/3] Re-work of SMC support
Date: Thu, 28 Jun 2007 10:20:16 +1000
> On 6/27/07, FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> wrote:
> > From: Mark Harvey <markh794 at gmail.com>
> > Subject: [Stgt-devel] [Patch 3/3] Re-work of SMC support
> > Date: Sat, 23 Jun 2007 18:14:04 +1000
> >
> > > diff --git a/usr/media.h b/usr/media.h
> > > new file mode 100644
> > > index 0000000..a04a27c
> > > --- /dev/null
> > > +++ b/usr/media.h
> > > @@ -0,0 +1,30 @@
> > > +/*
> > > + * Copyright (C) 2007 Mark Harvey markh794 at gmail dot com
> > > + *
> > > + * This program is free software; you can redistribute it and/or modify
> > > + * it under the terms of the GNU General Public License as published by
> > > + * the Free Software Foundation; version 2 of the License.
> > > + *
> > > + * This program is distributed in the hope that it will be useful,
> > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > > + * GNU General Public License for more details.
> > > + *
> > > + * You should have received a copy of the GNU General Public License
> > > + * along with this program; if not, write to the Free Software
> > > + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
> > > + */
> > > +#ifndef _MEDIA_H_
> > > +#define _MEDIA_H_
> > > +
> > > +enum c_type { /* Cartridge Types - Ref: smc3r06 - Table 20, page 37 */
> > > + CART_UNSPECIFIED,
> > > + CART_DATA,
> > > + CART_CLEAN,
> > > + CART_DIAGNOSTICS,
> > > + CART_WORM,
> > > + CART_MICROCODE,
> > > +};
> > > +
> > > +#endif /* _MEDIA_H_ */
> >
> > Why do you put this in smc.c?
>
> Slots within the SMC device can contain different media type..
>
> At the moment, this is not used by the SMC device but I included for
> when this support is added.
>
> Should I remove this until I get around to coding this portion of the code ?
I'm not sure whether we are on the same page.
What I wanted to say is why you need to put enum c_type to media.h
instead of smc.c.
> > > diff --git a/usr/mmc.c b/usr/mmc.c
> > > index 891cb60..0672877 100644
> > > --- a/usr/mmc.c
> > > +++ b/usr/mmc.c
> > > @@ -38,6 +38,7 @@
> > > #include "util.h"
> > > #include "tgtd.h"
> > > #include "target.h"
> > > +#include "tgtadm_error.h"
> > > #include "driver.h"
> > > #include "scsi.h"
> > > #include "spc.h"
> > > @@ -174,10 +175,26 @@ static int mmc_lu_init(struct scsi_lu *lu)
> > > return 0;
> > > }
> > >
> > > +static int mmc_lu_config(struct scsi_lu *lu, char * params)
> > > +{
> > > + char * mmc_params;
> > > + int ret;
> > > +
> > > + mmc_params = malloc(strlen(params) + 1);
> > > + if (!mmc_params)
> > > + return -ENOMEM;
> > > + mmc_params[0] = '\0';
> > > + ret = spc_lu_config(lu, params, mmc_params);
> > > + if (strlen(mmc_params)) /* We should not have any params left over */
> > > + ret = TGTADM_INVALID_REQUEST;
> > > + free(mmc_params);
> > > + return ret;
> > > +}
> >
> > strdup?
>
> I'm still trying to come up with a 'better' way of doing this.
>
> In an attempt to move all common parameter parsing within one common
> function and still be able to process any module unique params
> afterwards :
>
> ret = spc_lu_config(lu, params, mmc_params);
>
> - Original string of params passed in 'params', 'mmc_params' is a null string.
> - The spc_lu_config() copies any parameters it can not process in the
> *mmc_params.
> - It is then up the the xxx_lu_config() calling function to process
> any left over params (in mmc_params in this case) not handled by
> spc_lu_config().
> - If all params are processed in spc_lu_config(), then the
> *mmc_params will contain an empty string.
>
> I thought it might be a little more obvious to have the malloc() /
> free() within the same function rather then have spc_lu_config do the
> malloc() and then the caller free the space afterwards.
>
> The smc_lu_config() is the only module at the moment that needs the
> extra options.
>
> I expect the ssc_lu_config() to also require extra configuration
> options. Although I have not started coding that yet and have not
> fully thought thru what may be required.
>
>
>
> The other option would be to move the spc_lu_config() into each module
> and not share the common param handling.
How about:
typedef int (match_fn_t) (struct scsi_lu *);
int spc_lu_config(struct scsi_lu *lu, char *params, match_fn_t *fn,
match_table_t *t)
{
}
spc_lu_config calls fn with t (which device code like smc passes) for
non-standard params.
More information about the stgt
mailing list