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

Commit a54fba8f authored by Jan Kara's avatar Jan Kara Committed by Darrick J. Wong
Browse files

xfs: Move handling of missing page into one place in xfs_find_get_desired_pgoff()



Currently several places in xfs_find_get_desired_pgoff() handle the case
of a missing page. Make them all handled in one place after the loop has
terminated.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent d7fd2425
Loading
Loading
Loading
Loading
+8 −30
Original line number Original line Diff line number Diff line
@@ -1052,30 +1052,9 @@ xfs_find_get_desired_pgoff(
		want = min_t(pgoff_t, end - index, PAGEVEC_SIZE - 1) + 1;
		want = min_t(pgoff_t, end - index, PAGEVEC_SIZE - 1) + 1;
		nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index,
		nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index,
					  want);
					  want);
		/*
		if (nr_pages == 0)
		 * No page mapped into given range.  If we are searching holes
		 * and if this is the first time we got into the loop, it means
		 * that the given offset is landed in a hole, return it.
		 *
		 * If we have already stepped through some block buffers to find
		 * holes but they all contains data.  In this case, the last
		 * offset is already updated and pointed to the end of the last
		 * mapped page, if it does not reach the endpoint to search,
		 * that means there should be a hole between them.
		 */
		if (nr_pages == 0) {
			/* Data search found nothing */
			if (type == DATA_OFF)
			break;
			break;


			ASSERT(type == HOLE_OFF);
			if (lastoff == startoff || lastoff < endoff) {
				found = true;
				*offset = lastoff;
			}
			break;
		}

		for (i = 0; i < nr_pages; i++) {
		for (i = 0; i < nr_pages; i++) {
			struct page	*page = pvec.pages[i];
			struct page	*page = pvec.pages[i];
			loff_t		b_offset;
			loff_t		b_offset;
@@ -1140,21 +1119,20 @@ xfs_find_get_desired_pgoff(


		/*
		/*
		 * The number of returned pages less than our desired, search
		 * The number of returned pages less than our desired, search
		 * done.  In this case, nothing was found for searching data,
		 * done.
		 * but we found a hole behind the last offset.
		 */
		 */
		if (nr_pages < want) {
		if (nr_pages < want)
			if (type == HOLE_OFF) {
				*offset = lastoff;
				found = true;
			}
			break;
			break;
		}


		index = pvec.pages[i - 1]->index + 1;
		index = pvec.pages[i - 1]->index + 1;
		pagevec_release(&pvec);
		pagevec_release(&pvec);
	} while (index <= end);
	} while (index <= end);


	/* No page at lastoff and we are not done - we found a hole. */
	if (type == HOLE_OFF && lastoff < endoff) {
		*offset = lastoff;
		found = true;
	}
out:
out:
	pagevec_release(&pvec);
	pagevec_release(&pvec);
	return found;
	return found;