Por que mover arquivos entre subvolumes btrfs é uma operação cara?

5

Pelo que entendi, os subvolumes btrfs compartilham o mesmo sistema de arquivos "storage", então fiquei surpreso ao saber que mover arquivos entre diferentes subvolumes é uma operação cara, como se mover entre diferentes sistemas de arquivos (copy + delete).

Fiquei especialmente surpreso quando alguém sugeriu essa solução alternativa: copiar arquivos de refluxo entre subvolumes e excluir os originais. Diz-se que esta é uma operação barata (movendo-se apenas em metadados). Como é que subvolumes diferentes podem compartilhar blocos de dados ao usar COW, mas não na operação que deve ser mais fácil de mover dados?

    
por m.alessandrini 01.08.2015 / 10:47

1 resposta

2

How is that different subvolumes can share data blocks when using COW, but not in the should-be easier operation of moving data?

mv usa o renomear syscall para tentar o movimento. O kernel rename impl do btrfs detecta a movimentação dos subvolumes cruzados e explicitamente desaprova isso (mesmo se sob o mesmo ponto de montagem):

/* we only allow rename subvolume link between subvolumes */
if (old_ino != BTRFS_FIRST_FREE_OBJECTID && root != dest)
    return -EXDEV;

Isso provavelmente tem a ver com a contabilidade de subvolume inode e os caminhos de código que essas operações executam. A cópia do reflink está realmente criando novos metadados (mas os dados em si são CoW) contabilizados no novo subvolume. Em teoria, eles provavelmente poderiam fazer a renomeação "mover" os metadados, fazendo algo similar ao que a cópia --reflink seguiu a rm source ... simplesmente ninguém fez o esforço para fazê-lo.

    
por 11.07.2016 / 00:23