Eu dei uma rápida olhada no e2fsck source , e parece-me que existem lugares onde o erro " Memory allocation failed " pode ocorrer por razões que podem não ser erros de alocação de memória.
A string de erro é definida em [src]/lib/ext2fs/ext2_err.et.in
em relação à constante EXT2_ET_NO_MEMORY
. Isso pode ser retornado de vários locais no código em [src]/e2fsck/
. Aqui está um exemplo de ea_refcount.c
:
errcode_t ea_refcount_increment(ext2_refcount_t refcount, blk_t blk, int *ret)
{
struct ea_refcount_el *el;
el = get_refcount_el(refcount, blk, 1);
if (!el)
return EXT2_ET_NO_MEMORY;
get_refcount_el()
está no mesmo arquivo:
static struct ea_refcount_el *get_refcount_el(ext2_refcount_t refcount,
blk_t blk, int create)
{
int low, high, mid;
if (!refcount || !refcount->list)
return 0;
Esse não é o único motivo pelo qual ele retornará null, nem a única razão que parece não estar diretamente relacionada a uma alocação com falha.
Para realmente provar que eu teria que fazer mais escavações, mas isso se encaixa com a sua afirmação de que realmente não esgotou a memória do sistema.
Sendo este o caso, talvez o problema esteja relacionado a um potencial obscuro e imprevisível de controladores de cartão SD perturbados / danificados, mas ainda assim é um bug no e2fsck na medida em que algum tipo de verificação de sanidade ou algo deve ser feito para pegar isso, mesmo que seja apenas para dizer: "Desculpe, seu dispositivo está ferrado" (provavelmente verdadeiro) versus "Sem memória" (provavelmente não é verdade). Você pode relatar isso ( "Em caso de erros nesses programas, entre em contato com Ted Ts'o em [email protected] ou [email protected]" - Acredito que TT é um dev de kernel do linux), e você pode referenciar este Q & A.
Além disso, você também pode esquecer o que está nessa placa e fazer um teste destrutivo de leitura / gravação:
badblocks -v -w -b 1048576 -c 16 /dev/sdx
Lembre-se de que é um teste DESTRUTIVO - você perderá todos os seus dados. Badblocks não é útil para criar uma lista de badblocks reais para um cartão SD (eles não informam endereços físicos reais por causa do nivelamento de desgaste), mas se o cartão estiver borked, ele provavelmente o informará. Testar um cartão de 16 GB leva menos de uma hora.