История изменений
Исправление KivApple, (текущая версия) :
Запись в журнале имеет контрольную сумму (даже банальный CRC32 обеспечит достаточную надёжность для данной задачи). Также запись в журнале удаляется (или как-то помечается) после выполнения операции.
Если запись будет записана в журнал не полностью, то контрольная сумма не сойдётся. Такую запись можно просто игнорировать, потому что запись в журнал происходит ПЕРЕД любыми изменениями метаданных. Если запись в журнал неудачна, то метаданные гарантированно не были тронуты.
Затем. Допустим, все операции выполнены, но запись в журнале удалить не успели. В этом случае происходит простая проверка - завершена ли операция (надо просто проверить прогнозируемое состояние метаданных после описанной операции и реальное). Если завершена, то удаляем запись, иначе откатываем недоделанные изменения.
Если же запись не полностью удалена, то контрольная сумма не сойдётся и её опять же можно игнорировать. Ведь удаление записи гарантированно начинается ПОСЛЕ всех изменений метаданных. То есть если запись в журнале некорректна, то это возможно лишь в двух случаях - данные ПОЛНОСТЬЮ не записаны или же данные ПОЛНОСТЬЮ записаны. В обоих случаях вмешательство не требуется (кроме чистки журнала от мусора).
Данные файлов, а не служебные структуры ФС обычно не журналируют (точнее журналируют аллокацию и освобождение блоков, но не их данные). Да-да. Сохранить данные, которые писались на диск в последние миллисекунды перед отключением питания, задачи не стоит. Такие данные (а также созданные и удалённые файлов) будут почти наверняка отброшены. Задача журналирования - сохранить корректность метаданных, чтобы не потерять все файлы вообще. В том числе ценой отката незавершённой операции.
Исправление KivApple, :
Запись в журнале имеет контрольную сумму (даже банальный CRC32 обеспечит достаточную надёжность для данной задачи). Также запись в журнале удаляется (или как-то помечается) после выполнения операции.
Если запись будет записана в журнал не полностью, то контрольная сумма не сойдётся. Такую запись можно просто игнорировать, потому что запись в журнал происходит ПЕРЕД любыми изменениями метаданных. Если запись в журнал неудачна, то метаданные гарантированно не были тронуты.
Затем. Допустим, все операции выполнены, но запись в журнале удалить не успели. В этом случае происходит простая проверка - завершена ли операция (надо просто проверить прогнозируемое состояние метаданных после описанной операции и реальное). Если завершена, то удаляем запись, иначе откатываем недоделанные изменения.
Если же запись не полностью удалена, то контрольная сумма не сойдётся и её опять же можно игнорировать. Ведь удаление записи гарантированно начинается ПОСЛЕ всех изменений метаданных.
Данные файлов, а не служебные структуры ФС обычно не журналируют (точнее журналируют аллокацию и освобождение блоков, но не их данные). Да-да. Сохранить данные, которые писались на диск в последние миллисекунды перед отключением питания, задачи не стоит. Такие данные (а также созданные и удалённые файлов) будут почти наверняка отброшены. Задача журналирования - сохранить корректность метаданных, чтобы не потерять все файлы вообще. В том числе ценой отката незавершённой операции.
Исправление KivApple, :
Запись в журнале имеет контрольную сумму (даже банальный CRC32 обеспечит достаточную надёжность). Также запись в журнале удаляется (или как-то помечается) после выполнения операции.
Если запись будет записана в журнал не полностью, то контрольная сумма не сойдётся. Такую запись можно просто игнорировать, потому что запись в журнал происходит ПЕРЕД любыми изменениями метаданных. Если запись в журнал неудачна, то метаданные гарантированно не были тронуты.
Затем. Допустим, все операции выполнены, но запись в журнале удалить не успели. В этом случае происходит простая проверка - завершена ли операция (надо просто проверить прогнозируемое состояние метаданных после описанной операции и реальное). Если завершена, то удаляем запись, иначе откатываем недоделанные изменения.
Если же запись не полностью удалена, то контрольная сумма не сойдётся и её опять же можно игнорировать. Ведь удаление записи гарантированно начинается ПОСЛЕ всех изменений метаданных.
Данные файлов, а не служебные структуры ФС обычно не журналируют (точнее журналируют аллокацию и освобождение блоков, но не их данные). Да-да. Сохранить данные, которые писались на диск в последние миллисекунды перед отключением питания, задачи не стоит. Такие данные (а также созданные и удалённые файлов) будут почти наверняка отброшены. Задача журналирования - сохранить корректность метаданных, чтобы не потерять все файлы вообще. В том числе ценой отката незавершённой операции.
Исходная версия KivApple, :
Запись в журнале имеет контрольную сумму. Также запись в журнале удаляется (или как-то помечается) после выполнения операции.
Если запись будет записана в журнал не полностью, то контрольная сумма не сойдётся. Такую запись можно просто игнорировать, потому что запись в журнал происходит ПЕРЕД любыми изменениями метаданных. Если запись в журнал неудачна, то метаданные гарантированно не были тронуты.
Затем. Допустим, все операции выполнены, но запись в журнале удалить не успели. В этом случае происходит простая проверка - завершена ли операция (надо просто проверить прогнозируемое состояние метаданных после описанной операции и реальное). Если завершена, то удаляем запись, иначе откатываем недоделанные изменения.
Если же запись не полностью удалена, то контрольная сумма не сойдётся и её опять же можно игнорировать. Ведь удаление записи гарантированно начинается ПОСЛЕ всех изменений метаданных.
Данные файлов, а не служебные структуры ФС обычно не журналируют (точнее журналируют аллокацию и освобождение блоков, но не их данные). Да-да. Сохранить данные, которые писались на диск в последние миллисекунды перед отключением питания, задачи не стоит. Такие данные (а также созданные и удалённые файлов) будут почти наверняка отброшены. Задача журналирования - сохранить корректность метаданных, чтобы не потерять все файлы вообще. В том числе ценой отката незавершённой операции.