Skip to content

Commit

Permalink
ceph: remove page upon writeback completion if lost cache cap
Browse files Browse the repository at this point in the history
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: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
  • Loading branch information
Yehuda Sadeh authored and Sage Weil committed Feb 19, 2010
1 parent 5ecad6f commit e63dc5c
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit e63dc5c

Please sign in to comment.