Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
C.5. Запросы блокировки
Таблица C.5, «Флаги удерживания glock» содержит список флагов в поле «f:» строке «H:».
Таблица C.5. Флаги удерживания glock
Флаг | Имя | Описание |
---|---|---|
a | Async | Не ждать результата glock (будет запрошен позднее). |
A | Any | Принимает любой совместимый режим блокировки. |
c | No cache | Если не заблокировано, сразу снизить режим блокировки DLM. |
e | No expire | Игнорирует последующие запросы снятия блокировки. |
E | Exact | Требуется конкретный режим блокировки. |
F | First | Первый запрос, захвативший блокировку. |
H | Holder | Блокировка установлена. |
p | Priority | Ставит запрос блокировки в начало очереди. |
t | Try | Пробная блокировка. |
T | Try 1CB | Пробная блокировка с ответом. |
W | Wait | Ожидание обработки запроса. |
Особое внимание следует обратить на два флага: «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
(), так как ничто не будет препятствовать завершению операции.