ceph: release all pages after successful osd write response
authorSage Weil <sage@newdream.net>
Wed, 3 Feb 2010 00:34:04 +0000 (16:34 -0800)
committerSage Weil <sage@newdream.net>
Wed, 3 Feb 2010 00:34:04 +0000 (16:34 -0800)
We release all the pages, even if the osd response was
different than the number of pages written. This could only
happen due to truncation that arrives the osd in
different order, for which we want the pages released anyway.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/addr.c

index a3bd9deb555c06960c79235ab00c78f26d6a49c6..8065dc92c61144d48c94a1ff05ead3591b0d8012 100644 (file)
@@ -524,9 +524,13 @@ static void writepages_finish(struct ceph_osd_request *req,
        bytes = le64_to_cpu(op->extent.length);
 
        if (rc >= 0) {
-               wrote = (bytes + (offset & ~PAGE_CACHE_MASK) + ~PAGE_CACHE_MASK)
-                       >> PAGE_CACHE_SHIFT;
-               WARN_ON(wrote != req->r_num_pages);
+               /*
+                * Assume we wrote the pages we originally sent.  The
+                * osd might reply with fewer pages if our writeback
+                * raced with a truncation and was adjusted at the osd,
+                * so don't believe the reply.
+                */
+               wrote = req->r_num_pages;
        } else {
                wrote = 0;
                mapping_set_error(mapping, rc);