* [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting
@ 2015-01-11 13:50 Akinobu Mita
[not found] ` <1420984206-22341-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Akinobu Mita @ 2015-01-11 13:50 UTC (permalink / raw)
To: linux-scsi-u79uwXL29TY76Z2rM5mHXA
Cc: Akinobu Mita, Vinayak Holikatti, Dolev Raviv, Sujit Reddy Thumma,
Subhash Jadavani, Christoph Hellwig, James E.J. Bottomley,
Matthew Dharm, Greg Kroah-Hartman, Alan Stern, David S. Miller,
Hannes Reinecke, linux-usb-u79uwXL29TY76Z2rM5mHXA,
usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf
While accessing a scsi_device, the use count of the underlying LLDD module
is incremented. The module reference is retrieved through .module field of
struct scsi_host_template.
This mapping between scsi_device and underlying LLDD module works well
except ufs, unusual usb storage drivers, and sub drivers for esp_scsi.
These drivers consist with core driver and actual LLDDs, and
scsi_host_template is defined in the core driver. So the actual LLDDs can
be unloaded even if the scsi_device is being accessed.
This patch series first adds ability to adjust module reference for
scsi host by LLDDs and then fixes actual LLDDs by adjusting module
reference after scsi host allocation.
* v3:
- Add fix for ESP SCSI drivers
* v2:
- Pass correct module reference to usb_stor_probe1() instead of touching
all ums-* drivers, suggested by Alan Stern
Akinobu Mita (4):
scsi: add ability to adjust module reference for scsi host
scsi: ufs: adjust module reference for scsi host
usb: storage: adjust module reference for scsi host
scsi: esp_scsi: adjust module reference for scsi host
drivers/scsi/am53c974.c | 3 +--
drivers/scsi/esp_scsi.c | 16 +++++++++++++---
drivers/scsi/esp_scsi.h | 11 +++++++----
drivers/scsi/hosts.c | 1 +
drivers/scsi/jazz_esp.c | 3 +--
drivers/scsi/mac_esp.c | 3 +--
drivers/scsi/scsi.c | 4 ++--
drivers/scsi/sun3x_esp.c | 3 +--
drivers/scsi/sun_esp.c | 3 +--
drivers/scsi/ufs/ufshcd-pci.c | 1 +
drivers/scsi/ufs/ufshcd-pltfrm.c | 1 +
drivers/scsi/ufs/ufshcd.c | 1 -
drivers/usb/storage/usb.c | 8 +++++---
drivers/usb/storage/usb.h | 7 +++++--
include/scsi/scsi_host.h | 1 +
15 files changed, 41 insertions(+), 25 deletions(-)
Cc: Vinayak Holikatti <vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Dolev Raviv <draviv-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: Sujit Reddy Thumma <sthumma-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: Subhash Jadavani <subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
Cc: "James E.J. Bottomley" <JBottomley-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
Cc: Matthew Dharm <mdharm-usb-JGfshJpz5UybPZpvUQj5UqxOck334EZe@public.gmane.org>
Cc: Greg Kroah-Hartman <gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Cc: Alan Stern <stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org>
Cc: "David S. Miller" <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
Cc: Hannes Reinecke <hare-l3A5Bk7waGM@public.gmane.org>
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf@public.gmane.org
Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 1/4] scsi: add ability to adjust module reference for scsi host
[not found] ` <1420984206-22341-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-01-11 13:50 ` Akinobu Mita
[not found] ` <1420984206-22341-2-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 10+ messages in thread
From: Akinobu Mita @ 2015-01-11 13:50 UTC (permalink / raw)
To: linux-scsi-u79uwXL29TY76Z2rM5mHXA
Cc: Akinobu Mita, Vinayak Holikatti, Dolev Raviv, Sujit Reddy Thumma,
Subhash Jadavani, Christoph Hellwig, James E.J. Bottomley,
Matthew Dharm, Greg Kroah-Hartman, Alan Stern,
linux-usb-u79uwXL29TY76Z2rM5mHXA,
usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf
While accessing a scsi_device, the use count of the underlying LLDD module
is incremented. The module reference is retrieved through .module field of
struct scsi_host_template.
This mapping between scsi_device and underlying LLDD module works well
except ufs, unusual usb storage drivers, and sub drivers for esp_scsi.
These drivers consist with core driver and actual LLDDs, and
scsi_host_template is defined in the core driver. So the actual LLDDs can
be unloaded even if the scsi_device is being accessed.
This adds .module field in struct Scsi_Host and let the module reference
be retrieved though it instead of struct scsi_host_template. This allows
the actual LLDDs adjust module reference.
Signed-off-by: Akinobu Mita <akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Vinayak Holikatti <vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Dolev Raviv <draviv-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: Sujit Reddy Thumma <sthumma-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: Subhash Jadavani <subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
Cc: "James E.J. Bottomley" <JBottomley-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
Cc: Matthew Dharm <mdharm-usb-JGfshJpz5UybPZpvUQj5UqxOck334EZe@public.gmane.org>
Cc: Greg Kroah-Hartman <gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Cc: Alan Stern <stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org>
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf@public.gmane.org
Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
---
No change from v2
drivers/scsi/hosts.c | 1 +
drivers/scsi/scsi.c | 4 ++--
include/scsi/scsi_host.h | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 8bb173e..21f1442 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -411,6 +411,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
*/
shost->max_cmd_len = 12;
shost->hostt = sht;
+ shost->module = sht->module;
shost->this_id = sht->this_id;
shost->can_queue = sht->can_queue;
shost->sg_tablesize = sht->sg_tablesize;
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index e028854..5905b83 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -988,7 +988,7 @@ int scsi_device_get(struct scsi_device *sdev)
return -ENXIO;
/* We can fail this if we're doing SCSI operations
* from module exit (like cache flush) */
- try_module_get(sdev->host->hostt->module);
+ try_module_get(sdev->host->module);
return 0;
}
@@ -1005,7 +1005,7 @@ EXPORT_SYMBOL(scsi_device_get);
void scsi_device_put(struct scsi_device *sdev)
{
#ifdef CONFIG_MODULE_UNLOAD
- struct module *module = sdev->host->hostt->module;
+ struct module *module = sdev->host->module;
/* The module refcount will be zero if scsi_device_get()
* was called from a module removal routine */
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 019e668..5133f2f 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -617,6 +617,7 @@ struct Scsi_Host {
*/
unsigned short max_cmd_len;
+ struct module *module;
int this_id;
int can_queue;
short cmd_per_lun;
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 2/4] scsi: ufs: adjust module reference for scsi host
2015-01-11 13:50 [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Akinobu Mita
[not found] ` <1420984206-22341-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-01-11 13:50 ` Akinobu Mita
2015-01-11 13:50 ` [PATCH v3 3/4] usb: storage: " Akinobu Mita
` (2 subsequent siblings)
4 siblings, 0 replies; 10+ messages in thread
From: Akinobu Mita @ 2015-01-11 13:50 UTC (permalink / raw)
To: linux-scsi
Cc: Akinobu Mita, Vinayak Holikatti, Dolev Raviv, Sujit Reddy Thumma,
Subhash Jadavani, Christoph Hellwig, James E.J. Bottomley
While accessing a UFS device, the module reference count for core driver
(ufshcd) is incremented but not incremented for the actual glue driver
(ufshcd-pci or ufshcd-pltfrm). Because these drivers allocate scsi hosts
with scsi_host_template defined in ufshcd module. So these drivers always
can be unloaded.
This fixes it by adjusting module reference after scsi host allocation.
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: linux-scsi@vger.kernel.org
---
No change from v2
drivers/scsi/ufs/ufshcd-pci.c | 1 +
drivers/scsi/ufs/ufshcd-pltfrm.c | 1 +
drivers/scsi/ufs/ufshcd.c | 1 -
3 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c
index d15eaa4..9fe21b4 100644
--- a/drivers/scsi/ufs/ufshcd-pci.c
+++ b/drivers/scsi/ufs/ufshcd-pci.c
@@ -142,6 +142,7 @@ ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return err;
}
+ hba->host->module = THIS_MODULE;
INIT_LIST_HEAD(&hba->clk_list_head);
err = ufshcd_init(hba, mmio_base, pdev->irq);
diff --git a/drivers/scsi/ufs/ufshcd-pltfrm.c b/drivers/scsi/ufs/ufshcd-pltfrm.c
index 95b64e0..ea3ca99 100644
--- a/drivers/scsi/ufs/ufshcd-pltfrm.c
+++ b/drivers/scsi/ufs/ufshcd-pltfrm.c
@@ -322,6 +322,7 @@ static int ufshcd_pltfrm_probe(struct platform_device *pdev)
goto out;
}
+ hba->host->module = THIS_MODULE;
hba->vops = get_variant_ops(&pdev->dev);
err = ufshcd_parse_clock_info(hba);
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 2e26025..f0aff90 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -4202,7 +4202,6 @@ static void ufshcd_async_scan(void *data, async_cookie_t cookie)
}
static struct scsi_host_template ufshcd_driver_template = {
- .module = THIS_MODULE,
.name = UFSHCD,
.proc_name = UFSHCD,
.queuecommand = ufshcd_queuecommand,
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 3/4] usb: storage: adjust module reference for scsi host
2015-01-11 13:50 [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Akinobu Mita
[not found] ` <1420984206-22341-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-01-11 13:50 ` [PATCH v3 2/4] scsi: ufs: " Akinobu Mita
@ 2015-01-11 13:50 ` Akinobu Mita
2015-01-11 13:50 ` [PATCH v3 4/4] scsi: esp_scsi: " Akinobu Mita
2015-01-12 9:36 ` [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Christoph Hellwig
4 siblings, 0 replies; 10+ messages in thread
From: Akinobu Mita @ 2015-01-11 13:50 UTC (permalink / raw)
To: linux-scsi
Cc: Akinobu Mita, Matthew Dharm, Greg Kroah-Hartman, Alan Stern,
Christoph Hellwig, James E.J. Bottomley, linux-usb, usb-storage
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 passing correct module reference to usb_stor_probe1() so
that .module field in struct Scsi_Host can be adjusted.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Cc: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Christoph Hellwig <hch@lst.de>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-usb@vger.kernel.org
Cc: usb-storage@lists.one-eyed-alien.net
Cc: linux-scsi@vger.kernel.org
---
No change from v2
drivers/usb/storage/usb.c | 8 +++++---
drivers/usb/storage/usb.h | 7 +++++--
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
index d468d02..3bb2558 100644
--- a/drivers/usb/storage/usb.c
+++ b/drivers/usb/storage/usb.c
@@ -911,10 +911,11 @@ static unsigned int usb_stor_sg_tablesize(struct usb_interface *intf)
}
/* First part of general USB mass-storage probing */
-int usb_stor_probe1(struct us_data **pus,
+int __usb_stor_probe1(struct us_data **pus,
struct usb_interface *intf,
const struct usb_device_id *id,
- struct us_unusual_dev *unusual_dev)
+ struct us_unusual_dev *unusual_dev,
+ struct module *owner)
{
struct Scsi_Host *host;
struct us_data *us;
@@ -937,6 +938,7 @@ int usb_stor_probe1(struct us_data **pus,
*/
host->max_cmd_len = 16;
host->sg_tablesize = usb_stor_sg_tablesize(intf);
+ host->module = owner;
*pus = us = host_to_us(host);
mutex_init(&(us->dev_mutex));
us_set_lock_class(&us->dev_mutex, intf);
@@ -969,7 +971,7 @@ BadDevice:
release_everything(us);
return result;
}
-EXPORT_SYMBOL_GPL(usb_stor_probe1);
+EXPORT_SYMBOL_GPL(__usb_stor_probe1);
/* Second part of general USB mass-storage probing */
int usb_stor_probe2(struct us_data *us)
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
index 307e339..0cb74ba 100644
--- a/drivers/usb/storage/usb.h
+++ b/drivers/usb/storage/usb.h
@@ -194,10 +194,13 @@ extern int usb_stor_reset_resume(struct usb_interface *iface);
extern int usb_stor_pre_reset(struct usb_interface *iface);
extern int usb_stor_post_reset(struct usb_interface *iface);
-extern int usb_stor_probe1(struct us_data **pus,
+extern int __usb_stor_probe1(struct us_data **pus,
struct usb_interface *intf,
const struct usb_device_id *id,
- struct us_unusual_dev *unusual_dev);
+ struct us_unusual_dev *unusual_dev,
+ struct module *owner);
+#define usb_stor_probe1(pus, intf, id, unusual_dev) \
+ __usb_stor_probe1(pus, intf, id, unusual_dev, THIS_MODULE)
extern int usb_stor_probe2(struct us_data *us);
extern void usb_stor_disconnect(struct usb_interface *intf);
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 4/4] scsi: esp_scsi: adjust module reference for scsi host
2015-01-11 13:50 [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Akinobu Mita
` (2 preceding siblings ...)
2015-01-11 13:50 ` [PATCH v3 3/4] usb: storage: " Akinobu Mita
@ 2015-01-11 13:50 ` Akinobu Mita
2015-01-11 17:55 ` David Miller
2015-01-12 9:18 ` Hannes Reinecke
2015-01-12 9:36 ` [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Christoph Hellwig
4 siblings, 2 replies; 10+ messages in thread
From: Akinobu Mita @ 2015-01-11 13:50 UTC (permalink / raw)
To: linux-scsi
Cc: Akinobu Mita, David S. Miller, Hannes Reinecke, Christoph Hellwig,
James E.J. Bottomley
While accessing a scsi device on host adapter supported by sub driver for
the ESP chip (mac_esp, am53c974, sun_esp, jazz_esp, sun3x_esp), the module
reference count is not incremented. Because these drivers allocate scsi
hosts with scsi_esp_template defined in ESP SCSI driver core module. So
these drivers always can be unloaded.
This fixes it by passing correct module reference to newly introduced
scsi_esp_host_alloc() so that .module field in struct Scsi_Host can be
adjusted.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Christoph Hellwig <hch@lst.de>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: linux-scsi@vger.kernel.org
---
New patch from v3
drivers/scsi/am53c974.c | 3 +--
drivers/scsi/esp_scsi.c | 16 +++++++++++++---
drivers/scsi/esp_scsi.h | 11 +++++++----
drivers/scsi/jazz_esp.c | 3 +--
drivers/scsi/mac_esp.c | 3 +--
drivers/scsi/sun3x_esp.c | 3 +--
drivers/scsi/sun_esp.c | 3 +--
7 files changed, 25 insertions(+), 17 deletions(-)
diff --git a/drivers/scsi/am53c974.c b/drivers/scsi/am53c974.c
index aa3e2c7..44a54f8 100644
--- a/drivers/scsi/am53c974.c
+++ b/drivers/scsi/am53c974.c
@@ -406,7 +406,6 @@ static void dc390_check_eeprom(struct esp *esp)
static int pci_esp_probe_one(struct pci_dev *pdev,
const struct pci_device_id *id)
{
- struct scsi_host_template *hostt = &scsi_esp_template;
int err = -ENODEV;
struct Scsi_Host *shost;
struct esp *esp;
@@ -423,7 +422,7 @@ static int pci_esp_probe_one(struct pci_dev *pdev,
goto fail_disable_device;
}
- shost = scsi_host_alloc(hostt, sizeof(struct esp));
+ shost = scsi_esp_host_alloc(sizeof(struct esp));
if (!shost) {
dev_printk(KERN_INFO, &pdev->dev,
"failed to allocate scsi host\n");
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c
index ce5bd52..79c2d00 100644
--- a/drivers/scsi/esp_scsi.c
+++ b/drivers/scsi/esp_scsi.c
@@ -2677,8 +2677,7 @@ static const char *esp_info(struct Scsi_Host *host)
return "esp";
}
-struct scsi_host_template scsi_esp_template = {
- .module = THIS_MODULE,
+static struct scsi_host_template scsi_esp_template = {
.name = "esp",
.info = esp_info,
.queuecommand = esp_queuecommand,
@@ -2698,7 +2697,18 @@ struct scsi_host_template scsi_esp_template = {
.skip_settle_delay = 1,
.use_blk_tags = 1,
};
-EXPORT_SYMBOL(scsi_esp_template);
+
+struct Scsi_Host *__scsi_esp_host_alloc(int privsize, struct module *owner)
+{
+ struct Scsi_Host *shost;
+
+ shost = scsi_host_alloc(&scsi_esp_template, privsize);
+ if (shost)
+ shost->module = owner;
+
+ return shost;
+}
+EXPORT_SYMBOL(__scsi_esp_host_alloc);
static void esp_get_signalling(struct Scsi_Host *host)
{
diff --git a/drivers/scsi/esp_scsi.h b/drivers/scsi/esp_scsi.h
index 84dcbe4..9309e08 100644
--- a/drivers/scsi/esp_scsi.h
+++ b/drivers/scsi/esp_scsi.h
@@ -544,9 +544,8 @@ struct esp {
/* A front-end driver for the ESP chip should do the following in
* it's device probe routine:
- * 1) Allocate the host and private area using scsi_host_alloc()
- * with size 'sizeof(struct esp)'. The first argument to
- * scsi_host_alloc() should be &scsi_esp_template.
+ * 1) Allocate the host and private area using scsi_esp_host_alloc()
+ * with size 'sizeof(struct esp)'.
* 2) Set host->max_id as appropriate.
* 3) Set esp->host to the scsi_host itself, and esp->dev
* to the device object pointer.
@@ -573,7 +572,11 @@ struct esp {
* 13) Check scsi_esp_register() return value, release all resources
* if an error was returned.
*/
-extern struct scsi_host_template scsi_esp_template;
+extern struct Scsi_Host *__scsi_esp_host_alloc(int privsize,
+ struct module *owner);
+#define scsi_esp_host_alloc(privsize) \
+ __scsi_esp_host_alloc(privsize, THIS_MODULE)
+
extern int scsi_esp_register(struct esp *, struct device *);
extern void scsi_esp_unregister(struct esp *);
diff --git a/drivers/scsi/jazz_esp.c b/drivers/scsi/jazz_esp.c
index 9aaa74e..9c268f7 100644
--- a/drivers/scsi/jazz_esp.c
+++ b/drivers/scsi/jazz_esp.c
@@ -131,13 +131,12 @@ static const struct esp_driver_ops jazz_esp_ops = {
static int esp_jazz_probe(struct platform_device *dev)
{
- struct scsi_host_template *tpnt = &scsi_esp_template;
struct Scsi_Host *host;
struct esp *esp;
struct resource *res;
int err;
- host = scsi_host_alloc(tpnt, sizeof(struct esp));
+ host = scsi_esp_host_alloc(sizeof(struct esp));
err = -ENOMEM;
if (!host)
diff --git a/drivers/scsi/mac_esp.c b/drivers/scsi/mac_esp.c
index 14c0334..ad4ad71 100644
--- a/drivers/scsi/mac_esp.c
+++ b/drivers/scsi/mac_esp.c
@@ -483,7 +483,6 @@ static struct esp_driver_ops mac_esp_ops = {
static int esp_mac_probe(struct platform_device *dev)
{
- struct scsi_host_template *tpnt = &scsi_esp_template;
struct Scsi_Host *host;
struct esp *esp;
int err;
@@ -495,7 +494,7 @@ static int esp_mac_probe(struct platform_device *dev)
if (dev->id > 1)
return -ENODEV;
- host = scsi_host_alloc(tpnt, sizeof(struct esp));
+ host = scsi_esp_host_alloc(sizeof(struct esp));
err = -ENOMEM;
if (!host)
diff --git a/drivers/scsi/sun3x_esp.c b/drivers/scsi/sun3x_esp.c
index e26e81d..adb4368 100644
--- a/drivers/scsi/sun3x_esp.c
+++ b/drivers/scsi/sun3x_esp.c
@@ -196,13 +196,12 @@ static const struct esp_driver_ops sun3x_esp_ops = {
static int esp_sun3x_probe(struct platform_device *dev)
{
- struct scsi_host_template *tpnt = &scsi_esp_template;
struct Scsi_Host *host;
struct esp *esp;
struct resource *res;
int err = -ENOMEM;
- host = scsi_host_alloc(tpnt, sizeof(struct esp));
+ host = scsi_esp_host_alloc(sizeof(struct esp));
if (!host)
goto fail;
diff --git a/drivers/scsi/sun_esp.c b/drivers/scsi/sun_esp.c
index 7b6d4c2..1449bea 100644
--- a/drivers/scsi/sun_esp.c
+++ b/drivers/scsi/sun_esp.c
@@ -489,12 +489,11 @@ static const struct esp_driver_ops sbus_esp_ops = {
static int esp_sbus_probe_one(struct platform_device *op,
struct platform_device *espdma, int hme)
{
- struct scsi_host_template *tpnt = &scsi_esp_template;
struct Scsi_Host *host;
struct esp *esp;
int err;
- host = scsi_host_alloc(tpnt, sizeof(struct esp));
+ host = scsi_esp_host_alloc(sizeof(struct esp));
err = -ENOMEM;
if (!host)
--
1.9.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 4/4] scsi: esp_scsi: adjust module reference for scsi host
2015-01-11 13:50 ` [PATCH v3 4/4] scsi: esp_scsi: " Akinobu Mita
@ 2015-01-11 17:55 ` David Miller
2015-01-12 9:18 ` Hannes Reinecke
1 sibling, 0 replies; 10+ messages in thread
From: David Miller @ 2015-01-11 17:55 UTC (permalink / raw)
To: akinobu.mita; +Cc: linux-scsi, hare, hch, JBottomley
From: Akinobu Mita <akinobu.mita@gmail.com>
Date: Sun, 11 Jan 2015 22:50:06 +0900
> While accessing a scsi device on host adapter supported by sub driver for
> the ESP chip (mac_esp, am53c974, sun_esp, jazz_esp, sun3x_esp), the module
> reference count is not incremented. Because these drivers allocate scsi
> hosts with scsi_esp_template defined in ESP SCSI driver core module. So
> these drivers always can be unloaded.
>
> This fixes it by passing correct module reference to newly introduced
> scsi_esp_host_alloc() so that .module field in struct Scsi_Host can be
> adjusted.
>
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Looks fine to me, thanks for fixing this:
Acked-by: David S. Miller <davem@davemloft.net>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/4] scsi: add ability to adjust module reference for scsi host
[not found] ` <1420984206-22341-2-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-01-12 9:17 ` Hannes Reinecke
0 siblings, 0 replies; 10+ messages in thread
From: Hannes Reinecke @ 2015-01-12 9:17 UTC (permalink / raw)
To: Akinobu Mita, linux-scsi-u79uwXL29TY76Z2rM5mHXA
Cc: Vinayak Holikatti, Dolev Raviv, Sujit Reddy Thumma,
Subhash Jadavani, Christoph Hellwig, James E.J. Bottomley,
Matthew Dharm, Greg Kroah-Hartman, Alan Stern,
linux-usb-u79uwXL29TY76Z2rM5mHXA,
usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf
On 01/11/2015 02:50 PM, Akinobu Mita wrote:
> While accessing a scsi_device, the use count of the underlying LLDD module
> is incremented. The module reference is retrieved through .module field of
> struct scsi_host_template.
>
> This mapping between scsi_device and underlying LLDD module works well
> except ufs, unusual usb storage drivers, and sub drivers for esp_scsi.
> These drivers consist with core driver and actual LLDDs, and
> scsi_host_template is defined in the core driver. So the actual LLDDs can
> be unloaded even if the scsi_device is being accessed.
>
> This adds .module field in struct Scsi_Host and let the module reference
> be retrieved though it instead of struct scsi_host_template. This allows
> the actual LLDDs adjust module reference.
>
> Signed-off-by: Akinobu Mita <akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> Cc: Vinayak Holikatti <vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> Cc: Dolev Raviv <draviv-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
> Cc: Sujit Reddy Thumma <sthumma-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
> Cc: Subhash Jadavani <subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
> Cc: Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>
> Cc: "James E.J. Bottomley" <JBottomley-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
> Cc: Matthew Dharm <mdharm-usb-JGfshJpz5UybPZpvUQj5UqxOck334EZe@public.gmane.org>
> Cc: Greg Kroah-Hartman <gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
> Cc: Alan Stern <stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org>
> Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> Cc: usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf@public.gmane.org
> Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Reviewed-by: Hannes Reinecke <hare-l3A5Bk7waGM@public.gmane.org>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare-l3A5Bk7waGM@public.gmane.org +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 4/4] scsi: esp_scsi: adjust module reference for scsi host
2015-01-11 13:50 ` [PATCH v3 4/4] scsi: esp_scsi: " Akinobu Mita
2015-01-11 17:55 ` David Miller
@ 2015-01-12 9:18 ` Hannes Reinecke
1 sibling, 0 replies; 10+ messages in thread
From: Hannes Reinecke @ 2015-01-12 9:18 UTC (permalink / raw)
To: Akinobu Mita, linux-scsi
Cc: David S. Miller, Christoph Hellwig, James E.J. Bottomley
On 01/11/2015 02:50 PM, Akinobu Mita wrote:
> While accessing a scsi device on host adapter supported by sub driver for
> the ESP chip (mac_esp, am53c974, sun_esp, jazz_esp, sun3x_esp), the module
> reference count is not incremented. Because these drivers allocate scsi
> hosts with scsi_esp_template defined in ESP SCSI driver core module. So
> these drivers always can be unloaded.
>
> This fixes it by passing correct module reference to newly introduced
> scsi_esp_host_alloc() so that .module field in struct Scsi_Host can be
> adjusted.
>
> Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
> Cc: "David S. Miller" <davem@davemloft.net>
> Cc: Hannes Reinecke <hare@suse.de>
> Cc: Christoph Hellwig <hch@lst.de>
> Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
> Cc: linux-scsi@vger.kernel.org
> ---
> New patch from v3
>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Cheers,
Hannes
--
Dr. Hannes Reinecke zSeries & Storage
hare@suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting
2015-01-11 13:50 [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Akinobu Mita
` (3 preceding siblings ...)
2015-01-11 13:50 ` [PATCH v3 4/4] scsi: esp_scsi: " Akinobu Mita
@ 2015-01-12 9:36 ` Christoph Hellwig
[not found] ` <20150112093610.GA25942-jcswGhMUV9g@public.gmane.org>
4 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2015-01-12 9:36 UTC (permalink / raw)
To: Akinobu Mita
Cc: linux-scsi, Vinayak Holikatti, Dolev Raviv, Sujit Reddy Thumma,
Subhash Jadavani, Christoph Hellwig, James E.J. Bottomley,
Matthew Dharm, Greg Kroah-Hartman, Alan Stern, David S. Miller,
Hannes Reinecke, linux-usb, usb-storage
On Sun, Jan 11, 2015 at 10:50:02PM +0900, Akinobu Mita wrote:
> While accessing a scsi_device, the use count of the underlying LLDD module
> is incremented. The module reference is retrieved through .module field of
> struct scsi_host_template.
>
> This mapping between scsi_device and underlying LLDD module works well
> except ufs, unusual usb storage drivers, and sub drivers for esp_scsi.
> These drivers consist with core driver and actual LLDDs, and
> scsi_host_template is defined in the core driver. So the actual LLDDs can
> be unloaded even if the scsi_device is being accessed.
>
> This patch series first adds ability to adjust module reference for
> scsi host by LLDDs and then fixes actual LLDDs by adjusting module
> reference after scsi host allocation.
Why don't we move the module into the Scsi_Host only, and use
the same macro that passes THIS_MODULE trick you are using in
the sub drivers? That seems to be a fairly common scheme in other
subsystems as well.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting
[not found] ` <20150112093610.GA25942-jcswGhMUV9g@public.gmane.org>
@ 2015-01-13 13:57 ` Akinobu Mita
0 siblings, 0 replies; 10+ messages in thread
From: Akinobu Mita @ 2015-01-13 13:57 UTC (permalink / raw)
To: Christoph Hellwig
Cc: linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Vinayak Holikatti, Dolev Raviv, Sujit Reddy Thumma,
Subhash Jadavani, James E.J. Bottomley, Matthew Dharm,
Greg Kroah-Hartman, Alan Stern, David S. Miller, Hannes Reinecke,
linux-usb-u79uwXL29TY76Z2rM5mHXA,
usb-storage-ijkIwGHArpdIPJnuZ7Njw4oP9KaGy4wf
2015-01-12 18:36 GMT+09:00 Christoph Hellwig <hch-jcswGhMUV9g@public.gmane.org>:
> On Sun, Jan 11, 2015 at 10:50:02PM +0900, Akinobu Mita wrote:
>> While accessing a scsi_device, the use count of the underlying LLDD module
>> is incremented. The module reference is retrieved through .module field of
>> struct scsi_host_template.
>>
>> This mapping between scsi_device and underlying LLDD module works well
>> except ufs, unusual usb storage drivers, and sub drivers for esp_scsi.
>> These drivers consist with core driver and actual LLDDs, and
>> scsi_host_template is defined in the core driver. So the actual LLDDs can
>> be unloaded even if the scsi_device is being accessed.
>>
>> This patch series first adds ability to adjust module reference for
>> scsi host by LLDDs and then fixes actual LLDDs by adjusting module
>> reference after scsi host allocation.
>
> Why don't we move the module into the Scsi_Host only, and use
> the same macro that passes THIS_MODULE trick you are using in
> the sub drivers? That seems to be a fairly common scheme in other
> subsystems as well.
Sure, we can take this approach. But ata drivers require more changes for
it because ata drivers don't call scsi_host_alloc() directly so we need to
pass THIS_MODULE to a variety of init functions() provided by libata.
While looking through ata drivers, I found that libahci_platform sub-drivers
and pata_of_platform driver also have module reference mismatch problem. So
ata drivers need to be touched anyway. I'll update this patch series with
the new approach.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-01-13 13:57 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-11 13:50 [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Akinobu Mita
[not found] ` <1420984206-22341-1-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-01-11 13:50 ` [PATCH v3 1/4] scsi: add ability to adjust module reference for scsi host Akinobu Mita
[not found] ` <1420984206-22341-2-git-send-email-akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-01-12 9:17 ` Hannes Reinecke
2015-01-11 13:50 ` [PATCH v3 2/4] scsi: ufs: " Akinobu Mita
2015-01-11 13:50 ` [PATCH v3 3/4] usb: storage: " Akinobu Mita
2015-01-11 13:50 ` [PATCH v3 4/4] scsi: esp_scsi: " Akinobu Mita
2015-01-11 17:55 ` David Miller
2015-01-12 9:18 ` Hannes Reinecke
2015-01-12 9:36 ` [PATCH v3 0/4] scsi: ufs & ums-* & esp_scsi: fix module reference counting Christoph Hellwig
[not found] ` <20150112093610.GA25942-jcswGhMUV9g@public.gmane.org>
2015-01-13 13:57 ` Akinobu Mita
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).