Автоматический c обход вложенных точек монтирования ведет к противоречивому поведению - PullRequest
0 голосов
/ 25 января 2020

Я смотрю на определенный клиентский код NFSv3 и пытаюсь справиться с несоответствием, которое возникает из-за реализации «автоматического c обхода вложенных точек монтирования». Для объяснения:

Сервер NFS (он же server) может иметь вложенные точки монтирования, скажем:

directory D1 is exported as /a
directory D2 is exported as /a/b

каждый объект файловой системы упоминается через full-path, например, server:/a/b/c/d/file.o

всякий раз, когда logi c имеет дело с каким-либо объектом, он находит самый длинный экспорт, который является подмножеством full-path, вызывает MNT, чтобы получить этот дескриптор точки монтирования, а затем все как обычно (цепочка LOOKUP с пока мы не получим ручку нашего объекта). Т.е. мы прозрачно перемещаемся из одной точки монтирования в другую по мере необходимости.

Несоответствие возникает при попытке перечисления (с использованием READDIRPLUS) server:/a - на сервере может отсутствовать объект b в каталоге D1. Или это может и не имеет ничего общего с D2 - использование GETATTR на server:/a/b приведет к совершенно другим атрибутам. К сожалению, некоторые логики c ожидают совпадения результатов READDIRPLUS и GETATTR.

Один из способов справиться с этим - перехватить все вызовы, которые возвращают метаданные (LOOKUP, READDIR[PLUS], MKDIR, CREATE, et c), проверьте параметры (и результаты) по списку экспорта и замените (или добавьте отсутствующие) данные результатами GETATTR вызовов, выполненных с использованием связанного дескриптора MNT. Выполнимо, но сложно и дорого. Кроме того, он полагается, что список экспорта не равен ie (на самом деле, некоторые NFS-серверы могут возвращать пустой список экспорта).

Как правильно решить эту проблему?

Linux NFS клиент справляется с проблемой и как?

...