xfs
[Top] [All Lists]

[PATCH 10/11] xfs: clean up end index calculation in xfs_page_state_conv

To: xfs@xxxxxxxxxxx
Subject: [PATCH 10/11] xfs: clean up end index calculation in xfs_page_state_convert
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Wed, 28 Apr 2010 08:29:00 -0400
References: <20100428122850.075189557@xxxxxxxxxxxxxxxxxxxxxx>
User-agent: quilt/0.47-1
Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: xfs/fs/xfs/linux-2.6/xfs_aops.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c        2010-04-28 12:59:52.857024355 
+0200
+++ xfs/fs/xfs/linux-2.6/xfs_aops.c     2010-04-28 12:59:54.989003542 +0200
@@ -1064,7 +1064,7 @@ xfs_page_state_convert(
        unsigned long           p_offset = 0;
        unsigned int            type;
        __uint64_t              end_offset;
-       pgoff_t                 end_index, last_index, tlast;
+       pgoff_t                 end_index, last_index;
        ssize_t                 size, len;
        int                     flags, err, imap_valid = 0, uptodate = 1;
        int                     page_dirty, count = 0;
@@ -1259,15 +1259,22 @@ xfs_page_state_convert(
                xfs_start_page_writeback(page, 1, count);
 
        if (ioend && imap_valid) {
-               struct xfs_mount        *m = XFS_I(inode)->i_mount;
-               xfs_off_t               iomap_offset = XFS_FSB_TO_B(m, 
imap.br_startoff);
-               xfs_off_t               iomap_bsize = XFS_FSB_TO_B(m, 
imap.br_blockcount);
-
-               offset = (iomap_offset + iomap_bsize - 1) >>
-                                       PAGE_CACHE_SHIFT;
-               tlast = min_t(pgoff_t, offset, last_index);
+               xfs_off_t               end_index;
+
+               end_index = imap.br_startoff + imap.br_blockcount;
+
+               /* to bytes */
+               end_index <<= inode->i_blkbits;
+
+               /* to pages */
+               end_index = (end_index - 1) >> PAGE_CACHE_SHIFT;
+
+               /* check against file size */
+               if (end_index > last_index)
+                       end_index = last_index;
+
                xfs_cluster_write(inode, page->index + 1, &imap, &ioend,
-                                       wbc, startio, all_bh, tlast);
+                                       wbc, startio, all_bh, end_index);
        }
 
        if (iohead)

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