Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754203AbbGWWI7 (ORCPT ); Thu, 23 Jul 2015 18:08:59 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:45659 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753765AbbGWWIz (ORCPT ); Thu, 23 Jul 2015 18:08:55 -0400 Date: Thu, 23 Jul 2015 15:08:54 -0700 From: Greg KH To: Richard Watts Cc: linux-serial@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/1] Avoid usb reset crashes by making tty_io cdevs truly dynamic Message-ID: <20150723220854.GA24492@kroah.com> References: <555B518D.2010102@kynesim.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <555B518D.2010102@kynesim.co.uk> User-Agent: Mutt/1.5.23+102 (2ca89bed6448) (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3339 Lines: 104 On Tue, May 19, 2015 at 04:06:53PM +0100, Richard Watts wrote: > Avoid usb reset crashes by making tty_io cdevs truly dynamic What USB reset crashes are you referring to here? > > Signed-off-by: Richard Watts > Reported-by: Duncan Mackintosh > --- > drivers/tty/tty_io.c | 24 ++++++++++++++++-------- > include/linux/tty_driver.h | 2 +- > 2 files changed, 17 insertions(+), 9 deletions(-) > > diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c > index e569546..699cf20 100644 > --- a/drivers/tty/tty_io.c > +++ b/drivers/tty/tty_io.c > @@ -3168,9 +3168,12 @@ static int tty_cdev_add(struct tty_driver *driver, > dev_t dev, > unsigned int index, unsigned int count) > { > /* init here, since reused cdevs cause crashes */ > - cdev_init(&driver->cdevs[index], &tty_fops); > - driver->cdevs[index].owner = driver->owner; > - return cdev_add(&driver->cdevs[index], dev, count); > + driver->cdevs[index] = cdev_alloc(); > + if (!driver->cdevs[index]) > + return -ENOMEM; > + cdev_init(driver->cdevs[index], &tty_fops); > + driver->cdevs[index]->owner = driver->owner; > + return cdev_add(driver->cdevs[index], dev, count); > } > > /** > @@ -3276,8 +3279,10 @@ struct device *tty_register_device_attr(struct > tty_driver *driver, > > error: > put_device(dev); > - if (cdev) > - cdev_del(&driver->cdevs[index]); > + if (cdev) { > + cdev_del(driver->cdevs[index]); > + driver->cdevs[index] = NULL; > + } > return ERR_PTR(retval); > } > EXPORT_SYMBOL_GPL(tty_register_device_attr); > @@ -3297,8 +3302,10 @@ void tty_unregister_device(struct tty_driver *driver, > unsigned index) > { > device_destroy(tty_class, > MKDEV(driver->major, driver->minor_start) + index); > - if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) > - cdev_del(&driver->cdevs[index]); > + if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) { > + cdev_del(driver->cdevs[index]); > + driver->cdevs[index] = NULL; > + } > } > EXPORT_SYMBOL(tty_unregister_device); > > @@ -3363,6 +3370,7 @@ err_free_all: > kfree(driver->ports); > kfree(driver->ttys); > kfree(driver->termios); > + kfree(driver->cdevs); > kfree(driver); > return ERR_PTR(err); > } > @@ -3391,7 +3399,7 @@ static void destruct_tty_driver(struct kref *kref) > } > proc_tty_unregister_driver(driver); > if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) > - cdev_del(&driver->cdevs[0]); > + cdev_del(driver->cdevs[0]); > } > kfree(driver->cdevs); > kfree(driver->ports); > diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h > index 92e337c..1610524 100644 > --- a/include/linux/tty_driver.h > +++ b/include/linux/tty_driver.h > @@ -296,7 +296,7 @@ struct tty_operations { > struct tty_driver { > int magic; /* magic number for this structure */ > struct kref kref; /* Reference management */ > - struct cdev *cdevs; > + struct cdev **cdevs; > struct module *owner; > const char *driver_name; > const char *name; I don't understand what bug this patch is trying to solve, care to help describe it better? thanks, greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/