Message ID | 20100128123011.GA32001@lst.de |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
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
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
>>>>> "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
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
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)
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