Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8515bac0 authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Felipe Balbi
Browse files

usb: f_mass_storage: limit number of reported LUNs



Mass storage function created via configfs always reports eight LUNs
to the hosts even if only one LUN has been configured.  Adjust the
number when the USB function is allocated based on LUNs that user
has created.

Cc: <stable@vger.kernel.org>
Tested-by: default avatarGregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: default avatarMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 43cacb03
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -2786,7 +2786,7 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns)
		return -EINVAL;
	}

	curlun = kcalloc(nluns, sizeof(*curlun), GFP_KERNEL);
	curlun = kcalloc(FSG_MAX_LUNS, sizeof(*curlun), GFP_KERNEL);
	if (unlikely(!curlun))
		return -ENOMEM;

@@ -2796,8 +2796,6 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns)
	common->luns = curlun;
	common->nluns = nluns;

	pr_info("Number of LUNs=%d\n", common->nluns);

	return 0;
}
EXPORT_SYMBOL_GPL(fsg_common_set_nluns);
@@ -3563,14 +3561,26 @@ static struct usb_function *fsg_alloc(struct usb_function_instance *fi)
	struct fsg_opts *opts = fsg_opts_from_func_inst(fi);
	struct fsg_common *common = opts->common;
	struct fsg_dev *fsg;
	unsigned nluns, i;

	fsg = kzalloc(sizeof(*fsg), GFP_KERNEL);
	if (unlikely(!fsg))
		return ERR_PTR(-ENOMEM);

	mutex_lock(&opts->lock);
	if (!opts->refcnt) {
		for (nluns = i = 0; i < FSG_MAX_LUNS; ++i)
			if (common->luns[i])
				nluns = i + 1;
		if (!nluns)
			pr_warn("No LUNS defined, continuing anyway\n");
		else
			common->nluns = nluns;
		pr_info("Number of LUNs=%u\n", common->nluns);
	}
	opts->refcnt++;
	mutex_unlock(&opts->lock);

	fsg->function.name	= FSG_DRIVER_DESC;
	fsg->function.bind	= fsg_bind;
	fsg->function.unbind	= fsg_unbind;