Преобразование SCSI в NVME

Мы разрабатываем приложение для управления NVME устройствами в Windows 10. Мы не должны использовать собственный драйвер для связи с дисками, поэтому для отправки большинства команд нам приходится полагаться на то, что доступно в Windows 10.

Для таких команд, как Security Receive и Security Send, мы используем их поддержку преобразования SCSI-NVME, при котором команда SCSI отправляется с хоста и преобразуется стеком ядра SCSI в команду NVME, а затем отправляется на диск.

Мы видим, что команды достигают диска, но трансляция не может отправить правильный идентификатор пространства имен на диск в случае команды Security Receive, и поэтому SCSI возвращает ошибку в смысле данных как Access denied, Invalid LU Identifier.

Преобразование SCSI-NVME не позволяет установить поле идентификатора пространства имен в своей CDB. Есть ли другой способ установить этот идентификатор пространства имен в команде SCSI, которую мы отправляем со стороны хоста? Или это ошибка драйвера, который отправляет неверные данные на диск?

Другие API Microsoft (например, Storage Query Property) сами устанавливают этот идентификатор пространства имен, и нам не нужно устанавливать его со стороны пользователя.

Если кто-нибудь, кто работал в подобной среде, может помочь нам, это будет очень полезно.


person Ravi    schedule 19.04.2016    source источник
comment
Просто чтобы перефразировать вопрос еще раз, я хочу знать, как идентификатор пространства имен устанавливается с помощью команды SCSI всякий раз, когда мы используем подход SCSI-NVME Translation для отправки команд на диск NVME. Спецификация перевода SCSI-NVME, которую я использую, не говорит о том, как устанавливается идентификатор пространства имен в CDB. Идентификатор пространства имен — важное поле в структуре команд NVME.   -  person Ravi    schedule 19.04.2016
comment
Улучшено форматирование и формулировка.   -  person CodeMouse92    schedule 20.04.2016
comment
Ok! Я позабочусь в следующий раз.   -  person Ravi    schedule 20.04.2016
comment
Я не уверен, почему за это проголосовали. По крайней мере, в нынешнем виде это кажется относительно ясным — хотя у меня нет для вас ответа!   -  person Mike Andrews    schedule 20.04.2016


Ответы (2)


Это интересный вопрос, я не совсем уверен, как драйвер Windows 10 работает внутри, но с точки зрения того, как спецификация предназначена для работы этого перевода, вам не нужно явно указывать NSID в пользовательском пространстве.

Во всех драйверах Windows NVMe, с которыми я работал, контроллер доступен через дескриптор адаптера, а пространства имен доступны через дескрипторы физического диска. Цель состоит в том, чтобы команды SCSI направлялись к дескрипторам физического диска, а собственные команды NVMe — к адаптеру. Если вы отправляете команду SCSI на дескриптор физического диска, предполагаемое пространство имен неявно, поскольку каждый из этих дескрипторов напрямую подключен к пространству имен и, следовательно, должен быть установлен в качестве драйвера во время преобразования. Именно так это работает в драйвере OFA (OpenFabrics Alliance) и во всех его производных.

Если вы отправляете команду SCSI на физический диск, а пространство имен не заполнено, это похоже на ошибку драйвера. Если вы отправляете команду SCSI адаптеру (и она не отклоняется ОС/драйвером), попробуйте отправить ее на физический диск, соответствующий желаемому идентификатору пространства имен.

person csm10495    schedule 29.08.2016

Я потерял это из виду, извините :(. Да, вы правы, что для отправки команд scsi они должны быть отправлены на дескрипторы физического диска. В Windows 10, даже для отправки команд, которые также предназначены для адаптера, например, Идентифицировать контроллер, мы используем один и тот же дескриптор (дескриптор физического диска), и есть отдельное поле, в котором упоминается, что это предназначено для адаптера.Возвращаясь к исходному вопросу, это была ошибка прошивки, связанная с управлением пространством имен.Драйверы Windows считывают много материала с дисков NVME когда система загружается, и они поддерживают это внутри себя и читают из этого источника всякий раз, когда отправляется конкретная команда. Ваше предположение о том, что дескрипторы физического диска строго привязаны к пространствам имен, верно из-за такого поведения драйверов Windows 10. Из-за ошибки прошивки, что было достигая диска, было пространство имен 0, которое является недопустимым идентификатором пространства имен и, следовательно, отклонено.С исправленной прошивкой эта проблема исчезла, и команда реагировала правильно!

Ваше здоровье!

person Ravi    schedule 25.10.2016