xfs
[Top] [All Lists]

[PATCH 051/102] xfs: log file size updates as part of unwritten extent

To: xfs@xxxxxxxxxxx
Subject: [PATCH 051/102] xfs: log file size updates as part of unwritten extent
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Thu, 23 Aug 2012 15:02:09 +1000
In-reply-to: <1345698180-13612-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1345698180-13612-1-git-send-email-david@xxxxxxxxxxxxx>
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>

Upstream commit: 84803fb78237014cbbc86c0f012b273a199f4691
 conversion

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.

Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx>
Signed-off-by: Christoph Hellwig <hch@xxxxxx>
Reviewed-by: Mark Tinguely <tinguely@xxxxxxx>
Signed-off-by: Ben Myers <bpm@xxxxxxx>
---
 fs/xfs/linux-2.6/xfs_aops.c |   11 ++++++-----
 fs/xfs/xfs_iomap.c          |   19 ++++++++++++++++++-
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
index 5297866..0f33f8a 100644
--- a/fs/xfs/linux-2.6/xfs_aops.c
+++ b/fs/xfs/linux-2.6/xfs_aops.c
@@ -212,13 +212,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);
 }
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index 4460beb..9ee9467 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -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"
@@ -654,6 +655,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;
@@ -714,7 +716,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_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;
 
-- 
1.7.10

<Prev in Thread] Current Thread [Next in Thread>