summaryrefslogtreecommitdiffstats
path: root/fs/xfs/linux-2.6
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-12-10 09:42:18 +0100
committerAlex Elder <aelder@sgi.com>2010-12-16 23:05:44 +0100
commit6ac7248ec5f20cb44a063d7c7191b8e0068b5a28 (patch)
tree26e43646609e98d52d89ae7f4eecbf994b42cf43 /fs/xfs/linux-2.6
parentxfs: remove some dead bio handling code (diff)
downloadlinux-6ac7248ec5f20cb44a063d7c7191b8e0068b5a28.tar.xz
linux-6ac7248ec5f20cb44a063d7c7191b8e0068b5a28.zip
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/xfs/linux-2.6')
-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 ca67ae92c238..1ace78bfbea7 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(
type = IO_NEW;
do {
+ int new_ioend = 0;
+
if (offset >= end_offset)
break;
if (!buffer_uptodate(bh))
@@ -1071,8 +1073,6 @@ xfs_vm_writepage(
imap_valid = xfs_imap_valid(inode, &imap, offset);
if (buffer_unwritten(bh) || buffer_delay(bh)) {
- int new_ioend = 0;
-
if (buffer_unwritten(bh)) {
if (type != IO_UNWRITTEN) {
type = IO_UNWRITTEN;
@@ -1124,6 +1124,7 @@ xfs_vm_writepage(
imap_valid = 0;
}
if (!imap_valid) {
+ new_ioend = 1;
size = xfs_probe_cluster(inode, page, bh, head);
err = xfs_map_blocks(inode, offset, size,
&imap, flags);
@@ -1142,14 +1143,12 @@ xfs_vm_writepage(
* that we are writing into for the first time.
*/
type = IO_NEW;
- if (trylock_buffer(bh)) {
- if (imap_valid)
- all_bh = 1;
+ if (imap_valid) {
+ all_bh = 1;
+ lock_buffer(bh);
xfs_add_to_ioend(inode, bh, offset, type,
- &ioend, !imap_valid);
+ &ioend, new_ioend);
count++;
- } else {
- imap_valid = 0;
}
} else if (PageUptodate(page)) {
ASSERT(buffer_mapped(bh));