diff mbox

[v2] libata: fix ata_id_logical_per_physical_sectors

Message ID 20100128123011.GA32001@lst.de
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

Christoph Hellwig Jan. 28, 2010, 12:30 p.m. UTC
The value we get from the low byte of the ATA_ID_SECTOR_SIZE word is not not
a plain multiple, but the log of it, so fix the helper to give the correct
answer.  Without this we'll get an incorrect minimal I/O size in the block
limits VPD page for 4k sector drives.

Also change the return value of ata_id_logical_per_physical_sectors to u16
for the unlikely case of very large logical sectors.

Signed-off-by: Christoph Hellwig <hch@lst.de>

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Christoph Hellwig Feb. 3, 2010, 5:37 p.m. UTC | #1
Jeff, ping?  Without this patch the minimum I/O size for 4k drives will
be reported incorrectly, which will make paritions misaligned on modern
distros.

On Thu, Jan 28, 2010 at 01:30:11PM +0100, Christoph Hellwig wrote:
> The value we get from the low byte of the ATA_ID_SECTOR_SIZE word is not not
> a plain multiple, but the log of it, so fix the helper to give the correct
> answer.  Without this we'll get an incorrect minimal I/O size in the block
> limits VPD page for 4k sector drives.
> 
> Also change the return value of ata_id_logical_per_physical_sectors to u16
> for the unlikely case of very large logical sectors.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 
> Index: linux-2.6/include/linux/ata.h
> ===================================================================
> --- linux-2.6.orig/include/linux/ata.h	2010-01-28 12:24:02.061016474 +0100
> +++ linux-2.6/include/linux/ata.h	2010-01-28 13:26:59.270005271 +0100
> @@ -647,9 +647,9 @@ static inline int ata_id_has_large_logic
>  	return id[ATA_ID_SECTOR_SIZE] & (1 << 13);
>  }
>  
> -static inline u8 ata_id_logical_per_physical_sectors(const u16 *id)
> +static inline u16 ata_id_logical_per_physical_sectors(const u16 *id)
>  {
> -	return id[ATA_ID_SECTOR_SIZE] & 0xf;
> +	return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf);
>  }
>  
>  static inline int ata_id_has_lba48(const u16 *id)
---end quoted text---
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jeff Garzik Feb. 3, 2010, 5:42 p.m. UTC | #2
On 02/03/2010 12:37 PM, Christoph Hellwig wrote:
> Jeff, ping?  Without this patch the minimum I/O size for 4k drives will
> be reported incorrectly, which will make paritions misaligned on modern
> distros.

It's queued locally.  I'm waiting to push on the flush_dache_page() 
discussion for 2.6.33, but I'll make sure your patch gets pushed today 
one way or the other.

	Jeff


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Martin K. Petersen Feb. 3, 2010, 6:14 p.m. UTC | #3
>>>>> "Christoph" == Christoph Hellwig <hch@lst.de> writes:

Christoph> Without this patch the minimum I/O size for 4k drives will be
Christoph> reported incorrectly, which will make paritions misaligned on
Christoph> modern distros.

I'm in total agreement with the patch (feel free to add my Acked-by:).

However, the minimum I/O size should still be reported correctly.  We
don't allow min_io to be smaller than physical_block_size...

[root@10 ~]# grep . /sys/block/sdc/queue/{logical_block,physical_block,minimum_io}_size
/sys/block/sdc/queue/logical_block_size:512
/sys/block/sdc/queue/physical_block_size:4096
/sys/block/sdc/queue/minimum_io_size:4096
Christoph Hellwig Feb. 3, 2010, 6:17 p.m. UTC | #4
On Wed, Feb 03, 2010 at 01:14:23PM -0500, Martin K. Petersen wrote:
> >>>>> "Christoph" == Christoph Hellwig <hch@lst.de> writes:
> 
> Christoph> Without this patch the minimum I/O size for 4k drives will be
> Christoph> reported incorrectly, which will make paritions misaligned on
> Christoph> modern distros.
> 
> I'm in total agreement with the patch (feel free to add my Acked-by:).
> 
> However, the minimum I/O size should still be reported correctly.  We
> don't allow min_io to be smaller than physical_block_size...

Indeed, I only verified it using sg_inq, not the sysfs files.

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Index: linux-2.6/include/linux/ata.h
===================================================================
--- linux-2.6.orig/include/linux/ata.h	2010-01-28 12:24:02.061016474 +0100
+++ linux-2.6/include/linux/ata.h	2010-01-28 13:26:59.270005271 +0100
@@ -647,9 +647,9 @@  static inline int ata_id_has_large_logic
 	return id[ATA_ID_SECTOR_SIZE] & (1 << 13);
 }
 
-static inline u8 ata_id_logical_per_physical_sectors(const u16 *id)
+static inline u16 ata_id_logical_per_physical_sectors(const u16 *id)
 {
-	return id[ATA_ID_SECTOR_SIZE] & 0xf;
+	return 1 << (id[ATA_ID_SECTOR_SIZE] & 0xf);
 }
 
 static inline int ata_id_has_lba48(const u16 *id)