Re: [PATCH v2 4/5] usb: gadget: mass_storage: Use static array for luns

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

 



On Thu, Jul 02 2015, Krzysztof Opasiak wrote:
> This patch replace dynamicly allocated luns array with static one.
> This simplifies the code of mass storage function and modules.
> It also fix issue with reporting wrong number of LUNs in GET_MAX_LUN
> request.
>
> Also change the nluns to max_luns which is better name for value
> stored in that place as we no longer need to store size of luns
> array.
>
> Reported-by: David Fisher <david.fisher1@xxxxxxxxxxxx>
> Signed-off-by: Krzysztof Opasiak <k.opasiak@xxxxxxxxxxx>
> ---
>  drivers/usb/gadget/function/f_mass_storage.c |  125 ++++++++++----------------
>  drivers/usb/gadget/function/f_mass_storage.h |    4 -
>  drivers/usb/gadget/legacy/acm_ms.c           |    6 --
>  drivers/usb/gadget/legacy/mass_storage.c     |    6 --
>  drivers/usb/gadget/legacy/multi.c            |    6 --
>  5 files changed, 48 insertions(+), 99 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c
> index ad0f69b..befe251 100644
> --- a/drivers/usb/gadget/function/f_mass_storage.c
> +++ b/drivers/usb/gadget/function/f_mass_storage.c
> @@ -279,9 +279,9 @@ struct fsg_common {
>  	int			cmnd_size;
>  	u8			cmnd[MAX_COMMAND_SIZE];
>  
> -	unsigned int		nluns;
> +	int			max_lun;

To be honest, I don’t like this change.  It is more idiomatic to store
number of elements in an array rather than index of the last element.
Sooner or later someone will do for (i = 0; i < common->max_lun; ++i)
out of habit.

>  	unsigned int		lun;
> -	struct fsg_lun		**luns;
> +	struct fsg_lun		*luns[FSG_MAX_LUNS];
>  	struct fsg_lun		*curlun;
>  
>  	unsigned int		bulk_out_maxpacket;

> @@ -2760,48 +2767,16 @@ static void _fsg_common_remove_luns(struct fsg_common *common, int n)
>  			fsg_common_remove_lun(common->luns[i], common->sysfs);
>  			common->luns[i] = NULL;
>  		}
> +
> +	_fsg_common_reduce_max_lun(common);
>  }
>  
>  void fsg_common_remove_luns(struct fsg_common *common)
>  {
> -	_fsg_common_remove_luns(common, common->nluns);
> +	_fsg_common_remove_luns(common, common->max_lun);

Shouldn’t this be:

+	_fsg_common_remove_luns(common, common->max_lun + 1);

>  }
>  EXPORT_SYMBOL_GPL(fsg_common_remove_luns);
>  

> @@ -2954,7 +2931,7 @@ error_lun:
>  	if (common->sysfs)
>  		device_unregister(&lun->dev);
>  	fsg_lun_close(lun);
> -	common->luns[id] = NULL;

You need to keep this line.

> +	_fsg_common_reduce_max_lun(common);
>  error_sysfs:
>  	kfree(lun);
>  	return rc;

> @@ -3305,11 +3282,9 @@ static struct config_group *fsg_lun_make(struct config_group *group,
>  		return ERR_PTR(ret);
>  
>  	fsg_opts = to_fsg_opts(&group->cg_item);
> -	if (num >= FSG_MAX_LUNS)
> -		return ERR_PTR(-ERANGE);

Going through all the memory allocation and mutex locking just to find
out that num is to big seems wasteful.  I’d keep this check here.

>  
>  	mutex_lock(&fsg_opts->lock);
> -	if (fsg_opts->refcnt || fsg_opts->common->luns[num]) {
> +	if (fsg_opts->refcnt) {
>  		ret = -EBUSY;
>  		goto out;
>  	}

-- 
Best regards,                                         _     _
.o. | Liege of Serenely Enlightened Majesty of      o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz    (o o)
ooo +--<mpn@xxxxxxxxxx>--<xmpp:mina86@xxxxxxxxxx>--ooO--(_)--Ooo--
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux