From c718dd816d29896efd868671f0fe3f8b92e7b51e Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 2 Oct 2008 16:00:26 -0700 Subject: [PATCH] kclient: writepages async error handling and some cleanup --- src/kernel/addr.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/kernel/addr.c b/src/kernel/addr.c index 535c10b7c816e..72bbd1321a46e 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -463,11 +463,15 @@ static void writepages_finish(struct ceph_osd_request *req) rc = le32_to_cpu(replyhead->result); bytes = le32_to_cpu(replyhead->length); } - if (rc >= 0) + + if (rc >= 0) { wrote = (bytes + (offset & ~PAGE_CACHE_MASK) + ~PAGE_CACHE_MASK) >> PAGE_CACHE_SHIFT; - else + BUG_ON(wrote != req->r_num_pages); + } else { wrote = 0; + set_bit(AS_EIO, &mapping->flags); + } dout(10, "writepages_finish rc %d bytes %llu wrote %d (pages)\n", rc, bytes, wrote); @@ -476,22 +480,20 @@ static void writepages_finish(struct ceph_osd_request *req) page = req->r_pages[i]; BUG_ON(!page); WARN_ON(!PageUptodate(page)); - if (i < wrote) { - dout(20, "%p cleaning %p\n", inode, page); - page->private = 0; - ClearPagePrivate(page); - ceph_put_snap_context(snapc); - } else { - dout(20, "%p redirtying %p\n", inode, page); - ceph_redirty_page(mapping, page); + + if (i >= wrote) { + dout(20, "inode %p skipping page %p\n", inode, page); wbc->pages_skipped++; } + page->private = 0; + ClearPagePrivate(page); + ceph_put_snap_context(snapc); dout(50, "unlocking %d %p\n", i, page); end_page_writeback(page); unlock_page(page); } dout(20, "%p wrote+cleaned %d pages\n", inode, wrote); - ceph_put_wrbuffer_cap_refs(ci, wrote, snapc); + ceph_put_wrbuffer_cap_refs(ci, req->r_num_pages, snapc); ceph_release_pages(req->r_pages, req->r_num_pages); ceph_osdc_put_request(req); -- 2.39.5