aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-12-10 03:42:18 -0500
committerAlex Elder <aelder@sgi.com>2010-12-16 17:05:44 -0500
commit6ac7248ec5f20cb44a063d7c7191b8e0068b5a28 (patch)
tree26e43646609e98d52d89ae7f4eecbf994b42cf43 /fs
parent221cb2517e8fc9a1d67c7a8a9c19fc5a916b583f (diff)
xfs: a few small tweaks for overwrites in xfs_vm_writepage
Don't trylock the buffer. We are the only one ever locking it for a regular file address space, and trylock was only copied from the generic code which did it due to the old buffer based writeout in jbd. Also make sure to only write out the buffer if the iomap actually is valid, because we wouldn't have a proper mapping otherwise. In practice we will never get an invalid mapping here as the page lock guarantees truncate doesn't race with us, but better be safe than sorry. Also make sure we allocate a new ioend when crossing boundaries between mappings, just like we do for delalloc and unwritten extents. Again this currently doesn't matter as the I/O end handler only cares for the boundaries for unwritten extents, but this makes the code fully correct and the same as for delalloc/unwritten extents. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/xfs/linux-2.6/xfs_aops.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
index ca67ae92c23..1ace78bfbea 100644
--- a/fs/xfs/linux-2.6/xfs_aops.c
+++ b/fs/xfs/linux-2.6/xfs_aops.c
@@ -1051,6 +1051,8 @@ xfs_vm_writepage(
1051 type = IO_NEW; 1051 type = IO_NEW;
1052 1052
1053 do { 1053 do {
1054 int new_ioend = 0;
1055
1054 if (offset >= end_offset) 1056 if (offset >= end_offset)
1055 break; 1057 break;
1056 if (!buffer_uptodate(bh)) 1058 if (!buffer_uptodate(bh))
@@ -1071,8 +1073,6 @@ xfs_vm_writepage(
1071 imap_valid = xfs_imap_valid(inode, &imap, offset); 1073 imap_valid = xfs_imap_valid(inode, &imap, offset);
1072 1074
1073 if (buffer_unwritten(bh) || buffer_delay(bh)) { 1075 if (buffer_unwritten(bh) || buffer_delay(bh)) {
1074 int new_ioend = 0;
1075
1076 if (buffer_unwritten(bh)) { 1076 if (buffer_unwritten(bh)) {
1077 if (type != IO_UNWRITTEN) { 1077 if (type != IO_UNWRITTEN) {
1078 type = IO_UNWRITTEN; 1078 type = IO_UNWRITTEN;
@@ -1124,6 +1124,7 @@ xfs_vm_writepage(
1124 imap_valid = 0; 1124 imap_valid = 0;
1125 } 1125 }
1126 if (!imap_valid) { 1126 if (!imap_valid) {
1127 new_ioend = 1;
1127 size = xfs_probe_cluster(inode, page, bh, head); 1128 size = xfs_probe_cluster(inode, page, bh, head);
1128 err = xfs_map_blocks(inode, offset, size, 1129 err = xfs_map_blocks(inode, offset, size,
1129 &imap, flags); 1130 &imap, flags);
@@ -1142,14 +1143,12 @@ xfs_vm_writepage(
1142 * that we are writing into for the first time. 1143 * that we are writing into for the first time.
1143 */ 1144 */
1144 type = IO_NEW; 1145 type = IO_NEW;
1145 if (trylock_buffer(bh)) { 1146 if (imap_valid) {
1146 if (imap_valid) 1147 all_bh = 1;
1147 all_bh = 1; 1148 lock_buffer(bh);
1148 xfs_add_to_ioend(inode, bh, offset, type, 1149 xfs_add_to_ioend(inode, bh, offset, type,
1149 &ioend, !imap_valid); 1150 &ioend, new_ioend);
1150 count++; 1151 count++;
1151 } else {
1152 imap_valid = 0;
1153 } 1152 }
1154 } else if (PageUptodate(page)) { 1153 } else if (PageUptodate(page)) {
1155 ASSERT(buffer_mapped(bh)); 1154 ASSERT(buffer_mapped(bh));