xfs
[Top] [All Lists]

PARTIAL TAKE 983683 - Prevent direct I/O from mapping extents beyond eof

To: sgi.bugs.xfs@xxxxxxxxxxxx, xfs@xxxxxxxxxxx
Subject: PARTIAL TAKE 983683 - Prevent direct I/O from mapping extents beyond eof
From: lachlan@xxxxxxx (Lachlan McIlroy)
Date: Wed, 20 Aug 2008 16:08:31 +1000 (EST)
Sender: xfs-bounce@xxxxxxxxxxx
Prevent direct I/O from mapping extents beyond eof

With the help from some tracing I found that we try to map extents beyond
eof when doing a direct I/O read.  It appears that the way to inform the
generic direct I/O path (ie do_direct_IO()) that we have breached eof is
to return an unmapped buffer from xfs_get_blocks_direct().  This will cause
do_direct_IO() to jump to the hole handling code where is will check for
eof and then abort.

This problem was found because a direct I/O read was trying to map beyond
eof and was encountering delayed allocations.  The delayed allocations beyond
eof are speculative allocations and they didn't get converted when the direct
I/O flushed the file because there was only enough space in the current AG
to convert and write out the dirty pages within eof.  Note that
xfs_iomap_write_allocate() wont necessarily convert all the delayed allocation
passed to it - it will return after allocating the first extent - so if the
delayed allocation extends beyond eof then it will stay that way.

Date:  Wed Aug 20 16:07:36 AEST 2008
Workarea:  redback.melbourne.sgi.com:/home/lachlan/isms/2.6.x-xfs
Inspected by:  hch
Author:  lachlan

The following file(s) were checked into:
  longdrop.melbourne.sgi.com:/isms/linux/2.6.x-xfs-melb


Modid:  xfs-linux-melb:xfs-kern:31929a
fs/xfs/linux-2.6/xfs_aops.c - 1.164 - changed
http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/linux-2.6/xfs_aops.c.diff?r1=text&tr1=1.164&r2=text&tr2=1.163&f=h
        - Prevent direct I/O from mapping extents beyond eof




<Prev in Thread] Current Thread [Next in Thread>
  • PARTIAL TAKE 983683 - Prevent direct I/O from mapping extents beyond eof, Lachlan McIlroy <=