Os dispositivos de loop apresentam algumas armadilhas. Muitas operações não são instantâneas, por exemplo, quando você losetup -d do dispositivo de loop será mantido ativo até que não esteja mais em uso. Os dispositivos podem estar em uso mesmo que você não esteja ciente disso, devido a processos em segundo plano que examinam dispositivos para uuids e outras coisas.
Talvez você deva deixar a opção de dispositivo de loop para losetup usando --find --show . Se um dispositivo de loop é inutilizável por qualquer motivo, ele deve escolher outro. Você teria que adaptar seu script para armazená-lo em uma variável então.
lodev=$(losetup --find --show textfile.x)
cryptsetup ... $lodev
O cryptsetup também é totalmente capaz de criar seu próprio dispositivo de loop, portanto você pode simplesmente renunciar losetup e ter cryptsetup trabalhando com o próprio arquivo. Isso deve ser menos propenso a erros.
cryptsetup ... testfile.x
Isso também funciona para luksOpen e o dispositivo de loop será mantido em volta até luksClose (novamente, até que não esteja mais em uso).