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 <[EMAIL PROTECTED]>
>
> 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;
}