Re: [PATCH 5 of 8] sd: Detect non-rotational devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Apr 23 2009, Jeff Garzik wrote:
> Matthew Wilcox wrote:
>> On Thu, Apr 23, 2009 at 07:09:37AM -0400, Jeff Garzik wrote:
>>> Jens Axboe wrote:
>>>>> +	/* Block Device Characteristics VPD */
>>>>> +	buffer = scsi_get_vpd_page(sdkp->device, 0xb1);
>>>>> +
>>>>> +	if (buffer == NULL)
>>>>> +		return;
>>>>> +
>>>>> +	rot = get_unaligned_be16(&buffer[4]);
>>>> Make sure this works for libata as well, and then kill the rotational
>>>> check in there instead.
>>> Yep.  libata-scsi.c would need to simulate that VPD page.
>>
>> I already did that.  The only problem is that you made me include the stupid:
>>
>>         if (ata_id_major_version(args->id) > 7) {
>>
>> so of course it doesn't work on any existing hardware.  How about
>> applying this patch:
>>
>> ----
>>
>> libata: fill in b1 page for all drives, not just ATA-8
>>
>> Some of the drives on the market fill in the rotational speed and form
>> factor correctly, even though they claim support for an earlier version
>> of ATA.  The current ata_id_is_ssd() code doesn't check the version
>> number and doesn't appear to have caused any trouble.  Besides, SCSI devices
>> are also capable of returning garbage in these fields.
>>
>> Signed-off-by: Matthew Wilcox <willy@xxxxxxxxxxxxxxx>
>>
>> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
>> index 2733b0c..59358ca 100644
>> --- a/drivers/ata/libata-scsi.c
>> +++ b/drivers/ata/libata-scsi.c
>> @@ -2144,11 +2144,9 @@ static unsigned int ata_scsiop_inq_b1(struct ata_scsi_args *args, u8 *rbuf)
>>  {
>>  	rbuf[1] = 0xb1;
>>  	rbuf[3] = 0x3c;
>> -	if (ata_id_major_version(args->id) > 7) {
>> -		rbuf[4] = args->id[217] >> 8;
>> -		rbuf[5] = args->id[217];
>> -		rbuf[7] = args->id[168] & 0xf;
>> -	}
>> +	rbuf[4] = args->id[217] >> 8;
>> +	rbuf[5] = args->id[217];
>> +	rbuf[7] = args->id[168] & 0xf;
>
> Thus returning undefined garbage for the vast majority of ATA devices?  
> Might as well admit that a call to get_random_bytes() is a valid  
> implementation, at that point.
>
> Linux users deserve more than that :)
>
> If you want to find a better test than "version > 7", that is fine.
>
> Surely a few minutes of thinking and a few minutes of research will  
> yield a reasonable hueristic, that gives a reasonable estimation of  
> when/if these fields are valid?
>
> linux/ata.h is filled with examples of proper range checking -- ensuring  
> that a range of IDENTIFY DEVICE words are valid.  There are also typical  
> tests such as assuming values other than 0x0000 and 0xffff are valid.
>
>
>>> Also (to mkp or whoever does the work) -- note Linus's comment, and 
>>> my provisional patch[1], about libata potentially wanting to detect 
>>> NONROT by looking for "*SSD" from IDENTIFY DEVICE'S model string.
>>
>> Found it ... and Jens' suggestion that this be done in userspace instead.
>
> It is trivial to do in the kernel, where we already match against model  
> info for a long list of quirks.
>
> Therefore, I think the Just Works(tm) value to SSD owners is higher.  
> That way old userlands work with SSDs too.

But it's just as easy to do in udev, it's just a one-line udev rule.
Don't care much either way, though.

-- 
Jens Axboe

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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux