e2fsprogs: Fsck of read-only FS w/ external journal fails after 1.42.5?
Hello all,
Commit a85f8350 (http://goo.gl/aCykm) makes it impossible to fsck an ext4 filesystem w/ external journal if it is mounted read-only. Certain distros (Gentoo in my case) expect to be able to do this on the root filesystem at boot time, and get very upset if they can't.
With journal checks forced now, e2fsck tries to open() the external journal device, which always fails with -EBUSY if the filesystem is mounted, read-only or otherwise. Is this the expected behavior? Maybe the kernel shouldn't be returning an error there? It's been doing so since at least v3.6.
Clearly this doesn't impact many people, since it's been in the tree for almost a year now... but I thought I'd mention it.
Thoughts?
Thanks very much,
Calvin
Quoted 5 lines · Calvin Owens
Commit
a85f8350(http://goo.gl/aCykm) makes it impossible to fsck an ext4 filesystem w/ external journal if it is mounted read-only. Certain distros (Gentoo in my case) expect to be able to do this on the root filesystem at boot time, and get very upset if they can't.
The fact that e2fsck would working with root file systems with an external journal between commits 47c1b8e166 and a85f8350 was by accident. Can you try this patch? This should allow external journals on the root file system to work properly.
- Ted
Quoted 1 line
From
26991d026e4b555229a4466ae4d003420321bbd2Mon Sep 17 00:00:00 2001
From: Theodore Ts'o <[email protected]>
Date: Sat, 4 May 2013 19:07:18 -0400
Subject: [PATCH] e2fsck: don't use IO_FLAG_EXCLUSIVE for read-only root file
systems
When opening the external journal, use the same logic to decide whether or not to open the file system with EXT2_FLAG_EXCLUSIVE found in main().
Otherwise, it's not posible to use e2fsck when the root file system is using an external journal.
--- e2fsck/journal.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
e2fsck/journal.c +12 -2
@@ -372,9 +372,19 @@ static errcode_t e2fsck_get_journal(e2fsck_t ctx, journal_t **ret_journal)#ifndef USE_INODE_IO if (ext_journal)#endif - retval = io_ptr->open (journal_name, -IO_FLAG_RW |IO_FLAG_EXCLUSIVE , + { +int flags =IO_FLAG_RW ; +if (!(ctx->mount_flags &EXT2_MF_ISROOT && + ctx->mount_flags &EXT2_MF_READONLY )) + flags |=IO_FLAG_EXCLUSIVE ; +if ((ctx->mount_flags &EXT2_MF_READONLY ) && + (ctx->options &E2F_OPT_FORCE )) + flags &= ~IO_FLAG_EXCLUSIVE ; + + + retval = io_ptr->open (journal_name, flags, &ctx->journal_io); + }if (retval) goto errout;
Signature · 1 line
1.7.12.rc0.22.gcdd159b
Quoted 7 lines · Theodore Ts'o
Quoted 5 lines · Calvin Owens
Commit
a85f8350(http://goo.gl/aCykm) makes it impossible to fsck an ext4 filesystem w/ external journal if it is mounted read-only. Certain distros (Gentoo in my case) expect to be able to do this on the root filesystem at boot time, and get very upset if they can't.
Quoted 6 lines
The fact that e2fsck would working with root file systems with an external journal between commits
47c1b8e166anda85f8350was by accident. Can you try this patch? This should allow external journals on the root file system to work properly.- Ted
Tested - your patch fixes the issue.
Thanks,
Calvin
Quoted 49 lines
From
26991d026e4b555229a4466ae4d003420321bbd2Mon Sep 17 00:00:00 2001
From: Theodore Ts'o <[email protected]>
Date: Sat, 4 May 2013 19:07:18 -0400
Subject: [PATCH] e2fsck: don't useIO_FLAG_EXCLUSIVEfor read-only root file
systemsWhen opening the external journal, use the same logic to decide whether or not to open the file system with
EXT2_FLAG_EXCLUSIVEfound inmain().Otherwise, it's not posible to use e2fsck when the root file system is using an external journal.
Reported-by Calvin Owens <[email protected]>Signed-off-by "Theodore Ts'o" <[email protected]>--- e2fsck/journal.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)e2fsck/journal.c +12
-2@@ -372,9 +372,19 @@ static errcode_t e2fsck_get_journal(e2fsck_t ctx, journal_t **ret_journal)#ifndef USE_INODE_IO if (ext_journal)#endif - retval = io_ptr->open (journal_name, -IO_FLAG_RW |IO_FLAG_EXCLUSIVE , + { +int flags =IO_FLAG_RW ; +if (!(ctx->mount_flags &EXT2_MF_ISROOT && + ctx->mount_flags &EXT2_MF_READONLY )) + flags |=IO_FLAG_EXCLUSIVE ; +if ((ctx->mount_flags &EXT2_MF_READONLY ) && + (ctx->options &E2F_OPT_FORCE )) + flags &= ~IO_FLAG_EXCLUSIVE ; + + + retval = io_ptr->open (journal_name, flags, &ctx->journal_io); + }if (retval) goto errout;Signature · 1 line
1.7.12.rc0.22.gcdd159b