C.5. Запросы блокировки

Таблица C.5, «Флаги удерживания glock» содержит список флагов в поле «f:» строке «H:».

Таблица C.5. Флаги удерживания glock

ФлагИмяОписание
aAsyncНе ждать результата glock (будет запрошен позднее).
AAnyПринимает любой совместимый режим блокировки.
cNo cacheЕсли не заблокировано, сразу снизить режим блокировки DLM.
eNo expireИгнорирует последующие запросы снятия блокировки.
EExactТребуется конкретный режим блокировки.
FFirstПервый запрос, захвативший блокировку.
HHolderБлокировка установлена.
pPriorityСтавит запрос блокировки в начало очереди.
tTryПробная блокировка.
TTry 1CBПробная блокировка с ответом.
WWaitОжидание обработки запроса.
Особое внимание следует обратить на два флага: «W» отмечает ожидающий запрос, а «H» — активную блокировку. В начале списка идут запросы, удерживающие блокировку, за ними следуют ожидающие запросы.
Если удерживающих запросов нет, то первый запрос в списке инициирует изменение состояния glock. Но так как запросы снижения статуса glock имеют более высокий приоритет по сравнению с вызовами из файловой системы, это может повлиять на порядок обработки.
Пробная блокировка (флаг «t») проверяет состояние glock и пропускает его, если он занят. Флаг «T» (try 1CB) отличается лишь тем, что DLM отправит свой запрос удерживаемому glock. В частности, try 1CB используется вместе с iopen и помогает выбрать узел, который освободит inode. По умолчанию iopen удерживается в разделяемом режиме, но как только i_nlink достигнет нулевого значения, и будет вызван ->delete_inode(), будет установлен флаг «T» и запрошен монопольный режим. Если удалось установить монопольный режим, то inode будет освобожден. Если же блокировка удерживается другим узлом, для его glock будет установлен флаг ожидания «D», и он снова будет проверен при вызове ->drop_inode().
Как только i_nlink дескриптора уменьшится до нуля, в битовой карте групп ресурсов он будет отмечен как ожидающий освобождения, но все еще используемый. При следующем чтении битовой карты это будет обнаружено, после чего будет предпринята очередная попытка его освобождения. В результате дескриптор будет освобожден тем узлом, на котором будет сделан последний вызов close(), так как ничто не будет препятствовать завершению операции.