Como renomear um arquivo no POSIX de maneira durável?

Qual é a maneira correta de renomear duramente um arquivo em um sistema de arquivos POSIX? Especificamente perguntando sobre fsyncs nodiretórios. (Se isso depende do OS / FS, estou perguntando sobre Linux e ext3 / ext4).

Nota: existem outras perguntas no StackOverflow sobre renomeações duráveis, mas o AFAICT não aborda a sincronização dos diretórios (o que é importante para mim - nem estou modificando os dados do arquivo).

Atualmente tenho (em Python):

dstdirfd = open(dstdirpath, O_DIRECTORY|O_RDONLY)
rename(srcdirpath + '/' + filename, dstdirpath + '/' + filename)
fsync(dstdirfd)

Questões específicas:

Isso também implicitamente sincroniza o diretório de origem? Ou posso terminar com o arquivo aparecendo nos dois diretórios após um ciclo de energia (o que significa que eu teria que verificar a contagem de links físicos e executar manualmente a recuperação), ou seja, é impossível garantir uma operação de movimentação atômica duradoura?Se eu sincronizar o diretório de origemao invés de o diretório de destino, isso também implicitamente sincronizará o diretório de destino?Existem ferramentas úteis de teste / depuração / aprendizado relacionadas (injetores de falhas, ferramentas de introspecção, sistemas de arquivos simulados etc.)?

Desde já, obrigado.

questionAnswers(4)

yourAnswerToTheQuestion