Am Mittwoch, 31. Januar 2007 17:22 schrieb Alan Stern:
> On Wed, 31 Jan 2007, Oliver Neukum wrote:

> If some other device ends up needing this in the future, what makes you 
> think the heuristic you have chosen will be appropriate?

I've checked my disks and asked for counterexamples.
If you have a better heuristics, please tell me. It is derived
from the informal "rules" of pseudo CHS.
 
> > +   /* Some devices have version which report the correct sizes
> > +    * and others which do not. We guess size according toa heuristic
> > +    * and err on the side of lowering the capacity. */
> > +   if (sdp->guess_capacity)
> 
> The patch doesn't define sdp->guess_capacity anywhere.

This is the second time today. I need a notebook. Corrected version included.

> > +           if (sdkp->capacity % 63 || sdkp->capacity % 255)
> > +                   --sdkp->capacity;
> 
> This is a strange computation.  You avoid decrementing the capacity iff it
> is already divisible both by 63 and by 255.  Maybe you really want to use
> && rather than || ?  The idea being, I presume, that the last partition
> will extend only as far as a pseudo-cylinder boundary.

Yes, but I am conservative. When in doubt, decrement.
This patch is a result of despair, I am running out of solutions.

        Regards
                Oliver
----

--- a/drivers/usb/storage/unusual_devs.h        2007-01-31 14:48:08.000000000 
+0100
+++ b/drivers/usb/storage/unusual_devs.h        2007-01-31 15:37:40.000000000 
+0100
@@ -1323,7 +1323,7 @@
                "DataStor",
                "USB4500 FW1.04",
                US_SC_DEVICE, US_PR_DEVICE, NULL,
-               US_FL_FIX_CAPACITY),
+               US_FL_CAPACITY_HEURISTICS),
 
 /* Control/Bulk transport for all SubClass values */
 USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR),
--- a/drivers/usb/storage/scsiglue.c    2007-01-31 14:56:36.000000000 +0100
+++ b/drivers/usb/storage/scsiglue.c    2007-01-31 15:37:35.000000000 +0100
@@ -155,6 +155,12 @@
                if (us->flags & US_FL_FIX_CAPACITY)
                        sdev->fix_capacity = 1;
 
+               /* A few disks have two indistinguishable version, one of
+                * which reports the correct capacity and the other does not.
+                * The sd driver has to guess which is the case. */
+               if (us->flags & US_FL_CAPACITY_HEURISTICS)
+                       sdev->guess_capacity = 1;
+
                /* Some devices report a SCSI revision level above 2 but are
                 * unable to handle the REPORT LUNS command (for which
                 * support is mandatory at level 3).  Since we already have
--- a/drivers/scsi/sd.c 2007-01-31 15:33:57.000000000 +0100
+++ b/drivers/scsi/sd.c 2007-01-31 15:37:52.000000000 +0100
@@ -1274,6 +1274,13 @@
        if (sdp->fix_capacity)
                --sdkp->capacity;
 
+       /* Some devices have version which report the correct sizes
+        * and others which do not. We guess size according toa heuristic
+        * and err on the side of lowering the capacity. */
+       if (sdp->guess_capacity)
+               if (sdkp->capacity % 63 || sdkp->capacity % 255)
+                       --sdkp->capacity;
+
 got_data:
        if (sector_size == 0) {
                sector_size = 512;
--- a/include/linux/usb_usual.h 2007-01-31 14:49:55.000000000 +0100
+++ b/include/linux/usb_usual.h 2007-01-31 15:37:49.000000000 +0100
@@ -46,7 +46,9 @@
        US_FLAG(MAX_SECTORS_64, 0x00000400)                     \
                /* Sets max_sectors to 64    */                 \
        US_FLAG(IGNORE_DEVICE,  0x00000800)                     \
-               /* Don't claim device */
+               /* Don't claim device */                        \
+       US_FLAG(CAPACITY_HEURISTICS,    0x00001000)             \
+               /* sometimes sizes is too big */
 
 #define US_FLAG(name, value)   US_FL_##name = value ,
 enum { US_DO_ALL_FLAGS };
--- a/include/scsi/scsi_device.h        2007-01-31 15:17:30.000000000 +0100
+++ b/include/scsi/scsi_device.h        2007-01-31 15:37:55.000000000 +0100
@@ -122,6 +122,7 @@
        unsigned no_uld_attach:1; /* disable connecting to upper level drivers 
*/
        unsigned select_no_atn:1;
        unsigned fix_capacity:1;        /* READ_CAPACITY is too high by 1 */
+       unsigned guess_capacity:1;      /* READ_CAPACITY might be too high by 1 
*/
        unsigned retry_hwerror:1;       /* Retry HARDWARE_ERROR */
 
        unsigned int device_blocked;    /* Device returned QUEUE_FULL. */

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to