Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+34 −57
Original line number Diff line number Diff line
@@ -806,7 +806,8 @@ xfs_page_state_convert(
	unsigned int		type;
	__uint64_t              end_offset;
	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;

	/* wait for other IO threads? */
@@ -875,21 +876,36 @@ xfs_page_state_convert(
		 *
		 * Second case, allocate space for a delalloc buffer.
		 * We can return EAGAIN here in the release page case.
		 *
		 * 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)) {
		if (buffer_unwritten(bh) || buffer_delay(bh) ||
		    ((buffer_uptodate(bh) || PageUptodate(page)) &&
		     !buffer_mapped(bh) && (unmapped || startio))) {
			if (buffer_unwritten(bh)) {
				type = IOMAP_UNWRITTEN;
				flags = BMAPI_WRITE|BMAPI_IGNSTATE;
			} else {
			} else if (buffer_delay(bh)) {
				type = IOMAP_DELAY;
				flags = BMAPI_ALLOCATE;
				if (!startio)
					flags |= trylock_flag;
			} else {
				type = 0;
				flags = BMAPI_WRITE|BMAPI_MMAP;
			}

			if (!iomap_valid) {
				err = xfs_map_blocks(inode, offset, len, &iomap,
						flags);
				if (type == 0) {
					size = xfs_probe_unmapped_cluster(inode,
							page, bh, head);
				} else {
					size = len;
				}

				err = xfs_map_blocks(inode, offset, size,
						&iomap, flags);
				if (err)
					goto error;
				iomap_valid = xfs_iomap_valid(&iomap, offset);
@@ -909,49 +925,10 @@ xfs_page_state_convert(
				page_dirty--;
				count++;
			}
		} else if ((buffer_uptodate(bh) || PageUptodate(page)) &&
			   (unmapped || startio)) {

		} else if (buffer_uptodate(bh) && startio) {
			type = 0;
			if (!buffer_mapped(bh)) {

				/*
				 * Getting here implies an unmapped buffer
				 * was found, and we are in a path where we
				 * need to write the whole page out.
				 */
				if (!iomap_valid) {
					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)) {
			if (!test_and_set_bit(BH_Lock, &bh->b_state)) {
				ASSERT(buffer_mapped(bh));
				xfs_add_to_ioend(inode,
						bh, p_offset, type,
@@ -961,10 +938,10 @@ xfs_page_state_convert(
			} else {
				iomap_valid = 0;
			}
			} else {
		} else if ((buffer_uptodate(bh) || PageUptodate(page)) &&
			   (unmapped || startio)) {
			iomap_valid = 0;
		}
		}

		if (!iohead)
			iohead = ioend;