Re: Checking a USB drive's capacity

Robert Hancock
2008-12-23T04:51:57Z

Alan Stern wrote:
> Jens:
>
> As you may know, there are plenty of USB mass-storage devices that
> respond incorrectly to READ CAPACITY: They report the total number of
> blocks instead of the highest block number. As a result, the kernel
> thinks the drive has one more sector than it really does.
>
> So far we have dealt with this problem by means of a blacklist, but
> this gets more and more unsatisfactory all the time. We haven't been
> able to find any other way to cope, since a few devices are so badly
> behaved that they crash hard when you try to access the nonexistent
> "last" sector, requiring a replug or power cycle.
>
> My new idea is to keep in the blacklist only those devices which do
> crash -- a relatively small number. Everything else we should be able
> to detect safely at runtime, by testing if it's possible to read the
> last sector.
>
> The question is, how and where? The logical place for testing the
> capacity is near the end of sd_read_capacity(). However this code runs
> before any media accesses have occurred; the drive might not even be
> spun up yet. Not to mention that it seems strange to read the last
> sector before reading the first!

It seems to me that the safest solution would be to mark USB storage
devices as unsafe for last-sector partition table probing, like some
kind of CAPACITY_DUBIOUS flag, causing it to be skipped on these
devices, at least by default. After all, it would seem quite unusual to
see anything other than a DOS-style partition table on a USB storage
device (or else no partition table at all).