2.6.x libata fix
PATCH 1/1 2.6.x libata fix
Please pull from the 'upstream' branch of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
to obtain the fix (and cleanup) described in the attachment.
drivers/scsi/libata-scsi.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-)
Philip Pokorny:
libata fix read capacity handling for more than 2TB
drivers/scsi/libata-scsi.c +11 -5
@@ -1176,8 +1176,12 @@ unsigned int ata_scsiop_read_cap(struct 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 );
@@ -1191,10 +1195,12 @@ unsigned int ata_scsiop_read_cap(struct }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 );