Re: qla2xxx: does not respond to SCSI_IOCTL_PROBE_HOST

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 24 Aug 2005, Drew Winstel wrote:

> Here's the situation.  I am running a QLogic QLA2200 (32-bit mode; lspci
> output follows), and when I issue an ioctl() to call
> SCSI_IOCTL_PROBE_HOST to /dev/sg0 (example code follows as well), the
> ioctl() returns 0, as if to imply that there is no host present, which
> is obviously not possible since the drive is attached to the HBA.  Using
> an Adaptec 29160 adapter with a drive connected produces logical,
> reasonable output, so I'm turning to the experts here.  Is this by
> design, a bug, or just something I've horribly missed?  I have tried it
> with a 2.6.11 and 2.6.12.5 kernel to no avail.

/proc support has been stripped from the qla2xxx driver.  So,
hostt->present is never incremented:

	void scsi_proc_hostdir_add(struct scsi_host_template *sht)
	{
		if (!sht->proc_info)
			return;

		down(&global_host_template_sem);
		if (!sht->present++) {
			...

SCSI_IOCTL_PROBE_HOST returns hostt->present:

	static int ioctl_probe(struct Scsi_Host *host, void __user *buffer)
	{
		unsigned int len, slen;
		const char *string;
		int temp = host->hostt->present;

		...
		return temp;

Not sure how we want to fix it, perhaps for backwards compatibility,
increment present regardless of the value of proc_info.

Something like this, perhaps (untested)?

---

diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c
--- a/drivers/scsi/scsi_proc.c
+++ b/drivers/scsi/scsi_proc.c
@@ -80,32 +80,44 @@ out:
 
 void scsi_proc_hostdir_add(struct scsi_host_template *sht)
 {
+	int create;
+
+	down(&global_host_template_sem);
+	create = !sht->present++;
+	up(&global_host_template_sem);
+
 	if (!sht->proc_info)
 		return;
 
-	down(&global_host_template_sem);
-	if (!sht->present++) {
+	if (create) {
+		down(&global_host_template_sem);
 		sht->proc_dir = proc_mkdir(sht->proc_name, proc_scsi);
         	if (!sht->proc_dir)
 			printk(KERN_ERR "%s: proc_mkdir failed for %s\n",
 			       __FUNCTION__, sht->proc_name);
 		else
 			sht->proc_dir->owner = sht->module;
+		up(&global_host_template_sem);
 	}
-	up(&global_host_template_sem);
 }
 
 void scsi_proc_hostdir_rm(struct scsi_host_template *sht)
 {
+	int destroy;
+
+	down(&global_host_template_sem);
+	destroy = !--sht->present;
+	up(&global_host_template_sem);
+
 	if (!sht->proc_info)
 		return;
 
-	down(&global_host_template_sem);
-	if (!--sht->present && sht->proc_dir) {
+	if (destroy && sht->proc_dir) {
+		down(&global_host_template_sem);
 		remove_proc_entry(sht->proc_name, proc_scsi);
 		sht->proc_dir = NULL;
+		up(&global_host_template_sem);
 	}
-	up(&global_host_template_sem);
 }
 
 void scsi_proc_host_add(struct Scsi_Host *shost)
-
: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux