Sdílet prostřednictvím


Zablokování interní fronty ovladače portu SCSI

Ovladač portu SCSI zablokuje svou interní frontu vždy, když dojde k chybovému stavu, který vyžaduje arbitráž od ovladače třídy. Ukotvení fronty umožňuje portu SCSI hlásit chybový stav ovladači třídy a dát ovladači třídy příležitost analyzovat chybu před obnovením zpracování požadavků, které zůstávají ve frontě. Pokud se například změní médium, může být potřeba zrušit žádost zařazenou do fronty, ale je vyžadována arbitráž ovladačem třídy. Pouze ovladač třídy má dostatek kontextových informací k určení, zda odebrání určitého typu média ovlivňuje konkrétní požadavek.

Pokud ovladač třídy úložiště použije logickou operaci OR na SrbFlags pro daný požadavek s příznakem SRB_FLAGS_NO_QUEUE_FREEZE, port SCSI nezamrazí svou frontu v důsledku problémů s tímto konkrétním požadavkem. V opačném případě port SCSI zablokuje svou frontu za některé z následujících podmínek:

  • Zařízení nevyhoví požadavku a vrátí stav SCSISTAT_CHECK_CONDITION nebo SCSISTAT_COMMAND_TERMINATED.

  • Časový limit požadavku vypršel.

  • V době, kdy zařízení spouští požadavek, dojde k resetování sběrnice.

  • Požadavek je ukončen příkazem sběrnicové zprávy, jako je například SCSIMESS_ABORT.

Port SCSI uvádí, že je jeho fronta zmrazena tím, že vrátí požadavek, který vyvolal zablokování, s příznakem SRB_STATUS_QUEUE_FROZEN nastaveným v SrbStatus členu SRB. Port SCSI vloží všechny nové požadavky z ovladače třídy do fronty, ale pokud je fronta zablokovaná, port SCSI nepředá žádné požadavky na zařízení než požadavky na automatické zjišťování a napájení.

Pokud je příznak SRB_FLAGS_BYPASS_FROZEN_QUEUE nastavený v SrbFlags v členovi požadavku, port SCSI obchází zmrazenou frontu a žádost okamžitě spustí. Všechny následné požadavky, ve kterých jsou SrbFlags spojeny operací OR s SRB_FLAGS_BYPASS_FROZEN_QUEUE, způsobí, že port SCSI vyprázdní frontu.

Ovladače vyšší úrovně mohou vynutit, aby port SCSI uvolnil svou frontu pomocí žádosti o uvolnění fronty SRB_FUNCTION_RELEASE_QUEUE. SRB_FUNCTION_FLUSH_QUEUE také odblokuje frontu po zrušení všech požadavků ve frontě.