ceph: always send truncation info with read and write osd ops

This fixes a bug where the read/write ops arrive the osd after
a following truncation request.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
diff --git a/fs/ceph/ceph_fs.h b/fs/ceph/ceph_fs.h
index f3bfc3c..004aae5 100644
--- a/fs/ceph/ceph_fs.h
+++ b/fs/ceph/ceph_fs.h
@@ -38,7 +38,7 @@
 #define CEPH_OSD_PROTOCOL     8 /* cluster internal */
 #define CEPH_MDS_PROTOCOL     9 /* cluster internal */
 #define CEPH_MON_PROTOCOL     5 /* cluster internal */
-#define CEPH_OSDC_PROTOCOL   23 /* server/client */
+#define CEPH_OSDC_PROTOCOL   24 /* server/client */
 #define CEPH_MDSC_PROTOCOL   32 /* server/client */
 #define CEPH_MONC_PROTOCOL   15 /* server/client */
 
diff --git a/fs/ceph/osd_client.c b/fs/ceph/osd_client.c
index df21068..944759b 100644
--- a/fs/ceph/osd_client.c
+++ b/fs/ceph/osd_client.c
@@ -199,11 +199,9 @@
 	struct ceph_osd_request_head *head;
 	struct ceph_osd_op *op;
 	void *p;
-	int do_trunc = truncate_seq && (off + *plen > truncate_size);
-	int num_op = 1 + do_sync + do_trunc;
+	int num_op = 1 + do_sync;
 	size_t msg_size = sizeof(*head) + num_op*sizeof(*op);
 	int err, i;
-	u64 prevofs;
 
 	if (use_mempool) {
 		req = mempool_alloc(osdc->req_mempool, GFP_NOFS);
@@ -268,22 +266,14 @@
 		req->r_request->hdr.data_len = cpu_to_le32(*plen);
 		op->payload_len = cpu_to_le32(*plen);
 	}
+	op->extent.truncate_size = cpu_to_le64(truncate_size);
+	op->extent.truncate_seq = cpu_to_le32(truncate_seq);
 
 	/* fill in oid */
 	head->object_len = cpu_to_le32(req->r_oid_len);
 	memcpy(p, req->r_oid, req->r_oid_len);
 	p += req->r_oid_len;
 
-	/* additional ops */
-	if (do_trunc) {
-		op++;
-		op->op = cpu_to_le16(opcode == CEPH_OSD_OP_READ ?
-			     CEPH_OSD_OP_MASKTRUNC : CEPH_OSD_OP_SETTRUNC);
-		op->trunc.truncate_seq = cpu_to_le32(truncate_seq);
-		prevofs = le64_to_cpu((op-1)->extent.offset);
-		op->trunc.truncate_size = cpu_to_le64(truncate_size -
-						      (off-prevofs));
-	}
 	if (do_sync) {
 		op++;
 		op->op = cpu_to_le16(CEPH_OSD_OP_STARTSYNC);
diff --git a/fs/ceph/rados.h b/fs/ceph/rados.h
index c5614d4..123fd84 100644
--- a/fs/ceph/rados.h
+++ b/fs/ceph/rados.h
@@ -304,16 +304,14 @@
 	union {
 		struct {
 			__le64 offset, length;
+			__le64 truncate_size;
+			__le32 truncate_seq;
 		} __attribute__ ((packed)) extent;
 		struct {
 			__le32 name_len;
 			__le32 value_len;
 		} __attribute__ ((packed)) xattr;
 		struct {
-			__le64 truncate_size;
-			__le32 truncate_seq;
-		} __attribute__ ((packed)) trunc;
-		struct {
 			__u8 class_len;
 			__u8 method_len;
 			__u8 argc;