Commit fa589aca authored by Sam Edwards's avatar Sam Edwards Committed by Ilya Dryomov
Browse files

ceph: remove error return from ceph_process_folio_batch()



Following an earlier commit, ceph_process_folio_batch() no longer
returns errors because the writeback loop cannot handle them.

Since this function already indicates failure to lock any pages by
leaving `ceph_wbc.locked_pages == 0`, and the writeback loop has no way
to handle abandonment of a locked batch, change the return type of
ceph_process_folio_batch() to `void` and remove the pathological goto in
the writeback loop. The lack of a return code emphasizes that
ceph_process_folio_batch() is designed to be abort-free: that is, once
it commits a folio for writeback, it will not later abandon it or
propagate an error for that folio. Any future changes requiring "abort"
logic should follow this invariant by cleaning up its array and
resetting ceph_wbc.locked_pages appropriately.

Signed-off-by: default avatarSam Edwards <CFSworks@gmail.com>
Reviewed-by: default avatarIlya Dryomov <idryomov@gmail.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent cac190c7
Loading
Loading
Loading
Loading
+5 −12
Original line number Diff line number Diff line
@@ -1284,7 +1284,7 @@ static inline int move_dirty_folio_in_page_array(struct address_space *mapping,
}

static
int ceph_process_folio_batch(struct address_space *mapping,
void ceph_process_folio_batch(struct address_space *mapping,
			      struct writeback_control *wbc,
			      struct ceph_writeback_ctl *ceph_wbc)
{
@@ -1293,7 +1293,7 @@ int ceph_process_folio_batch(struct address_space *mapping,
	struct ceph_client *cl = fsc->client;
	struct folio *folio = NULL;
	unsigned i;
	int rc = 0;
	int rc;

	for (i = 0; can_next_page_be_processed(ceph_wbc, i); i++) {
		folio = ceph_wbc->fbatch.folios[i];
@@ -1323,12 +1323,10 @@ int ceph_process_folio_batch(struct address_space *mapping,
		rc = ceph_check_page_before_write(mapping, wbc,
						  ceph_wbc, folio);
		if (rc == -ENODATA) {
			rc = 0;
			folio_unlock(folio);
			ceph_wbc->fbatch.folios[i] = NULL;
			continue;
		} else if (rc == -E2BIG) {
			rc = 0;
			folio_unlock(folio);
			ceph_wbc->fbatch.folios[i] = NULL;
			break;
@@ -1370,7 +1368,6 @@ int ceph_process_folio_batch(struct address_space *mapping,
		rc = move_dirty_folio_in_page_array(mapping, wbc, ceph_wbc,
				folio);
		if (rc) {
			rc = 0;
			folio_redirty_for_writepage(wbc, folio);
			folio_unlock(folio);
			break;
@@ -1381,8 +1378,6 @@ int ceph_process_folio_batch(struct address_space *mapping,
	}

	ceph_wbc->processed_in_fbatch = i;

	return rc;
}

static inline
@@ -1686,10 +1681,8 @@ static int ceph_writepages_start(struct address_space *mapping,
			break;

process_folio_batch:
		rc = ceph_process_folio_batch(mapping, wbc, &ceph_wbc);
		ceph_process_folio_batch(mapping, wbc, &ceph_wbc);
		ceph_shift_unused_folios_left(&ceph_wbc.fbatch);
		if (rc)
			goto release_folios;

		/* did we get anything? */
		if (!ceph_wbc.locked_pages)