Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] reiserfs: fix journaling issue regarding fsync()

When write() extends a file(i_size is increased) and fsync() is called,
change of inode must be written to journaling area through fsync().
But,currently the i_trans_id is not correctly updated when i_size is
increased. So fsync() does not kick the journal writer.

Reiserfs_file_write() already updates the transaction when blocks are
allocated, but the case when i_size increases and new blocks are not added
is not correctly treated.

Following patch fix this bug.

Signed-off-by: Hisashi Hifumi <hifumi.hisashi@oss.ntt.co.jp>
Cc: Jeff Mahoney <jeffm@suse.com>
Cc: Chris Mason <mason@suse.com>
Cc: Hans Reiser <reiser@namesys.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Hisashi Hifumi and committed by
Linus Torvalds
73ce5934 0808925e

+5 -1
+5 -1
fs/reiserfs/file.c
··· 860 860 // this sets the proper flags for O_SYNC to trigger a commit 861 861 mark_inode_dirty(inode); 862 862 reiserfs_write_unlock(inode->i_sb); 863 - } else 863 + } else { 864 + reiserfs_write_lock(inode->i_sb); 865 + reiserfs_update_inode_transaction(inode); 864 866 mark_inode_dirty(inode); 867 + reiserfs_write_unlock(inode->i_sb); 868 + } 865 869 866 870 sd_update = 1; 867 871 }