mirror of
https://github.com/torvalds/linux.git
synced 2024-12-18 00:53:40 +00:00
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: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Michal Nazarewicz <mina86@mina86.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
43cacb03aa
commit
8515bac01a
@ -2786,7 +2786,7 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
curlun = kcalloc(nluns, sizeof(*curlun), GFP_KERNEL);
|
curlun = kcalloc(FSG_MAX_LUNS, sizeof(*curlun), GFP_KERNEL);
|
||||||
if (unlikely(!curlun))
|
if (unlikely(!curlun))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@ -2796,8 +2796,6 @@ int fsg_common_set_nluns(struct fsg_common *common, int nluns)
|
|||||||
common->luns = curlun;
|
common->luns = curlun;
|
||||||
common->nluns = nluns;
|
common->nluns = nluns;
|
||||||
|
|
||||||
pr_info("Number of LUNs=%d\n", common->nluns);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(fsg_common_set_nluns);
|
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_opts *opts = fsg_opts_from_func_inst(fi);
|
||||||
struct fsg_common *common = opts->common;
|
struct fsg_common *common = opts->common;
|
||||||
struct fsg_dev *fsg;
|
struct fsg_dev *fsg;
|
||||||
|
unsigned nluns, i;
|
||||||
|
|
||||||
fsg = kzalloc(sizeof(*fsg), GFP_KERNEL);
|
fsg = kzalloc(sizeof(*fsg), GFP_KERNEL);
|
||||||
if (unlikely(!fsg))
|
if (unlikely(!fsg))
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
mutex_lock(&opts->lock);
|
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++;
|
opts->refcnt++;
|
||||||
mutex_unlock(&opts->lock);
|
mutex_unlock(&opts->lock);
|
||||||
|
|
||||||
fsg->function.name = FSG_DRIVER_DESC;
|
fsg->function.name = FSG_DRIVER_DESC;
|
||||||
fsg->function.bind = fsg_bind;
|
fsg->function.bind = fsg_bind;
|
||||||
fsg->function.unbind = fsg_unbind;
|
fsg->function.unbind = fsg_unbind;
|
||||||
|
Loading…
Reference in New Issue
Block a user