OSDN Git Service

Merge /spare/repo/linux-2.6/
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / scsi / libata-scsi.c
index c1cf5e0..3ba1fef 100644 (file)
@@ -1482,8 +1482,12 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
                n_sectors = ata_id_u32(args->id, 60);
        n_sectors--;            /* ATA TotalUserSectors - 1 */
 
-       tmp = n_sectors;        /* note: truncates, if lba48 */
        if (args->cmd->cmnd[0] == READ_CAPACITY) {
+               if( n_sectors >= 0xffffffffULL )
+                       tmp = 0xffffffff ;  /* Return max count on overflow */
+               else
+                       tmp = n_sectors ;
+
                /* sector count, 32-bit */
                rbuf[0] = tmp >> (8 * 3);
                rbuf[1] = tmp >> (8 * 2);
@@ -1497,10 +1501,12 @@ unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
 
        } else {
                /* sector count, 64-bit */
-               rbuf[2] = n_sectors >> (8 * 7);
-               rbuf[3] = n_sectors >> (8 * 6);
-               rbuf[4] = n_sectors >> (8 * 5);
-               rbuf[5] = n_sectors >> (8 * 4);
+               tmp = n_sectors >> (8 * 4);
+               rbuf[2] = tmp >> (8 * 3);
+               rbuf[3] = tmp >> (8 * 2);
+               rbuf[4] = tmp >> (8 * 1);
+               rbuf[5] = tmp;
+               tmp = n_sectors;
                rbuf[6] = tmp >> (8 * 3);
                rbuf[7] = tmp >> (8 * 2);
                rbuf[8] = tmp >> (8 * 1);