cvs commit: src/sys/cam/scsi scsi_da.c

Scott Long scottl at samsco.org
Fri Feb 2 15:18:16 UTC 2007


Nate Lawson wrote:
> Scott Long wrote:
>> mjacob at freebsd.org wrote:
>>>>
>>>> umass should probably just disable the SYNC_CACHE commands from CAM,
>>>> as well as whatever other commands are always quirked.  The firewire 
>>>> SIM
>>>> should probably do the same.
>>>>
>>>
>>> Err, probably should be XPORT based?
>>
>> Ah, very true.  Taking that a step further, there should probably be a 
>> broader concept of RBC and/or MMC as opposed to the assumption that 
>> everything is SBC.
>>
>> Scott
> 
> I have some experience with that (see the NO_6_BYTE sim option I added 
> for usb and firewire).  Of course, that was a hack and should be a XPORT 
> setting as you point out.
> 
> However, I don't think the umass situation is the same.  That's why I 
> haven't acted on it yet.  The issue is that SYNC_CACHE is a perfectly 
> valid RBC command.  Some devices support it and it works (50% of flash 
> drives my guess), some reject it but continue processing commands (25% 
> maybe), and some hang after receiving it (10-25%).  Obviously, the type 
> of device determines whether it's more likely to support this or not 
> (usb hard drive, almost certainly; mp3 player, probably not).
> 
> For the devices that hang, I have a strong suspicion that their firmware 
> state machine looks like this:
>     case SYNC_CACHE:
>          OptionallyWriteData();
>          while (1);  // wait for detach
> 
> Florent Thoumie (flz@) started some work based on some evidence that 
> Linux checks a "write cache present" bit in the INQUIRY data and decides 
> whether or not to run SYNC_CACHE based on that.  It's unknown yet how 
> closely this bit correlates with the hanging behavior though.
> 
> I think Windows actually never runs SYNC_CACHE unless you select "detach 
> device".  So if we added the capability for a device_eject() newbus 
> method and the default implementation ran device_shutdown(), then 
> scsi_da(4) could run SYNC_CACHE only from its shutdown method and thus 
> it wouldn't matter if the device hung from it.  Right now, we run 
> SYNC_CACHE from daclose() and so umounting the drive is enough to cause 
> a hang, and the hangs on boot are from GEOM tasting the drive 
> (daopen/daclose).  With this change, a device could be plugged in and 
> mounted/umounted multiple times.  Only when the user said "about to 
> eject" would it run SYNC_CACHE.  The only limitation is that after 
> running "eject", the device would have to be unplugged and replugged 
> before it could be mounted again.  But that's expected behavior.
> 
> Combine this with the write cache bit detection and you have a robust 
> solution.  Comments?
> 

What you describe is exactly my intention.  I didn't mean to imply that
a new XPORT becomes the dumping ground for the quirk table.

Btw, for the record, your assumption about SYNC_CACHE also applies to
RAID controllers, which is why Pawel's BIO_FLUSH hack is so dangerous
and wrong.

Scott



More information about the freebsd-scsi mailing list