[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: PATCH for filesys corruption in ext3 with data=journal
- From: Neil Brown <neilb cse unsw edu au>
- To: Neil Brown <neilb cse unsw edu au>
- Cc: sct redhat com, akpm zip com au, adilger clusterfs com,ext3-users redhat com, Daniel Pittman <daniel rimspace net>,Udo A "." Steinberg <reality delusion de>,Oliver Feiler <kiza gmx net>,Zlatko Calusic <zlatko calusic iskon hr>
- Subject: Re: PATCH for filesys corruption in ext3 with data=journal
- Date: Tue, 4 Jun 2002 12:48:36 +1000 (EST)
On Friday May 31, neilb cse unsw edu au wrote:
>
> Hi,
>
> as I mentioned in earlier mail to ext3-users I have been getting some
> corruption on an ext3 filesystem that has been serving NFS. I am now
> confident that I fully understand the problem and have a patch.
>
> It only affects data=journal mode and I wonder if it might also be the
> cause of the corruption noted by a number of people on linux-kernel.
>
> First I will explain the problem. Then display the patch.
I should follow-up to say that the patch isn't quite complete.
Just next to
+ clear_bit(BH_Freed, &bh->b_state);
we need
+ clear_bit(BH_JBDDirty, &bh->b_state);
This seems to be working for me.
NeilBrown
>
>
> --- ./fs/jbd/commit.c 2002/05/28 04:15:18 1.1
> +++ ./fs/jbd/commit.c 2002/05/28 22:44:48
> @@ -663,12 +663,13 @@
> * there's no point in keeping a checkpoint record for
> * it. */
> bh = jh2bh(jh);
> - if (buffer_jdirty(bh)) {
> + if (buffer_jdirty(bh) && !__buffer_state(bh, Freed)) {
> JBUFFER_TRACE(jh, "add to new checkpointing trans");
> __journal_insert_checkpoint(jh, commit_transaction);
> JBUFFER_TRACE(jh, "refile for checkpoint writeback");
> __journal_refile_buffer(jh);
> } else {
> + clear_bit(BH_Freed, &bh->b_state);
> J_ASSERT_BH(bh, !buffer_dirty(bh));
> J_ASSERT_JH(jh, jh->b_next_transaction == NULL);
> __journal_unfile_buffer(jh);
> --- ./fs/jbd/transaction.c 2002/05/26 23:13:05 1.2
> +++ ./fs/jbd/transaction.c 2002/05/28 09:24:45
> @@ -1834,6 +1834,7 @@
> * running transaction if that is set, but nothing
> * else. */
> JBUFFER_TRACE(jh, "on committing transaction");
> + set_bit(BH_Freed, &bh->b_state);
> if (jh->b_next_transaction) {
> J_ASSERT(jh->b_next_transaction ==
> journal->j_running_transaction);
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]