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

Commit e63dc5c7 authored by Yehuda Sadeh's avatar Yehuda Sadeh Committed by Sage Weil
Browse files

ceph: remove page upon writeback completion if lost cache cap



This page should have been removed earlier when the cache cap was
revoked, but a writeback was in flight, so it was skipped. We truncate
it here just as the writeback finishes, while it's still locked.

Signed-off-by: default avatarYehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 5ecad6fd
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -514,6 +514,7 @@ static void writepages_finish(struct ceph_osd_request *req,
	u64 bytes = 0;
	struct ceph_client *client = ceph_inode_to_client(inode);
	long writeback_stat;
	unsigned issued = __ceph_caps_issued(ci, NULL);

	/* parse reply */
	replyhead = msg->front.iov_base;
@@ -559,6 +560,16 @@ static void writepages_finish(struct ceph_osd_request *req,
		ceph_put_snap_context(snapc);
		dout("unlocking %d %p\n", i, page);
		end_page_writeback(page);

		/*
		 * We lost the cache cap, need to truncate the page before
		 * it is unlocked, otherwise we'd truncate it later in the
		 * page truncation thread, possibly losing some data that
		 * raced its way in
		 */
		if ((issued & CEPH_CAP_FILE_CACHE) == 0)
			generic_error_remove_page(inode->i_mapping, page);

		unlock_page(page);
	}
	dout("%p wrote+cleaned %d pages\n", inode, wrote);