linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Hans Reiser <reiser@namesys.com>
To: Hifumi Hisashi <hifumi.hisashi@lab.ntt.co.jp>,
	Chris Mason <mason@suse.com>
Cc: reiserfs-dev@namesys.com,  reiserfs-list@namesys.com,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH] fix problems related to journaling in Reiserfs
Date: Wed, 31 Aug 2005 20:35:52 -0700	[thread overview]
Message-ID: <43167718.5080702@namesys.com> (raw)
In-Reply-To: <6.0.0.20.2.20050831191551.03fdbac0@129.60.53.12>

Thanks much Hifumi!

Chris, please comment on the patch.

Hans

Hifumi Hisashi wrote:

>   Hello.
>
>   I noticed that the Reiserfs has some problems related to meta-data
> journaling.
>   I suppose that transactions regarding meta-data should be written to
> a disk every
> meta-data change (for example, i_size is increased) in ordered-mode
> while synchronous
> writing is performed. But, it seems to me the Reiserfs does not do that.
>
>   I did a following test.
> 1, Mount the Reiserfs in ordered-mode.
> 2, Run the test program that opens a test file with O_SYNC|O_CREAT
> flag, and continues to
> write 4bytes data in busy loop. Every write() is and its file size is
> increasing.
> 3, While above the program is running, disconnect SCSI cable.
> 4, Hexdump a disk and see journal on a disk.
> 5, Reboot a system and again mount the Reiserfs in ordered mode.
>
>   I checked the size of file the test program created. I could not see
> whole content of this file
> because file size was shorter than it should be. The cause of this
> problem is that
> even though an i_size was changed, meta-data  was not logged to a
> journal area on disk
> under synchronous writing.
>
>   I did same test on Ext3, and there was no such a problem. Ext3(jbd)
> logged every change of
> an i_size while an O_SYNC writing was being performed.
>
>   Following patch fix this problem.
>
>  Signed-off-by :Hisashi Hifumi<hifumi.hisashi@lab.ntt.co.jp>
>
> diff -Nru linux-2.6.13/fs/reiserfs/file.c
> linux-2.6.13_fix/fs/reiserfs/file.c
> --- linux-2.6.13/fs/reiserfs/file.c    2005-08-29 08:41:01.000000000
> +0900
> +++ linux-2.6.13_fix/fs/reiserfs/file.c    2005-08-31
> 16:33:33.000000000 +0900
> @@ -819,7 +819,6 @@
>      int i;            // loop counter
>      int offset;        // Writing offset in page.
>      int orig_write_bytes = write_bytes;
> -    int sd_update = 0;
>
>      for (i = 0, offset = (pos & (PAGE_CACHE_SIZE - 1)); i < num_pages;
>           i++, offset = 0) {
> @@ -855,17 +854,17 @@
>
>          if (th->t_trans_id) {
>              reiserfs_write_lock(inode->i_sb);
> -            reiserfs_update_sd(th, inode);    // And update on-disk
> metadata
> +            status = journal_end(th, th->t_super,
> th->t_blocks_allocated);
> +                if (status)
> +                        retval = status;
>              reiserfs_write_unlock(inode->i_sb);
> -        } else
> -            inode->i_sb->s_op->dirty_inode(inode);
> -
> -        sd_update = 1;
> +        }
> +        mark_inode_dirty(inode);
> +        th->t_trans_id = 0;
>      }
>      if (th->t_trans_id) {
>          reiserfs_write_lock(inode->i_sb);
> -        if (!sd_update)
> -            reiserfs_update_sd(th, inode);
> +        reiserfs_update_sd(th, inode);
>          status = journal_end(th, th->t_super, th->t_blocks_allocated);
>          if (status)
>              retval = status;
> @@ -1526,10 +1525,13 @@
>          }
>      }
>
> -    if ((file->f_flags & O_SYNC) || IS_SYNC(inode))
> +    if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) {
>          res =
>              generic_osync_inode(inode, file->f_mapping,
>                      OSYNC_METADATA | OSYNC_DATA);
> +        if (res)
> +            already_written = 0;
> +    }
>
>      up(&inode->i_sem);
>      reiserfs_async_progress_wait(inode->i_sb);
> diff -Nru linux-2.6.13/fs/reiserfs/inode.c
> linux-2.6.13_fix/fs/reiserfs/inode.c
> --- linux-2.6.13/fs/reiserfs/inode.c    2005-08-29 08:41:01.000000000
> +0900
> +++ linux-2.6.13_fix/fs/reiserfs/inode.c    2005-08-31
> 16:33:33.000000000 +0900
> @@ -1642,6 +1642,7 @@
>  {
>      struct reiserfs_transaction_handle th;
>      int jbegin_count = 1;
> +    int err = 0;
>
>      if (inode->i_sb->s_flags & MS_RDONLY)
>          return -EROFS;
> @@ -1654,11 +1655,11 @@
>          reiserfs_write_lock(inode->i_sb);
>          if (!journal_begin(&th, inode->i_sb, jbegin_count)) {
>              reiserfs_update_sd(&th, inode);
> -            journal_end_sync(&th, inode->i_sb, jbegin_count);
> +            err = journal_end_sync(&th, inode->i_sb, jbegin_count);
>          }
>          reiserfs_write_unlock(inode->i_sb);
>      }
> -    return 0;
> +    return err;
>  }
>
>  /* stat data of new object is inserted already, this inserts the item
>
> Thanks,
>
>

  parent reply	other threads:[~2005-09-01  3:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-31 12:39 [PATCH] fix problems related to journaling in Reiserfs Hifumi Hisashi
2005-08-31 13:42 ` michael chang
2005-09-01  0:02   ` Hifumi Hisashi
2005-09-01  0:37     ` michael chang
2005-09-01  3:30       ` Hans Reiser
2005-09-01  3:35 ` Hans Reiser [this message]
2005-09-02  2:03   ` Chris Mason
2005-10-04  8:47     ` Hifumi Hisashi
2005-10-04 10:40       ` Hans Reiser

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=43167718.5080702@namesys.com \
    --to=reiser@namesys.com \
    --cc=hifumi.hisashi@lab.ntt.co.jp \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=mason@suse.com \
    --cc=reiserfs-dev@namesys.com \
    --cc=reiserfs-list@namesys.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).