Messages in this thread | | | From | Dmitry Monakhov <> | Subject | Direct aio_write/truncate question | Date | Sat, 24 Apr 2010 15:29:36 +0400 |
| |
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?
| |