On 06/12/2013 06:22 AM, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > ... > --- > fs/xfs/xfs_iomap.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 8f8aaee..14be676 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -284,6 +284,15 @@ xfs_iomap_eof_want_preallocate( > return 0; > > /* > + * If the file is smaller than the minimum prealloc and we are using > + * dynamic preallocation, don't do any preallocation at all as it is > + * likely this is the only write to the file that is going to be done. > + */ > + if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) && > + XFS_ISIZE(ip) < mp->m_writeio_blocks) > + return 0; > + I stuck this on a box, got a 64k prealloc on an 8k file and then noticed this was comparing inode size against a block count. This should probably be: XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_writeio_blocks) Given that, we avoid preallocs entirely until the file size reaches the minimum write size (assuming dynamic prealloc mode). > + /* > * If there are any real blocks past eof, then don't > * do any speculative allocation. > */ > @@ -345,6 +354,10 @@ xfs_iomap_eof_prealloc_initial_size( > if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) > return 0; > > + /* If the file is small, then use the minimum prealloc */ > + if (XFS_ISIZE(ip) < mp->m_dalign) > + return 0; > + ... ... and the same fsb->b conversion applies here. If the file is larger than the minimum write size but smaller than the stripe unit, we prealloc by the minimum prealloc size (m_writeio_blocks) until the file grows beyond the stripe unit. That means if the stripe unit is smaller than m_writeio_blocks or not specified, we'd just start right into the dynamic prealloc algorithm. Seems reasonable. Brian _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs