usb: storage: fix module reference for scsi host
While accessing a unusual usb storage (ums-alauda, ums-cypress, ...), the module reference count is not incremented. Because these drivers allocate scsi hosts with usb_stor_host_template defined in usb-storage module. So these drivers always can be unloaded. This fixes it by preparing scsi host template which is initialized at module_init() for each ums-* driver. In order to minimize the difference in ums-* drivers, introduce module_usb_stor_driver() helper macro which is same as module_usb_driver() except that it also initializes scsi host template. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: Vinayak Holikatti <vinholikatti@gmail.com> Cc: Dolev Raviv <draviv@codeaurora.org> Cc: Sujit Reddy Thumma <sthumma@codeaurora.org> Cc: Subhash Jadavani <subhashj@codeaurora.org> Cc: Christoph Hellwig <hch@lst.de> Cc: "James E.J. Bottomley" <JBottomley@parallels.com> Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Hannes Reinecke <hare@suse.de> Cc: linux-usb@vger.kernel.org Cc: usb-storage@lists.one-eyed-alien.net Cc: linux-scsi@vger.kernel.org Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
1cb39e2564
commit
aa519be34f
@@ -59,6 +59,9 @@
|
||||
#include "transport.h"
|
||||
#include "protocol.h"
|
||||
#include "debug.h"
|
||||
#include "scsiglue.h"
|
||||
|
||||
#define DRV_NAME "ums-datafab"
|
||||
|
||||
MODULE_DESCRIPTION("Driver for Datafab USB Compact Flash reader");
|
||||
MODULE_AUTHOR("Jimmie Mayfield <mayfield+datafab@sackheads.org>");
|
||||
@@ -721,6 +724,8 @@ static int datafab_transport(struct scsi_cmnd *srb, struct us_data *us)
|
||||
return USB_STOR_TRANSPORT_FAILED;
|
||||
}
|
||||
|
||||
static struct scsi_host_template datafab_host_template;
|
||||
|
||||
static int datafab_probe(struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
@@ -728,7 +733,8 @@ static int datafab_probe(struct usb_interface *intf,
|
||||
int result;
|
||||
|
||||
result = usb_stor_probe1(&us, intf, id,
|
||||
(id - datafab_usb_ids) + datafab_unusual_dev_list);
|
||||
(id - datafab_usb_ids) + datafab_unusual_dev_list,
|
||||
&datafab_host_template);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
@@ -742,7 +748,7 @@ static int datafab_probe(struct usb_interface *intf,
|
||||
}
|
||||
|
||||
static struct usb_driver datafab_driver = {
|
||||
.name = "ums-datafab",
|
||||
.name = DRV_NAME,
|
||||
.probe = datafab_probe,
|
||||
.disconnect = usb_stor_disconnect,
|
||||
.suspend = usb_stor_suspend,
|
||||
@@ -755,4 +761,4 @@ static struct usb_driver datafab_driver = {
|
||||
.no_dynamic_id = 1,
|
||||
};
|
||||
|
||||
module_usb_driver(datafab_driver);
|
||||
module_usb_stor_driver(datafab_driver, datafab_host_template, DRV_NAME);
|
||||
|
Reference in New Issue
Block a user