Кратко

  • В 9P2000 Twalk связывает свободный newfid с результатом лишь после успешного прохода всех элементов имени. Частичный Rwalk может вернуть qid разрешённого префикса, но не меняет ни один fid.
  • Topen — отдельный запрос: он задаёт режим доступа, запускает проверку разрешений и готовит fid к последующим чтению или записи. Ropen не доказывает, что передача данных состоялась.
  • Вклад Роба Пайка нужно описывать в коллективной истории: Кен Томпсон начал протокол, Пайк интегрировал систему имён, Дэйв Пресотто создал сетевую часть, а статьи и поздние диалекты имеют собственных соавторов.

На панели файлового шлюза загорается «путь найден», а следом появляется отказ в открытии. Если оба сообщения считать одним статусом доступности, журнал выглядит противоречиво. Для 9P это две нормальные проверки, между которыми могли измениться режим, права или объект.

Twalk отправляет действующий fid, новый newfid и упорядоченный список имён. Новый идентификатор должен быть свободен, если клиент намеренно не использует тот же номер, что у исходного fid. Сервер проходит элементы по одному и проверяет право поиска в каждом каталоге. Когда успешна вся последовательность, Rwalk возвращает qid каждого элемента, а newfid начинает представлять результат.

Это точное подтверждение: на данном сервере, в данном соединении, от указанного fid имена разрешились в таком порядке. Открытие в него не входит. Введение в 9P называет fid выбранным клиентом 32-битным идентификатором текущего файла, открытого или нет; пространство fid общее для соединения. Повторное согласование версии переинициализирует сеанс и прерывает незавершённый ввод-вывод. Значит, fid — локальная ссылка, а не вечный универсальный ключ.

Частичный ответ подчёркивает ограничение. Ошибка на первом элементе даёт Rerror. При более поздней ошибке Rwalk может перечислить qid успешного префикса. Однако 9P2000 не меняет исходный fid и newfid, пока не пройдены все элементы. Система, которая превращает «семь из девяти» в пригодный новый дескриптор, выдумывает состояние, которого сервер не создал.

Twalk с нулём элементов клонирует исходный fid в newfid, не проходя имя. MAXWELEM ограничивает одно сообщение шестнадцатью элементами, но не длину логического пути: клиент может продолжить следующим walk. Для реконструкции событий важно различать разрешение, клонирование и разбиение сообщения.

Topen отвечает на другой вопрос. Запрос просит открыть уже представленный fid файл для чтения, записи, обоих действий или исполнения, с предусмотренными 9P2000 флагами. Сервер проверяет доступ и подготавливает fid к вводу-выводу. Ropen возвращает qid и iounit. Только последующие Tread или Twrite с ответами способны подтвердить конкретную передачу.

Права имеют временную границу. Руководство по open указывает, что они проверяются при открытии, а последующее изменение прав не лишает доступа к уже открытому файлу. Разрешение поиска каталогов во время walk не гарантирует запрошенный режим open. Поэтому отказ после полного walk может быть логичен; и наоборот, открытый ранее fid способен работать после смены политики. Без порядка и времени событий слово «разрешено» вводит в заблуждение.

qid тоже имеет локальную область. Он однозначно обозначает файл внутри одной иерархии сервера, а его часть path должна меняться при удалении и повторном создании. Это надёжнее отображаемого имени, но не глобальный идентификатор между серверами и не хеш содержимого.

Локальность составляет замысел Plan 9. Статья The Use of Name Spaces in Plan 9 подписана Робом Пайком, Дэйвом Пресотто, Кеном Томпсоном, Говардом Трики и Филом Уинтерботтомом и описывает пространства имён для каждого процесса. Авторы Plan 9 from Bell Labs — Пайк, Пресотто, Шон Дорвард, Боб Фландрена, Томпсон, Трики и Уинтерботтом — подчёркивают, что композиция пространства хранится у клиента. Это не неудачный глобальный каталог, а сознательная свобода собирать локальную среду.

Такой же точности требует авторство. Предисловие ко второму изданию говорит: Томпсон начал протокол, Пайк интегрировал именование, Пресотто построил сеть; там же отмечены Уинтерботтом и множество других участников. Формула «протокол Пайка» стирает коллективную работу и неточно описывает его реальный вклад.

Версии нельзя смешивать на уровне полей. Предисловие к четвёртому изданию связывает новый 9P прежде всего с отказом от прежнего ограничения имени в 27 байт, а также с эффективностью, гибкостью и инкапсуляцией. Linux v9fs поддерживает 9p2000, 9p2000.u и 9p2000.L. UNIX-расширение и Linux-диалект документированы отдельно; 9P2000.L сохраняет форму walk, но использует Tlopen/Rlopen и Linux-флаги. Общей остаётся двухэтапная граница, а не точный формат open.

Режимы кэширования v9fs добавляют разрыв между наблюдением клиента и текущим состоянием сервера. Полная запись поэтому хранит диалект, сеанс, сервер/export, контекст attach, исходные fid/qid, имена, все qid, полный или частичный результат, newfid, режим и флаги open, qid/iounit из Ropen, дальнейший ввод-вывод, кэш и завершение сеанса.

Тогда «walk успешен» остаётся сильным выводом: имена разрешились там и тогда, где это утверждает протокол. Для его истинности ничего не требовалось открывать.

Sources