Commit d5cb48aa authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Nathan Scott

[XFS] consolidate some code in xfs_page_state_convert The unmapped buffer

case is very similar to delayed and unwritten extends. Reorganize the code
to share some code for these cases.

SGI-PV: 947118
SGI-Modid: xfs-linux-melb:xfs-kern:203827a
Signed-off-by: default avatarChristoph Hellwig <hch@sgi.com>
Signed-off-by: default avatarNathan Scott <nathans@sgi.com>
parent 9260dc6b
...@@ -806,7 +806,8 @@ xfs_page_state_convert( ...@@ -806,7 +806,8 @@ xfs_page_state_convert(
unsigned int type; unsigned int type;
__uint64_t end_offset; __uint64_t end_offset;
pgoff_t end_index, last_index, tlast; pgoff_t end_index, last_index, tlast;
int flags, len, err, iomap_valid = 0, uptodate = 1; ssize_t size, len;
int flags, err, iomap_valid = 0, uptodate = 1;
int page_dirty, count = 0, trylock_flag = 0; int page_dirty, count = 0, trylock_flag = 0;
/* wait for other IO threads? */ /* wait for other IO threads? */
...@@ -875,21 +876,36 @@ xfs_page_state_convert( ...@@ -875,21 +876,36 @@ xfs_page_state_convert(
* *
* Second case, allocate space for a delalloc buffer. * Second case, allocate space for a delalloc buffer.
* We can return EAGAIN here in the release page case. * We can return EAGAIN here in the release page case.
*/ *
if (buffer_unwritten(bh) || buffer_delay(bh)) { * Third case, an unmapped buffer was found, and we are
* in a path where we need to write the whole page out.
*/
if (buffer_unwritten(bh) || buffer_delay(bh) ||
((buffer_uptodate(bh) || PageUptodate(page)) &&
!buffer_mapped(bh) && (unmapped || startio))) {
if (buffer_unwritten(bh)) { if (buffer_unwritten(bh)) {
type = IOMAP_UNWRITTEN; type = IOMAP_UNWRITTEN;
flags = BMAPI_WRITE|BMAPI_IGNSTATE; flags = BMAPI_WRITE|BMAPI_IGNSTATE;
} else { } else if (buffer_delay(bh)) {
type = IOMAP_DELAY; type = IOMAP_DELAY;
flags = BMAPI_ALLOCATE; flags = BMAPI_ALLOCATE;
if (!startio) if (!startio)
flags |= trylock_flag; flags |= trylock_flag;
} else {
type = 0;
flags = BMAPI_WRITE|BMAPI_MMAP;
} }
if (!iomap_valid) { if (!iomap_valid) {
err = xfs_map_blocks(inode, offset, len, &iomap, if (type == 0) {
flags); size = xfs_probe_unmapped_cluster(inode,
page, bh, head);
} else {
size = len;
}
err = xfs_map_blocks(inode, offset, size,
&iomap, flags);
if (err) if (err)
goto error; goto error;
iomap_valid = xfs_iomap_valid(&iomap, offset); iomap_valid = xfs_iomap_valid(&iomap, offset);
...@@ -909,61 +925,22 @@ xfs_page_state_convert( ...@@ -909,61 +925,22 @@ xfs_page_state_convert(
page_dirty--; page_dirty--;
count++; count++;
} }
} else if ((buffer_uptodate(bh) || PageUptodate(page)) && } else if (buffer_uptodate(bh) && startio) {
(unmapped || startio)) {
type = 0; type = 0;
if (!buffer_mapped(bh)) {
if (!test_and_set_bit(BH_Lock, &bh->b_state)) {
/* ASSERT(buffer_mapped(bh));
* Getting here implies an unmapped buffer xfs_add_to_ioend(inode,
* was found, and we are in a path where we bh, p_offset, type,
* need to write the whole page out. &ioend, !iomap_valid);
*/ page_dirty--;
if (!iomap_valid) { count++;
int size;
size = xfs_probe_unmapped_cluster(
inode, page, bh, head);
err = xfs_map_blocks(inode, offset,
size, &iomap,
BMAPI_WRITE|BMAPI_MMAP);
if (err)
goto error;
iomap_valid = xfs_iomap_valid(&iomap,
offset);
}
if (iomap_valid) {
xfs_map_at_offset(bh, offset,
inode->i_blkbits,
&iomap);
if (startio) {
xfs_add_to_ioend(inode,
bh, p_offset, type,
&ioend, !iomap_valid);
} else {
set_buffer_dirty(bh);
unlock_buffer(bh);
mark_buffer_dirty(bh);
}
page_dirty--;
count++;
}
} else if (startio) {
if (buffer_uptodate(bh) &&
!test_and_set_bit(BH_Lock, &bh->b_state)) {
ASSERT(buffer_mapped(bh));
xfs_add_to_ioend(inode,
bh, p_offset, type,
&ioend, !iomap_valid);
page_dirty--;
count++;
} else {
iomap_valid = 0;
}
} else { } else {
iomap_valid = 0; iomap_valid = 0;
} }
} else if ((buffer_uptodate(bh) || PageUptodate(page)) &&
(unmapped || startio)) {
iomap_valid = 0;
} }
if (!iohead) if (!iohead)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment