O esquema de bloqueio usado para operações de diretório é baseado em dois tipos de bloqueios - por-inode (- > i_mutex) e por sistema de arquivos (- > s_vfs_rename_mutex).
Ao tomar o i_mutex em vários objetos não-diretório, nós sempre adquirir os bloqueios em ordem, aumentando o endereço. Vamos ligar que "inode ponteiro" ordem no seguinte.
Para nossos propósitos, todas as operações se enquadram em 5 classes:
1) acesso de leitura. Regras de bloqueio: diretório de bloqueios de chamadas que estamos acessando.
2) criação de objetos. Regras de bloqueio: o mesmo que acima.
3) remoção de objetos. Regras de bloqueio: o chamador bloqueia pai, localiza vítima fecha a vítima e chama o método.
4) rename () que não é entre os diretórios. Regras de bloqueio: bloqueios de chamadas o pai e encontra a fonte e o alvo. Se o alvo já existir, bloqueie isto. Se source for um não-diretório, bloqueie-o. Se isso significa que precisamos bloquear ambos, bloqueá-los na ordem do ponteiro do inode.
5) criação de links. Regras de bloqueio: * pai de bloqueio * verifique se a fonte não é um diretório * fonte de bloqueio * chame o método.
6) renomeação de diretório cruzado. O mais complicado em todo o grupo. Bloqueio regras: * bloquear o sistema de arquivos * bloqueie os pais na ordem "antepassados primeiro". * encontrar fonte e destino. * se pai antigo é igual ou é descendente do alvo falhar com -ENOTEMPTY * se novo pai for igual a ou for descendente de origem falhar com -ELOOP * Se o alvo existir, bloqueie-o. Se a origem for um não-diretório, bloqueie isto. Caso isso signifique que precisamos bloquear a origem e o alvo, faça isso na ordem do ponteiro do inode. * chame o método.
Você pode escrever um script que pode verificar o bloqueio de diretório usando algumas informações das 6 operações acima no diretório
.