|
@@ -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:
|