[SCSI] sd: tell the user when a disk's capacity is adjusted
authorAlan Stern <stern@rowland.harvard.edu>
Wed, 18 Feb 2009 15:54:44 +0000 (10:54 -0500)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Thu, 12 Mar 2009 17:58:15 +0000 (12:58 -0500)
This patch (as1188) combines the tests for decrementing a drive's
reported capacity and expands the comment.  It also adds an
informational message to the system log, informing the user when the
reported value has been changed.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/sd.c

index 4970ae4..e744ee4 100644 (file)
@@ -1383,18 +1383,22 @@ repeat:
                sd_read_protection_type(sdkp, buffer);
        }       
 
-       /* Some devices return the total number of sectors, not the
-        * highest sector number.  Make the necessary adjustment. */
-       if (sdp->fix_capacity) {
+       /* Some devices are known to return the total number of blocks,
+        * not the highest block number.  Some devices have versions
+        * which do this and others which do not.  Some devices we might
+        * suspect of doing this but we don't know for certain.
+        *
+        * If we know the reported capacity is wrong, decrement it.  If
+        * we can only guess, then assume the number of blocks is even
+        * (usually true but not always) and err on the side of lowering
+        * the capacity.
+        */
+       if (sdp->fix_capacity ||
+           (sdp->guess_capacity && (sdkp->capacity & 0x01))) {
+               sd_printk(KERN_INFO, sdkp, "Adjusting the sector count "
+                               "from its reported value: %llu\n",
+                               (unsigned long long) sdkp->capacity);
                --sdkp->capacity;
-
-       /* Some devices have version which report the correct sizes
-        * and others which do not. We guess size according to a heuristic
-        * and err on the side of lowering the capacity. */
-       } else {
-               if (sdp->guess_capacity)
-                       if (sdkp->capacity & 0x01) /* odd sizes are odd */
-                               --sdkp->capacity;
        }
 
 got_data: