Мне удалось найти решения только для файлов, а не для каталогов, например lsof
. ch flags
не имеет опции чтения, поэтому я не знаю, как это сделать.
Схема блокировки, используемая для операций с каталогом, основана на двух типах блокировок - на каждый индекс (-> i_mutex) и на файловую систему { {1}} (-> s_vfs_rename_mutex).
При использовании i_mutex для нескольких объектов, не относящихся к каталогу, мы всегда устанавливаем блокировки по порядку, увеличивая адрес. Мы будем вызывать этот порядок "указателя inode" в следующем виде.
Для наших целей все операции делятся на 5 классов:
1) доступ для чтения. Правила блокировки: вызывающий абонент блокирует каталог, к которому мы обращаемся.
2) создание объекта. Правила блокировки: такие же, как указано выше.
3) удаление объекта. Правила блокировки: вызывающий блокирует родителя, находит жертву, блокирует жертву и вызывает метод.
4) rename (), то есть перекрестный каталог , а не . Правила блокировки: вызывающая сторона блокирует родителя и находит источник и цель. Если цель уже существует, заблокируйте ее. Если источник не является каталогом, заблокируйте его. Если это означает, что нам нужно заблокировать оба, заблокируйте их в порядке указателя inode.
5) создание ссылки. Правила блокировки: * заблокировать родителя * проверить, что источник не является каталогом * заблокировать источник * вызвать метод.
6) перекрестное переименование каталогов. Самый хитрый из всей связки. Правила блокировки : * заблокировать файловую систему * заблокировать родителей в порядке «сначала предки». * найти источник и цель. * если старый родитель равен или является потомком цели сбой с -ENOTEMPTY *, если новый родитель равен или является потомком источника сбой с -ELOOP {{1 }} * Если цель существует, заблокируйте ее. Если источник не является каталогом, заблокируйте его . В случае, если это означает, что нам нужно заблокировать и источник, и цель, сделайте это в порядке указателя inode. * вызовите метод.
Вы можете написать сценарий, который может проверять блокировку каталога, используя некоторую информацию из 6 операций над dir.