public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@suse.de>
To: li nux <lnxluv@yahoo.com>
Cc: Erik Mouw <erik@harddisk-recovery.com>,
	colin <colin@realtek.com.tw>,
	linux-kernel@vger.kernel.org
Subject: Re: A problem about DIRECT IO on ext3
Date: Mon, 17 Oct 2005 11:03:11 +0200	[thread overview]
Message-ID: <20051017090310.GR2811@suse.de> (raw)
In-Reply-To: <20051017085226.47541.qmail@web33315.mail.mud.yahoo.com>

On Mon, Oct 17 2005, li nux wrote:
> 
> 
> --- Jens Axboe <axboe@suse.de> wrote:
> 
> > On Mon, Aug 29 2005, Erik Mouw wrote:
> > > 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
> > 
> > Actually, the buffer only needs to be hard block
> > size aligned, same goes
> > for the chunk size used for reads/writes.
> > 
> > -- 
> > Jens Axboe
> > 
> On 2.4 the open call succeeds with O_DIRECT
> but read returns -EINVAL for any block size (512, 1024
> ..16384)
> 
> open("/tmp/midstress_idx10",
> O_RDWR|O_CREAT|O_DIRECT|O_LARGEFILE, 01001101270) = 4
> read(3, 0xbfffdc40, 16384) = -1 EINVAL (Invalid
> argument)
> 
> how to correct this problem ?

See your buffer address, it's not aligned. You need to align that as
well. This is needed because the hardware will dma directly to the user
buffer, and to be on the safe side we require the same alignment as the
block layer will normally generate for file system io.

So in short, just align your read buffer to the same as your block size
and you will be fine. Example:

#define BS      (4096)
#define MASK    (BS - 1)
#define ALIGN(buf)      (((unsigned long) (buf) + MASK) & ~(MASK))

char *ptr = malloc(BS + MASK);
char *buf = (char *) ALIGN(ptr);

read(fd, buf, BS);

-- 
Jens Axboe


  parent reply	other threads:[~2005-10-17  9:03 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-29 12:15 A problem about DIRECT IO on ext3 colin
2005-08-29 13:29 ` Erik Mouw
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 [this message]
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
  -- strict thread matches above, loose matches on Subject: below --
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=20051017090310.GR2811@suse.de \
    --to=axboe@suse.de \
    --cc=colin@realtek.com.tw \
    --cc=erik@harddisk-recovery.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lnxluv@yahoo.com \
    /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