Hello Sorry, but afaics reiserfs' fsync works as it is supposed to. I experiment with the attached program. After reboot I make sure that file has "new file size". On Tue, 2006-06-20 at 17:43 +0900, Hisashi Hifumi wrote: > Hi, > > 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. > > Following patch fix this bug. > > Signed-off-by :Hisashi Hifumi <hifumi.hisashi@xxxxxxxxxxxxx> > > diff -Nru linux-2.6.17/fs/reiserfs/super.c linux-2.6.17_fix/fs/reiserfs/super.c > --- linux-2.6.17/fs/reiserfs/super.c 2006-06-18 10:49:35.000000000 +0900 > +++ linux-2.6.17_fix/fs/reiserfs/super.c 2006-06-20 14:38:28.000000000 +0900 > @@ -558,6 +558,7 @@ > reiserfs_write_unlock(inode->i_sb); > return; > } > + reiserfs_update_inode_transaction(inode); > reiserfs_update_sd(&th, inode); > journal_end(&th, inode->i_sb, 1); > reiserfs_write_unlock(inode->i_sb); > > > Thanks, > >
#include <stdio.h> #include <fcntl.h> #include <sys/stat.h> int main(int argc, char **argv) { int fd; struct stat st; fd = open(argv[1], O_WRONLY | O_APPEND); if (fd == -1) { perror("open failed"); return 0; } if (fstat(fd, &st)) { perror("stat failed"); return 0; } printf("old file size %d\n", st.st_size); if (write(fd, "hello", 5) != 5) { perror("write failed"); return 0; } if (fstat(fd, &st)) { perror("stat failed"); return 0; } printf("new file size %d\n", st.st_size); if (fsync(fd)) { perror("fsync failed"); return 0; } printf("rebooting"); fflush(stdout); system("reboot -f -n"); return 0; }