[sane-devel] 'scanimage -L' fails first time with modular SCSI drivers

Henning Meier-Geinitz henning at meier-geinitz.de
Fri Mar 1 13:34:11 GMT 2002


Hi,

On Mon, Feb 25, 2002 at 10:39:51PM +0000, Tim Waugh wrote:
> On Mon, Feb 25, 2002 at 11:24:44PM +0100, Oliver Rauch wrote:
> 
> > BTW: What happens when the user does not have the correct permissions
> > for /dev/sg0 (or the device that is used to load modules)?
> 
> Oh, good point: really it ought to try /dev/sg0, /dev/sg1, etc until
> it finds one that works.

The problem is: can you detect if it works? Yes, you can check if the
open was successful. But does this mean, that the correct SCSi driver
was loaded? E.g. /dev/sg0 is a SCSI cdrom at controller A, /dev/sg1 is
(would be) a scanner at controller A. The driver is manually loaded, B
is loaded automatically by scsi_hostadapter. An open to /dev/sg0 will
load the sg module and return without error. But would driver B be
also loaded? I can't test here...

I append another patch which just opens all the sg etc. devices. I'm
using a maximum of 16 devices and the list from sanei_scsi.c:

lx_dnl[] = {
      {"/dev/sg",  0},
      {"/dev/sg",  'a'},
      {"/dev/uk",  0},
      {"/dev/gsc", 0} };
      
I don't think that dev/uk* and dev/gsc* are needed but I haven't
touched this struct yet. uk is not mentioned in the Linux kernel
devices.txt at all and gscd is a device file for a special CDROM.

Here are some times for "time scanimage -L", sane-backends CVS default
installation:

Without SCSI scanner connected, no /dev/scanner link:

without patch:       with patch:
real  0m0.100s       real  0m1.058s
user  0m0.040s       user  0m0.400s
sys   0m0.020s       sys   0m0.260s

Without SCSI scanner connected, with /dev/scanner link:
real  0m0.371s       real  0m1.286s
user  0m0.150s       user  0m0.550s
sys   0m0.130s       sys   0m0.300s

With SCSI scanner connected (aic7xxx module loaded), no /dev/scanner link:
real 0m0.133s     real 0m0.148s
user 0m0.030s     user 0m0.030s
sys  0m0.030s     sys  0m0.030s

With SCSI scanner connected (aic7xxx module loaded), with /dev/scanner link:
real 0m0.273s     real 0m0.277s
user 0m0.040s     user 0m0.040s
sys  0m0.030s     sys  0m0.040s

So at least without a SCSI scanner the detection code is much slower.
Maybe we can get this lower with omitting uk and gsc devices but I
haven't tested yet. Maybe the number of devices (16 currently) can be
reduced, too. The theoretical maximum with major/minor numbers is 256.

Patch:
Index: sanei/sanei_scsi.c
===================================================================
RCS file: /cvsroot/external/sane/sane-backends/sanei/sanei_scsi.c,v
retrieving revision 1.31
diff -u -u -r1.31 sanei_scsi.c
--- sanei_scsi.c	2002/02/09 16:37:21	1.31
+++ sanei_scsi.c	2002/03/01 13:18:51
@@ -2424,6 +2424,34 @@
   return 0;
 }
 
+void
+lx_preload_drivers ()
+{
+  int device_number, i;
+  int fd;
+  char name[1024];
+#define LX_MAX_DEVICE_NUMBER 15
+  
+  
+  for (i = 0; i < NELEMS(lx_dnl); i++)
+    {
+      for (device_number = 0; device_number <= LX_MAX_DEVICE_NUMBER; 
+	   device_number++)
+	{
+	  if (lx_dnl[i].base)
+	    snprintf (name, sizeof(name), "%s%c", lx_dnl[i].prefix,
+		    lx_dnl[i].base + device_number);
+	  else
+	    snprintf (name, sizeof(name), "%s%d", lx_dnl[i].prefix,
+		      device_number);
+	  fd = open (name, O_RDONLY | O_NONBLOCK);
+	  if (fd >= 0)
+	    close (fd);
+	}
+    }
+  return;
+}
+
 void  /* calls 'attach' function pointer with sg device file name iff match */
 sanei_scsi_find_devices (const char *findvendor, const char *findmodel,
 			 const char *findtype,
@@ -2484,6 +2512,8 @@
   param[7].u.i = &lun;
 
   DBG_INIT ();
+
+  lx_preload_drivers();
 
   proc_fp = fopen (PROCFILE, "r");
   if (!proc_fp)





More information about the sane-devel mailing list