From: Erik Mouw <erik@harddisk-recovery.com>
To: colin <colin@realtek.com.tw>
Cc: linux-kernel@vger.kernel.org
Subject: Re: A problem about DIRECT IO on ext3
Date: Mon, 29 Aug 2005 15:29:47 +0200 [thread overview]
Message-ID: <20050829132947.GA21255@harddisk-recovery.com> (raw)
In-Reply-To: <002501c5ac93$6ef754c0$106215ac@realtek.com.tw>
On Mon, Aug 29, 2005 at 08:15:43PM +0800, colin wrote:
> I wrote a simple program to test direct io, and found that there are some
> strange behaviors of it on "ext3".
> My simple program is below. Assume that the executable file name is
> "directio". If I do the following:
> 1. cp directio aaa
> 2. ./directio directio aaa
>
> The size of aaa is about the same with directio. This is wrong.
No, it's right, but it's not what you expected.
> It should be 3 times the size of directio because there are 2 write
> operations and one lseek to the file end.
I suggest to strace() your program to see what happens.
> If the second file is not opened with "O_DIRECT", the result is correct.
>
> What's the problem of direct io? I found that if I remove the instruction of
> lseek, the result is correct.
There are four prerequisites for direct IO:
- the file needs to be opened with O_DIRECT
- the buffer needs to be page aligned (hint: use getpagesize() instead
of assuming that a page is 4k
- reads and writes need to happen *in* multiples of the soft block size
- reads and writes need to happen *at* multiples of the soft block size
> Is there any problem of lseek when doing direct io on ext3?
> My platform is 2.6.11.
There is no problem.
> Regards,
> Colin
>
> #define _GNU_SOURCE
>
> #include <stdio.h>
> #include <fcntl.h>
> #include <sys/stat.h>
> #include <sys/types.h>
> #include <stdlib.h>
Compile your program with -Wall, you're missing quite some include
files over here.
> int main(int argc, char **argv) {
>
> int fd1, fd2, count;
> char *ptr1, *ptr2;
>
> if(argc == 3) {
> fd1 = open(argv[1], O_RDONLY | O_DIRECT, S_IRWXU);
> fd2 = open(argv[2], O_RDWR | O_CREAT | O_DIRECT);
> } else {
> printf("Error syntax\n");
> exit(1);
> }
> printf("%d\n", lseek(fd2, 0, SEEK_END));
Make that lseek(fd2, 4 * 4096, SEEK_SET);
> ptr1 = malloc(4096 + 4096-1);
> ptr2 = (void*)((int)ptr1 - (int)ptr1 % 4096 + 4096);
Use memalign() or posix_memalign().
> do {
> count = read(fd1, ptr2, 4096);
> if(!count)
> break;
And what happens when count < 0 ?
> write(fd2, ptr2, 4096);
> write(fd2, ptr2, 4096);
Check return values.
> } while(count > 0);
>
> free(ptr1);
> close(fd1);
> close(fd2);
return 0;
> }
With the changes, the result is:
erik@arthur:/tmp > ls -l directio aaa
-rwxr-xr-x 1 erik erik 49152 2005-08-29 15:26 aaa*
-rwxr-xr-x 1 erik erik 12628 2005-08-29 15:26 directio*
Erik
--
+-- Erik Mouw -- www.harddisk-recovery.com -- +31 70 370 12 90 --
| Lab address: Delftechpark 26, 2628 XH, Delft, The Netherlands
next prev parent reply other threads:[~2005-08-29 13:29 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-29 12:15 colin
2005-08-29 13:29 ` Erik Mouw [this message]
2005-08-31 8:07 ` Jens Axboe
2005-08-31 11:12 ` Erik Mouw
2005-08-31 11:15 ` Jens Axboe
2005-10-17 8:52 ` li nux
2005-10-17 8:58 ` li nux
2005-10-17 9:03 ` Jens Axboe
2005-10-17 9:15 ` Grzegorz Kulewski
2005-10-17 9:17 ` Jens Axboe
2005-10-17 9:41 ` li nux
2005-10-17 9:51 ` Jens Axboe
2005-10-17 16:36 ` Badari Pulavarty
2005-10-17 17:53 ` Jens Axboe
2005-08-29 13:21 colin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050829132947.GA21255@harddisk-recovery.com \
--to=erik@harddisk-recovery.com \
--cc=colin@realtek.com.tw \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome