jbd2: don't write superblock when unmounting an ro filesystem
PATCH 1/1 jbd2: don't write superblock when unmounting an ro filesystem
This sequence:
# truncate --size=65536 fsfile # losetup --offset 65536 /dev/loop0 fsfile # mkfs.ext4 /dev/loop0 # losetup -d /dev/loop0 # mount -o loop,ro,offset=65536 fsfile mnt/ # umount mnt # dmesg | tail
results in an IO error when unmounting the RO filesystem:
[ 312.386074] SELinux: initialized (dev loop1, type ext4), uses xattr [ 318.020828] Buffer I/O error on device loop1, logical block 196608 [ 318.027024] lost page write due to I/O error on loop1 [ 318.032088] JBD2: Error -5 detected when updating journal superblock for loop1-8.
This behavior changed with:
commit 24bcc89c7e7c64982e6192b4952a0a92379fc341
Author: Jan Kara <[email protected]> Date: Tue Mar 13 15:41:04 2012 -0400
jbd2: split updating of journal superblock and marking journal empty
which lost some of the magic in jbd2_journal_update_superblock() which used to test for a journal with no outstanding transactions.
I'm not sure if the following is quite the right approach, but it fixes it for me.
---
p.s. no idea why this only happens if I use a loop device with an offset!
fs/jbd2/journal.c +5 -0
@@ -1354,6 +1354,11 @@ static void jbd2_mark_journal_empty(journal_t *journal)BUG_ON (!mutex_is_locked (&journal->j_checkpoint_mutex));read_lock (&journal->j_state_lock); +/* Is it already empty? */ +if (sb->s_start ==0 ) { +read_unlock (&journal->j_state_lock); +return ; + }jbd_debug (1 ,"JBD2: Marking journal as empty (seq %d)\n" , journal->j_tail_sequence);
Quoted 28 lines · Eric Sandeen
This sequence:
# truncate --size=65536 fsfile # losetup --offset 65536 /dev/loop0 fsfile # mkfs.ext4 /dev/loop0 # losetup -d /dev/loop0 # mount -o loop,ro,offset=65536 fsfile mnt/ # umount mnt # dmesg | tailresults in an IO error when unmounting the RO filesystem:
[ 312.386074] SELinux: initialized (dev loop1, type ext4), uses xattr [ 318.020828] Buffer I/O error on device loop1, logical block 196608 [ 318.027024] lost page write due to I/O error on loop1 [ 318.032088] JBD2: Error -5 detected when updating journal superblock for loop1-8.This behavior changed with:
commit
24bcc89c7e7c64982e6192b4952a0a92379fc341Author: Jan Kara <[email protected]> Date: Tue Mar 13 15:41:04 2012 -0400jbd2: split updating of journal superblock and marking journal empty
which lost some of the magic in
jbd2_journal_update_superblock()which used to test for a journal with no outstanding transactions.
Quoted 7 lines
I'm not sure if the following is quite the right approach, but it fixes it for me.
Signed-off-by Eric Sandeen <[email protected]>---
p.s. no idea why this only happens if I use a loop device with an offset!
PEBKAC. no-offset ro loop mount does the same.
-Eric
Quoted 8 lines · Eric Sandeen
Date: Tue, 24 Jul 2012 17:05:28 -0500
From: Eric Sandeen <[email protected]>
To: ext4 development <[email protected]>
Cc: Jan Kara <[email protected]>
Subject: [PATCH] jbd2: don't write superblock when unmounting an ro filesystemThis sequence:
Quoted 7 lines
# truncate --size=65536 fsfile # losetup --offset 65536 /dev/loop0 fsfile # mkfs.ext4 /dev/loop0 # losetup -d /dev/loop0 # mount -o loop,ro,offset=65536 fsfile mnt/ # umount mnt # dmesg | tail
Hi Eric,
I am having hard time understanding what the sequence should be doing. I actually can not reproduce it, because I can not create the file system on such loop device because it seems like the size of /dev/loop0 is zero, which makes sense considering that you set offset to 65536 in the 65536 sized file.
Also, is the use of lo device really needed ? We can create the file system on the file itself right ? Moreover, when I do that I can see that the journal is not created because the device (file) is too small, maybe it have something to do with the problem ?
Anyway, maybe I am missing something, but I do not understand what kind of problem are you reproducing there.
-Lukas
Quoted 49 lines
results in an IO error when unmounting the RO filesystem:
[ 312.386074] SELinux: initialized (dev loop1, type ext4), uses xattr [ 318.020828] Buffer I/O error on device loop1, logical block 196608 [ 318.027024] lost page write due to I/O error on loop1 [ 318.032088] JBD2: Error -5 detected when updating journal superblock for loop1-8.This behavior changed with:
commit
24bcc89c7e7c64982e6192b4952a0a92379fc341Author: Jan Kara <[email protected]> Date: Tue Mar 13 15:41:04 2012 -0400jbd2: split updating of journal superblock and marking journal empty
which lost some of the magic in
jbd2_journal_update_superblock()which used to test for a journal with no outstanding transactions.I'm not sure if the following is quite the right approach, but it fixes it for me.
Signed-off-by Eric Sandeen <[email protected]>---
p.s. no idea why this only happens if I use a loop device with an offset!
fs/jbd2/journal.c +5
-1@@ -1354,6 +1354,11 @@ static void jbd2_mark_journal_empty(journal_t *journal)BUG_ON (!mutex_is_locked (&journal->j_checkpoint_mutex));read_lock (&journal->j_state_lock); +/* Is it already empty? */ +if (sb->s_start ==0 ) { +read_unlock (&journal->j_state_lock); +return ; + }jbd_debug (1 ,"JBD2: Marking journal as empty (seq %d)\n" , journal->j_tail_sequence); --To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 18 lines · Lukáš Czerner
Quoted 8 lines · Eric Sandeen
Date: Tue, 24 Jul 2012 17:05:28 -0500
From: Eric Sandeen <[email protected]>
To: ext4 development <[email protected]>
Cc: Jan Kara <[email protected]>
Subject: [PATCH] jbd2: don't write superblock when unmounting an ro filesystemThis sequence:
Quoted 7 lines
# truncate --size=65536 fsfile # losetup --offset 65536 /dev/loop0 fsfile # mkfs.ext4 /dev/loop0 # losetup -d /dev/loop0 # mount -o loop,ro,offset=65536 fsfile mnt/ # umount mnt # dmesg | tail
Quoted 7 lines
Hi Eric,
I am having hard time understanding what the sequence should be doing. I actually can not reproduce it, because I can not create the file system on such loop device because it seems like the size of
/dev/loop0is zero, which makes sense considering that you set offset to 65536 in the 65536 sized file.
sorry, that must have been a cut & paste error. :(
The offset was leftover from trying to match the original reporter's case. This simpler test shows the same problem:
1014 truncate --size=2g fsfile 1015 mkfs.ext4 fsfile 1016 mount -o loop,ro fsfile mnt 1017 umount mnt 1018 dmesg | tail
[ 417.631105] EXT4-fs (loop0): mounted filesystem with ordered data mode. Opts: (null) [ 417.639183] SELinux: initialized (dev loop0, type ext4), uses xattr [ 420.903970] Buffer I/O error on device loop0, logical block 262144 [ 420.910448] lost page write due to I/O error on loop0 [ 420.915662] JBD2: Error -5 detected when updating journal superblock for loop0-8.
Quoted 54 lines
Also, is the use of lo device really needed ? We can create the file system on the file itself right ? Moreover, when I do that I can see that the journal is not created because the device (file) is too small, maybe it have something to do with the problem ?
Anyway, maybe I am missing something, but I do not understand what kind of problem are you reproducing there.
-Lukas
Quoted 44 lines
results in an IO error when unmounting the RO filesystem:
[ 312.386074] SELinux: initialized (dev loop1, type ext4), uses xattr [ 318.020828] Buffer I/O error on device loop1, logical block 196608 [ 318.027024] lost page write due to I/O error on loop1 [ 318.032088] JBD2: Error -5 detected when updating journal superblock for loop1-8.This behavior changed with:
commit
24bcc89c7e7c64982e6192b4952a0a92379fc341Author: Jan Kara <[email protected]> Date: Tue Mar 13 15:41:04 2012 -0400jbd2: split updating of journal superblock and marking journal empty
which lost some of the magic in
jbd2_journal_update_superblock()which used to test for a journal with no outstanding transactions.I'm not sure if the following is quite the right approach, but it fixes it for me.
Signed-off-by Eric Sandeen <[email protected]>---
p.s. no idea why this only happens if I use a loop device with an offset!
fs/jbd2/journal.c +5
-0@@ -1354,6 +1354,11 @@ static void jbd2_mark_journal_empty(journal_t *journal)BUG_ON (!mutex_is_locked (&journal->j_checkpoint_mutex));read_lock (&journal->j_state_lock); +/* Is it already empty? */ +if (sb->s_start ==0 ) { +read_unlock (&journal->j_state_lock); +return ; + }jbd_debug (1 ,"JBD2: Marking journal as empty (seq %d)\n" , journal->j_tail_sequence);
Quoted 5 lines
Quoted 5 lines
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 10 lines · Eric Sandeen
This sequence:
# truncate --size=65536 fsfile # losetup --offset 65536 /dev/loop0 fsfile # mkfs.ext4 /dev/loop0 # losetup -d /dev/loop0 # mount -o loop,ro,offset=65536 fsfile mnt/ # umount mnt # dmesg | tail
Quoted 6 lines
results in an IO error when unmounting the RO filesystem:
[ 312.386074] SELinux: initialized (dev loop1, type ext4), uses xattr [ 318.020828] Buffer I/O error on device loop1, logical block 196608 [ 318.027024] lost page write due to I/O error on loop1 [ 318.032088] JBD2: Error -5 detected when updating journal superblock for loop1-8.
Ted, did this patch fall through cracks? I've ported the fix to JBD and
added it to my tree. I plan to send it to Linus in a few days. Also I've CC'd stable since this is a bit annoying regression.
Honza
Quoted 36 lines
This behavior changed with:
commit
24bcc89c7e7c64982e6192b4952a0a92379fc341Author: Jan Kara <[email protected]> Date: Tue Mar 13 15:41:04 2012 -0400jbd2: split updating of journal superblock and marking journal empty
which lost some of the magic in
jbd2_journal_update_superblock()which used to test for a journal with no outstanding transactions.I'm not sure if the following is quite the right approach, but it fixes it for me.
Signed-off-by Eric Sandeen <[email protected]>---
p.s. no idea why this only happens if I use a loop device with an offset!
fs/jbd2/journal.c +5
-0@@ -1354,6 +1354,11 @@ static void jbd2_mark_journal_empty(journal_t *journal)BUG_ON (!mutex_is_locked (&journal->j_checkpoint_mutex));read_lock (&journal->j_state_lock); +/* Is it already empty? */ +if (sb->s_start ==0 ) { +read_unlock (&journal->j_state_lock); +return ; + }jbd_debug (1 ,"JBD2: Marking journal as empty (seq %d)\n" , journal->j_tail_sequence);
Signature · 2 lines
Jan Kara <[email protected]> SUSE Labs, CR
Quoted 17 lines · Jan Kara
Quoted 10 lines · Eric Sandeen
This sequence:
# truncate --size=65536 fsfile # losetup --offset 65536 /dev/loop0 fsfile # mkfs.ext4 /dev/loop0 # losetup -d /dev/loop0 # mount -o loop,ro,offset=65536 fsfile mnt/ # umount mnt # dmesg | tailQuoted 6 lines
results in an IO error when unmounting the RO filesystem:
[ 312.386074] SELinux: initialized (dev loop1, type ext4), uses xattr [ 318.020828] Buffer I/O error on device loop1, logical block 196608 [ 318.027024] lost page write due to I/O error on loop1 [ 318.032088] JBD2: Error -5 detected when updating journal superblock for loop1-8.
Quoted 5 lines
Ted, did this patch fall through cracks? I've ported the fix to JBD and
added it to my tree. I plan to send it to Linus in a few days. Also I've CC'd stable since this is a bit annoying regression.Honza
Thanks for doing both of those things, Jan.
BTW this happens on loop because mount -o,ro apparently sets up the loop device itself as readonly.
-Eric
Theodore Ts'o
maintainerApplied, thanks. I updated the reproduction instructions so that they wored correctly. (i.e., by removing the offset, and changing the size to 1g).
- Ted
Quoted 4 lines · Theodore Ts'o
Applied, thanks. I updated the reproduction instructions so that they wored correctly. (i.e., by removing the offset, and changing the size to 1g).
Thanks, sorry about that really messed up commit message. :(
-Eric
Quoted 5 lines
- Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html