[RFC, PATCH 0/6] ext3: do not modify data on-disk when mounting read-only filesystem

Duane Griffin
2008-03-06T02:06:25Z

At present, as discussed in this LKML thread,
http://marc.info/?l=linux-kernel&m=117607695406580, when a dirty ext3
filesystem is mounted read-only it writes to the disk while replaying the
journal log and cleaning up the orphan list. This behaviour may surprise users
and can potentially cause data corruption/loss (e.g. if a system is suspended,
booted into a different OS, then resumed).

This patch series attempts to address this by using a block translation table
instead of replaying the journal on a read-only filesystem.

Patches 1-3 are independent cleanups/bug-fixes for things I came across while
working on this. They could be submitted separately and are not required for
following patches.

Patch 4 is a refactoring change that simplifies the code prior to later
substantive changes.

Patch 5 introduces the translation table and support for a truly read-only
journal into jbd.

Patch 6 uses the facility introduced in patch 5 to add support for true
read-only ext3.

For testing I've been using qemu VMs to create and mount dirtied filesystems. I
have a set of scripts that fully automates creating a dirty filesystem then
checking mounting read-only and read-write produces consistent results. On my
system it can get through around ~30 iteration overnight. If anyone is
interested in the scripts please let me know. Any suggestions for additional
tests or enhancements that could be made to the scripts would be gratefully
received.

TODO:
* Add R/W remount support
* Port to ext4

Cheers,
Duane Griffin.

> git diff --stat origin
fs/ext3/balloc.c | 2 +-
fs/ext3/ialloc.c | 2 +-
fs/ext3/inode.c | 8 +-
fs/ext3/resize.c | 2 +-
fs/ext3/super.c | 123 ++++++++++-----
fs/ext3/xattr.c | 8 +-
fs/jbd/checkpoint.c | 2 +-
fs/jbd/commit.c | 2 +-
fs/jbd/journal.c | 68 +++++---
fs/jbd/recovery.c | 402 +++++++++++++++++++++++++++++++++--------------
fs/jbd/revoke.c | 133 ++++++----------
fs/ocfs2/journal.c | 4 +-
include/linux/ext3_fs.h | 7 +
include/linux/jbd.h | 41 +++++-
14 files changed, 516 insertions(+), 288 deletions(-)