Prev: perf lock: add "info" subcommand for dumping misc information
Next: linux-next tree addition request
From: Dmitry Monakhov on 24 Apr 2010 07:30 My be my question appeared to obvious for someone, but still fd = open("a", O_DIRECT, ) fd2 = open("b", O_DIRECT, ) write(fd, buf ,size) /* allocate blocks for a file */ fsync(fd) /* Now, it is guaranteed that blocks are allocated.*/ /* Submit async rewrite request */ io_prep_pwrite(io, fd, io->u.c.buf, size, 0); io_submit(myctx, 1, io); /* Io is in flight after this */ /* Ok, truncate the file */ ftruncate(fd, 0) /* Reuse truncated block blocks for a new file */ write(fd2,buf ,size) /* old a's blocks belongs to b now. */ What protect us from aio request to rewrite content of new file? Or even corrupt fs because old blocks may be used as metadata now. Seems unmap_underlying_metadata() can not help us here because async io context does not dirty or locked any bh because they was already allocated. Fairly to say. I can not reproduce rewrite effect. I use ext4 with external journal, so where a io_barriers in fs_dev's blktrace log. Seems what rewrite effect no happens only because blklayer does not reorganized issued requests. But nothing is preventing this right? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Dave Chinner on 26 Apr 2010 20:00
On Sat, Apr 24, 2010 at 03:29:36PM +0400, Dmitry Monakhov wrote: > My be my question appeared to obvious for someone, but still > > fd = open("a", O_DIRECT, ) > fd2 = open("b", O_DIRECT, ) > write(fd, buf ,size) /* allocate blocks for a file */ > fsync(fd) /* Now, it is guaranteed that blocks are allocated.*/ > /* Submit async rewrite request */ > io_prep_pwrite(io, fd, io->u.c.buf, size, 0); > io_submit(myctx, 1, io); /* Io is in flight after this */ > /* Ok, truncate the file */ > ftruncate(fd, 0) > /* Reuse truncated block blocks for a new file */ > write(fd2,buf ,size) /* old a's blocks belongs to b now. */ > > What protect us from aio request to rewrite content of new file? The filesystem is supposed to serialise truncate vs write races. i.e. the truncate will occur either before the write is executed or after it has completed, not while it is running. Cheers, Dave. -- Dave Chinner david(a)fromorbit.com -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |