This mod make sure that buffer in a xfs_ioend are all in the
same extent. This is actually similar to what is done in
xfs_convert_page() already.
This solve the problem of having multiple extent in one page.
With the current kernel if we have a page that look like this:
buffer content
0 empty b_state = 0
1 DATA b_state = 0x1023
2 DATA b_state = 0x1023
3 empty b_state = 0
4 empty b_state = 0
5 DATA b_state = 0x1023
6 DATA b_state = 0x1023
7 empty b_state = 0
We endup with buffer 1-4 been tag as real and 5-EOF tag as unwritten.
Instead of 1-2 real, 3-4 unwritten, 5-6 real, 7-EOF unwritten.
Signed-off-by: Alain Renaud <arenaud@xxxxxxx>
---
fs/xfs/xfs_aops.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index ae31c31..88df6cb 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -896,6 +896,7 @@ xfs_vm_writepage(
int err, imap_valid = 0, uptodate = 1;
int count = 0;
int nonblocking = 0;
+ int new_ioend = 0;
trace_xfs_writepage(inode, page, 0);
@@ -947,7 +948,6 @@ xfs_vm_writepage(
nonblocking = 1;
do {
- int new_ioend = 0;
if (offset >= end_offset)
break;
@@ -962,6 +962,7 @@ xfs_vm_writepage(
*/
if (!buffer_mapped(bh) && buffer_uptodate(bh)) {
imap_valid = 0;
+ new_ioend = 1;
continue;
}
@@ -985,6 +986,7 @@ xfs_vm_writepage(
ASSERT(buffer_mapped(bh));
imap_valid = 0;
}
+ new_ioend = 1;
continue;
}
@@ -1013,6 +1015,7 @@ xfs_vm_writepage(
xfs_add_to_ioend(inode, bh, offset, type, &ioend,
new_ioend);
count++;
+ new_ioend = 0;
}
if (!iohead)
--
1.7.4.1
|