[Devel] unlock range
Pavel Shilovsky
piastryyy на gmail.com
Пн Сен 26 11:48:19 MSD 2011
26 сентября 2011 г. 10:34 пользователь Alexander Morozov
<amorozov на etersoft.ru> написал:
>> И ещё вопрос: а если у нас стоят непересекающиеся блокировки [0,5] и
>> [11,15], то запрос на разблокирования вида [0,15] упадёт с ошибкой?
>
> Да, Wine вернёт ошибку. Перед снятием блокировки проверяется, что в точности
> такая блокировка была поставлена.
>
Спасибо за информацию!
Получается, если CIFS работает согласно mandatory семантике (в том
числе сам выполняет поиск полностью совпадающей блокировки при
операции разблокирования), то WINE следует просто отсылать в CIFS
запрос на разблокирование в первозданном виде без поиска
непересекающихся областей. Что касается запросов на установку
блокировок, то в коде WINE ничего менять не требуется.
Насколько я понимаю, режим поиска непересекающихся областей при
разблокировании присутствует и в wineserver. Соответственно, что
происходит сейчас:
Сценарий 1
1. стоят две блокировки [0,10] и [5,15].
2. приложение отсылает запрос снять [0,10].
3. wineserver находит две блокировки из пункта (1), вычисляет область
для разблокирования и отдаёт файловой системе (cifs) запрос вида
[0,4].
4. cifs смотрит свой список блокировок для файлового дескриптора и не
находит блокировки которая бы полностью входила в данную область.
Ошибок не возвращает.
5. Соответсвенно wineserver думает, что всё ок и возвращает приложение
STATUS_OK.
6. Итог: блокировка на сервере остаётся.
Сценарий 2
1. стоят две блокировки [0,10] и [0,10].
2. приложение отсылается запрос снять [0,10].
3. wineserver находит две блокировки из пункта (1), и ничего не
отсылает файловой системе (cifs).
4. Соответсвенно wineserver думает, что всё ок и возвращает приложение
STATUS_OK.
5. Итог: на сервере две блокировки, вместо одной.
В итоге, мы имеем, что текущая рабочая связка WINE ( блокировки через
wineserver ) + CIFS не работает в случае пересекающихся блокировок на
чтение.
Так же заметил, что в коде wineserver и ntdll не обрабатываются ошибки
вызова разблокирования к файловой системе. Это может служить проблемой
в поиске ошибок работы приложений.
Я считаю, надо сделать следующее - добавить в WINE для wineserver и
ntdll код обрабатывающий разблокирование в CIFS, и сделать две связки
для тестирования с новым кодом CIFS (с семантикой mandatory для
разблокирования):
1. WINE ( блокировки CIFS через wineserver ) + CIFS ( без режима
кэширования блокировок )
2. WINE ( блокировки CIFS через ntdll ) + CIFS ( c режимом кэширования
блокировок )
Необходимый код CIFS сейчас имеется под ядро v3.0. Но если появится
необходимость, возможно портирование патчей и под более старые ядра
(что лишь для тестирования нежелательно).
--
Best regards,
Pavel Shilovsky.
Подробная информация о списке рассылки Devel