Hey Christoph, On Tue, Nov 08, 2011 at 03:56:18AM -0500, Christoph Hellwig wrote: > If we convert and unwritten extent past the current i_size log the size update > as part of the extent manipulation transactions instead of doing an unlogged > metadata update later. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > > --- > fs/xfs/xfs_aops.c | 11 ++++++----- > fs/xfs/xfs_iomap.c | 19 ++++++++++++++++++- > 2 files changed, 24 insertions(+), 6 deletions(-) > > Index: linux-2.6/fs/xfs/xfs_iomap.c > =================================================================== > --- linux-2.6.orig/fs/xfs/xfs_iomap.c 2011-11-08 08:02:50.234386118 +0100 > +++ linux-2.6/fs/xfs/xfs_iomap.c 2011-11-08 08:14:04.319888994 +0100 > @@ -31,6 +31,7 @@ > #include "xfs_ialloc_btree.h" > #include "xfs_dinode.h" > #include "xfs_inode.h" > +#include "xfs_inode_item.h" > #include "xfs_btree.h" > #include "xfs_bmap.h" > #include "xfs_rtalloc.h" > @@ -645,6 +646,7 @@ xfs_iomap_write_unwritten( > xfs_trans_t *tp; > xfs_bmbt_irec_t imap; > xfs_bmap_free_t free_list; > + xfs_fsize_t i_size; > uint resblks; > int committed; > int error; > @@ -705,7 +707,22 @@ xfs_iomap_write_unwritten( > if (error) > goto error_on_bmapi_transaction; > > - error = xfs_bmap_finish(&(tp), &(free_list), &committed); > + /* > + * Log the updated inode size as we go. We have to be careful > + * to only log it up to the actual write offset if it is > + * halfway into a block. > + */ > + i_size = XFS_FSB_TO_B(mp, offset_fsb + count_fsb); > + if (i_size > offset + count) > + i_size = offset + count; > + I'm missing something here. Why wouldn't you just i_size = xfs_new_eof(ip, offset + count); It's not clear to me why offset_fsb and count_fsb should be involved in this calculation. Can you enlighten me? Thanks, Ben > + i_size = xfs_new_eof(ip, i_size); > + if (i_size) { > + ip->i_d.di_size = i_size; > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > + } > + > + error = xfs_bmap_finish(&tp, &free_list, &committed); > if (error) > goto error_on_bmapi_transaction; > > Index: linux-2.6/fs/xfs/xfs_aops.c > =================================================================== > --- linux-2.6.orig/fs/xfs/xfs_aops.c 2011-11-08 08:12:31.586400976 +0100 > +++ linux-2.6/fs/xfs/xfs_aops.c 2011-11-08 08:14:04.319888994 +0100 > @@ -183,13 +183,14 @@ xfs_end_io( > ioend->io_error = -error; > goto done; > } > + } else { > + /* > + * We might have to update the on-disk file size after > + * extending writes. > + */ > + xfs_setfilesize(ioend); > } > > - /* > - * We might have to update the on-disk file size after extending > - * writes. > - */ > - xfs_setfilesize(ioend); > done: > xfs_destroy_ioend(ioend); > } > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs