As a step towards decoupling the cdev lifetime from f_hidg, lookup the f_hidg structure by minor number from IDR when opening the device. Signed-off-by: John Keeping <john@xxxxxxxxxxxx> --- drivers/usb/gadget/function/f_hid.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/function/f_hid.c b/drivers/usb/gadget/function/f_hid.c index 838256086bd2..4d20347fe908 100644 --- a/drivers/usb/gadget/function/f_hid.c +++ b/drivers/usb/gadget/function/f_hid.c @@ -441,8 +441,14 @@ static int f_hidg_release(struct inode *inode, struct file *fd) static int f_hidg_open(struct inode *inode, struct file *fd) { - struct f_hidg *hidg = - container_of(inode->i_cdev, struct f_hidg, cdev); + struct f_hidg *hidg; + + mutex_lock(&hidg_idr_lock); + hidg = idr_find(&hidg_idr, iminor(inode)); + mutex_unlock(&hidg_idr_lock); + + if (!hidg) + return -ENODEV; fd->private_data = hidg; @@ -827,6 +833,10 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f) if (status) goto fail_free_descs; + mutex_lock(&hidg_idr_lock); + idr_replace(&hidg_idr, hidg, hidg->minor); + mutex_unlock(&hidg_idr_lock); + device = device_create(hidg_class, NULL, dev, NULL, "%s%d", "hidg", hidg->minor); if (IS_ERR(device)) { -- 2.23.0