From patchwork Tue Sep 3 22:38:15 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 272432 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id EA9F62C00B3 for ; Wed, 4 Sep 2013 08:38:20 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761282Ab3ICWiT (ORCPT ); Tue, 3 Sep 2013 18:38:19 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:54115 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1761165Ab3ICWiT (ORCPT ); Tue, 3 Sep 2013 18:38:19 -0400 Received: by mail-pb0-f46.google.com with SMTP id rq2so6636546pbb.33 for ; Tue, 03 Sep 2013 15:38:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-type:content-transfer-encoding; bh=dJrWGfBGdoF9lSWpfOi6wxuviJl7nBytizZd7xi+6eM=; b=DO/no1e6rq6OuhMMNDatq4U9D4cBppmFAa1EbOY9mkD/9qBhK80ynjqezEI7wPQ7Dw wUmvXpvR3SKIcyd9H8AdvZoLUeGo+f9/CyGKS9eFfcmrct0D/Hhsll9SKfIY5hUvIdhm jQGIxMIuqj0WHjP8cFKpYDPKU9jglfak1l3o2ha86Mc04Oc2z+uAbGXkl6XpNhl49Bqk gDXhl1YYhiVkl5eSiqdXsJEfPyGbdUaEDqOG9sRg0hZMSfWqlWmqCl/9EjBl65TCPQq+ wcskkcqOWr68IRG19y7EYxs74gc3Syq+nafCy8cbcxXSeyY8U+K+VnWnHdiR8GgZPJUo Ki4Q== X-Gm-Message-State: ALoCoQlQWVEEdsnRGABeGGWPXiOeEPvuQJbGzwAOWQFZN7Ajx2T1OXHRgwMYWRovO/Q+3sVj/awQ X-Received: by 10.68.178.197 with SMTP id da5mr21662542pbc.28.1378247898557; Tue, 03 Sep 2013 15:38:18 -0700 (PDT) Received: from nehalam.linuxnetplumber.net (static-50-53-69-237.bvtn.or.frontiernet.net. [50.53.69.237]) by mx.google.com with ESMTPSA id uw6sm24818279pbc.8.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 03 Sep 2013 15:38:18 -0700 (PDT) Date: Tue, 3 Sep 2013 15:38:15 -0700 From: Stephen Hemminger To: Greg KH Cc: linux-pci@vger.kernel.org Subject: [RFC] pci: crash on pci_unregister_driver after pci_register_driver fails Message-ID: <20130903153815.13638272@nehalam.linuxnetplumber.net> X-Mailer: Claws Mail 3.8.1 (GTK+ 2.24.10; x86_64-pc-linux-gnu) Mime-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org While debugging another problem with a PCI driver, I noticed that if device probe routine returns an error, the kernel will crash when module is unloaded. It looks like pci_register_driver() sets drv->bus to be PCI then in the module unload. module_unload my_device_exit_module pci_unregister_driver bus_remove_driver OOPS One way to fix this would be to have pci_register_driver clear the bus flag (it has no reference) if an error was detected. --- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- a/drivers/pci/pci-driver.c 2013-07-08 10:54:52.968241742 -0700 +++ b/drivers/pci/pci-driver.c 2013-09-03 15:34:10.112477893 -0700 @@ -1120,6 +1120,8 @@ const struct dev_pm_ops pci_dev_pm_ops = int __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name) { + int err; + /* initialize common driver fields */ drv->driver.name = drv->name; drv->driver.bus = &pci_bus_type; @@ -1130,7 +1132,11 @@ int __pci_register_driver(struct pci_dri INIT_LIST_HEAD(&drv->dynids.list); /* register with core */ - return driver_register(&drv->driver); + err = driver_register(&drv->driver); + if (err) + drv->driver.bus = NULL; + + return err; } /**