Re: SG_BIG_BUFF setting in Problems incorrect

From: abel deuring (a.deuring@satzbau-gmbh.de)
Date: Fri Feb 04 2000 - 16:39:11 PST

  • Next message: Oliver Rauch: "scsi buffer size handling for backends"

    abel deuring wrote:

    > That's my fault: In the recent version, sanei_scsi_open calls
    > sanei_scsi_open_extended, which allows variable buffer sizes for recent
    > kernels. For older kernels, a fixes buffer size of SCSIBUFFERSIZE (= 128
    > * 1024) is used. And that cannot work, because SG_BIG_BUFF is by default
    > set to 128 * 1024 - 512. I'll fix that this eveing. (Sorry, I can't do
    > that right now at work)
    >
    > And updating the man page is indeed a good idea...

    So, here is the bugfix. sanei_scsi.c should now work again with
    SG_BIG_BUFF = 128 * 1024 - 512. (If I remember right, that was the
    maximum value for older kernels.)

    I also added a paragraph to the sane-scsi man page: How to change buffer
    size for the recent versions of the SG driver.

    Both patches are also "committed" to teh CVS server.

    Abel

    --- sane-scsi.man.orig Mon Aug 9 20:05:41 1999
    +++ sane-scsi.man Sat Feb 5 00:50:04 2000
    @@ -148,6 +148,18 @@
     bytes. After changing this value, it is necessary to recompile both
     the kernel (or the SCSI generic module) and the SCSI backends.
     .PP
    +From version 2.0 on, the maximum buffer size of Linux SG driver can
    +be changed at program run time, and the restriction to 127 kB is also
    +removed. This driver version is part of the Linux kernels from version
    +2.2.7 on. If larger buffers are reasonable for your scanner, set the
    +environment variable
    +.B SANE_SG_BUFFERSIZE
    +to the desired buffer size in bytes. It is not recommended to use more
    +than 1 MB, because for large values the probablility increases that the
    +SG driver cannot allocate the necessary buffer(s). For ISA cards, even
    +1 MB might be a too large value. For a detailed discussion of memory
    +issues of the SG driver, see http::/www.torque.net/sg.
    +.PP
     A common issue with SCSI scanners is what to do when you booted
     the system while the scanner was turned off? In such a case, the
     scanner won't be recognized by the kernel and SANE won't be able


    --- sanei_scsi.c.orig Sun Jan 30 13:30:25 2000
    +++ sanei_scsi.c Sat Feb 5 00:24:41 2000
    @@ -1248,10 +1248,10 @@
     sanei_scsi_open (const char *dev, int *fdp,
                     SANEI_SCSI_Sense_Handler handler, void *handler_arg)
     {
    - int i = 0;
    + int i = 0, fd, len;
       int wanted_buffersize = SCSIBUFFERSIZE, real_buffersize;
       SANE_Status res;
    - char *cc, *cc1;
    + char *cc, *cc1, buf[32];
     
       cc = getenv("SANE_SG_BUFFERSIZE");
       if (cc)
    @@ -1261,6 +1261,40 @@
             wanted_buffersize = i;
         }
     
    + /* wanted_buffersize might be too big, if we have the old SG driver.
    + Therefore, check the driver version, and reduce wante_buffersize,
    + if necessary. Otherwise, sanei_scsi_open_extended will fail.
    + */
    + fd = open(dev, O_RDWR);
    + if (fd < 0)
    + {
    + res = SANE_STATUS_INVAL;
    + if (errno == EACCES)
    + res = SANE_STATUS_ACCESS_DENIED;
    + DBG(1, "sanei_scsi_open: open of `%s' failed: %s",
    + dev, strerror(errno));
    + return res;
    + }
    +
    + i = ioctl(fd, SG_GET_VERSION_NUM, &i);
    + close(fd);
    + if (i < 0)
    + {
    + /* we have the old driver */
    + fd = open("proc/sys/kernel/sg-big-buff", O_RDONLY);
    + if (fd > 0 && (len = read (fd, buf, sizeof (buf) - 1)) > 0)
    + {
    + buf[len] = '\0';
    + i = atoi (buf);
    + if (wanted_buffersize > i)
    + wanted_buffersize = i;
    + close(fd);
    + }
    + else
    + if (wanted_buffersize > SG_BIG_BUFF)
    + wanted_buffersize = SG_BIG_BUFF;
    + }
    +
       real_buffersize = wanted_buffersize;
       res = sanei_scsi_open_extended(dev, fdp, handler, handler_arg,
                                      &real_buffersize);

    --
    Source code, list archive, and docs: http://www.mostang.com/sane/
    To unsubscribe: echo unsubscribe sane-devel | mail majordomo@mostang.com
    



    This archive was generated by hypermail 2b29 : Fri Feb 04 2000 - 16:58:12 PST