[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20090102092902.6p7echfdgkos40ss@zappa.cx>
Date: Fri, 02 Jan 2009 09:29:02 +0100
From: Andreas Sundstrom <sunkan@...pa.cx>
To: linux-kernel@...r.kernel.org
Subject: Re: 2.6.28 ext4, xen and lvm volume becomes ro after snapshot
Quoting Theodore Tso <tytso@....edu>:
> Can you try this patch? This should (hopefully!) allow you to mount
> ext4 in a Xen guest without needing to explicitly disable barriers.
> If it works, it's what I plan to push to Linus.
>
> - Ted
>
> jbd2: Add barrier not supported test to journal_wait_on_commit_record
>
> Xen doesn't report that barriers are not supported until buffer I/O is
> reported as completed, instead of when the buffer I/O is submitted.
> Add a check and a fallback codepath to journal_wait_on_commit_record()
> to detect this case, so that attempts to mount ext4 filesystems on
> LVM/devicemapper devices on Xen guests don't blow up with an "Aborting
> journal on device XXX"; "Remounting filesystem read-only" error.
>
> Thanks to Andreas Sundstrom for reporting this issue.
>
> Signed-off-by: "Theodore Ts'o" <tytso@....edu>
> ---
>
> diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
> index bd1fad0..4b87547 100644
> --- a/fs/jbd2/commit.c
> +++ b/fs/jbd2/commit.c
> @@ -25,6 +25,7 @@
> #include <linux/crc32.h>
> #include <linux/writeback.h>
> #include <linux/backing-dev.h>
> +#include <linux/bio.h>
>
> /*
> * Default IO end handler for temporary BJ_IO buffer_heads.
> @@ -168,12 +169,34 @@ static int
> journal_submit_commit_record(journal_t *journal,
> * This function along with journal_submit_commit_record
> * allows to write the commit record asynchronously.
> */
> -static int journal_wait_on_commit_record(struct buffer_head *bh)
> +static int journal_wait_on_commit_record(journal_t *journal,
> + struct buffer_head *bh)
> {
> int ret = 0;
>
> +retry:
> clear_buffer_dirty(bh);
> wait_on_buffer(bh);
> + if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
> + printk(KERN_WARNING
> + "JBD2: wait_on_commit_record: sync failed on %s - "
> + "disabling barriers\n", journal->j_devname);
> + spin_lock(&journal->j_state_lock);
> + journal->j_flags &= ~JBD2_BARRIER;
> + spin_unlock(&journal->j_state_lock);
> +
> + lock_buffer(bh);
> + clear_buffer_dirty(bh);
> + set_buffer_uptodate(bh);
> + bh->b_end_io = journal_end_buffer_io_sync;
> +
> + ret = submit_bh(WRITE_SYNC, bh);
> + if (ret) {
> + unlock_buffer(bh);
> + return ret;
> + }
> + goto retry;
> + }
>
> if (unlikely(!buffer_uptodate(bh)))
> ret = -EIO;
> @@ -802,7 +825,7 @@ wait_for_iobuf:
> __jbd2_journal_abort_hard(journal);
> }
> if (!err && !is_journal_aborted(journal))
> - err = journal_wait_on_commit_record(cbh);
> + err = journal_wait_on_commit_record(journal, cbh);
>
> if (err)
> jbd2_journal_abort(journal, err);
>
Well, the patch didn't work when I did "patch -i ext4.patch -p1" but I
did it manually and the code compiles and works fine.
Here are the ext4 related kernel messages:
[ 0.147721] EXT4-fs warning (device xvda1): ext4_fill_super:
extents feature not enabled on this filesystem, use tune2fs.
[ 0.148744] EXT4-fs: barriers enabled
[ 0.158109] kjournald2 starting. Commit interval 5 seconds
[ 0.158131] EXT4-fs: delayed allocation enabled
[ 0.158224] EXT4-fs: mballoc enabled
[ 0.158235] EXT4-fs: mounted filesystem with ordered data mode.
[ 0.158262] VFS: Mounted root (ext4 filesystem) readonly.
[ 3.403818] EXT4 FS on xvda1, internal journal on xvda1:8
[ 7.800623] blkfront: xvda1: write barrier op failed
[ 7.800640] blkfront: xvda1: barriers disabled
[ 7.800651] end_request: I/O error, dev xvda1, sector 4384
[ 7.800664] end_request: I/O error, dev xvda1, sector 4384
[ 7.800690] JBD2: wait_on_commit_record: sync failed on xvda1:8 -
disabling barriers
# cat /proc/mounts |grep ext4
/dev/root / ext4 rw,noatime,barrier=1,noextents,data=ordered 0 0
/Andreas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists