From 452bba71563984564c661fea1914c06b61b0ed95 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Jan 2008 14:46:54 -0800 Subject: [PATCH] kernel: use le macros for msg->hdr --- src/kernel/client.c | 13 +++--- src/kernel/mds_client.c | 20 +++++----- src/kernel/messenger.c | 87 +++++++++++++++++++++++------------------ src/kernel/messenger.h | 23 ----------- src/kernel/osd_client.c | 11 +++--- 5 files changed, 74 insertions(+), 80 deletions(-) diff --git a/src/kernel/client.c b/src/kernel/client.c index 69273ca240b6e..df7e9c02131e1 100644 --- a/src/kernel/client.c +++ b/src/kernel/client.c @@ -139,7 +139,7 @@ static int open_root_inode(struct ceph_client *client, struct ceph_mount_args *a } /* fill in cap */ - frommds = rinfo.reply->hdr.src.name.num; + frommds = le32_to_cpu(rinfo.reply->hdr.src.name.num); cap = ceph_add_cap(mnt_inode, session, le32_to_cpu(rinfo.head->file_caps), le32_to_cpu(rinfo.head->file_caps_seq)); @@ -182,8 +182,8 @@ int ceph_mount(struct ceph_client *client, struct ceph_mount_args *args, struct mount_msg = ceph_msg_new(CEPH_MSG_CLIENT_MOUNT, 0, 0, 0, 0); if (IS_ERR(mount_msg)) return PTR_ERR(mount_msg); - mount_msg->hdr.dst.name.type = CEPH_ENTITY_TYPE_MON; - mount_msg->hdr.dst.name.num = which; + mount_msg->hdr.dst.name.type = cpu_to_le32(CEPH_ENTITY_TYPE_MON); + mount_msg->hdr.dst.name.num = cpu_to_le32(which); mount_msg->hdr.dst.addr = args->mon_addr[which]; ceph_msg_send(client->msgr, mount_msg, 0); @@ -232,7 +232,7 @@ static void handle_monmap(struct ceph_client *client, struct ceph_msg *msg) client->monc.monmap = new; if (first) { - client->whoami = msg->hdr.dst.name.num; + client->whoami = le32_to_cpu(msg->hdr.dst.name.num); client->msgr->inst.name = msg->hdr.dst.name; dout(1, "i am client%d\n", client->whoami); } @@ -323,9 +323,10 @@ void ceph_dispatch(void *p, struct ceph_msg *msg) { struct ceph_client *client = p; int had; + int type = le32_to_cpu(msg->hdr.type); /* deliver the message */ - switch (msg->hdr.type) { + switch (type) { /* me */ case CEPH_MSG_MON_MAP: had = client->monc.monmap->epoch ? 1:0; @@ -371,7 +372,7 @@ void ceph_dispatch(void *p, struct ceph_msg *msg) break; default: - derr(1, "dispatch unknown message type %d\n", msg->hdr.type); + derr(1, "dispatch unknown message type %d\n", type); } ceph_msg_put(msg); diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index 0ba345137234a..82bf3b6ce7990 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -42,8 +42,8 @@ const char* ceph_mds_op_name(int op) static void send_msg_mds(struct ceph_mds_client *mdsc, struct ceph_msg *msg, int mds) { msg->hdr.dst.addr = *ceph_mdsmap_get_addr(mdsc->mdsmap, mds); - msg->hdr.dst.name.type = CEPH_ENTITY_TYPE_MDS; - msg->hdr.dst.name.num = mds; + msg->hdr.dst.name.type = cpu_to_le32(CEPH_ENTITY_TYPE_MDS); + msg->hdr.dst.name.num = cpu_to_le32(mds); ceph_msg_send(mdsc->client->msgr, msg, BASE_DELAY_INTERVAL); } @@ -359,7 +359,7 @@ void ceph_mdsc_handle_session(struct ceph_mds_client *mdsc, struct ceph_msg *msg __u32 op; __u64 seq; struct ceph_mds_session *session; - int mds = msg->hdr.src.name.num; + int mds = le32_to_cpu(msg->hdr.src.name.num); struct ceph_mds_session_head *h = msg->front.iov_base; if (msg->front.iov_len != sizeof(*h)) @@ -387,7 +387,7 @@ void ceph_mdsc_handle_session(struct ceph_mds_client *mdsc, struct ceph_msg *msg unregister_session(mdsc, mds); } else { dout(1, "ignoring session close from mds%d, seq %llu < my seq %llu\n", - msg->hdr.src.name.num, seq, session->s_cap_seq); + le32_to_cpu(msg->hdr.src.name.num), seq, session->s_cap_seq); } remove_session_caps(session); complete(&mdsc->session_close_waiters); @@ -497,7 +497,8 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, struct ceph_msg *msg, int err; int mds = -1; - dout(30, "do_request on %p type %d\n", msg, msg->hdr.type); + dout(30, "do_request on %p\n", msg); + BUG_ON(le32_to_cpu(msg->hdr.type) != CEPH_MSG_CLIENT_REQUEST); req = new_request(msg, mds); @@ -808,7 +809,7 @@ void ceph_mdsc_handle_forward(struct ceph_mds_client *mdsc, struct ceph_msg *msg req->r_num_fwd = fwd_seq; req->r_resend_mds = next_mds; req->r_num_mds = 1; - req->r_mds[0] = msg->hdr.src.name.num; + req->r_mds[0] = le32_to_cpu(msg->hdr.src.name.num); } spin_unlock(&mdsc->lock); } else { @@ -957,7 +958,8 @@ retry: spin_unlock(&session->s_cap_lock); send: - reply->hdr.front_len = reply->front.iov_len = p - reply->front.iov_base; + reply->front.iov_len = p - reply->front.iov_base; + reply->hdr.front_len = cpu_to_le32(reply->front.iov_len); dout(10, "final len was %lu (guessed %d)\n", reply->front.iov_len, len); send_msg_mds(mdsc, reply, mds); @@ -1065,7 +1067,7 @@ void ceph_mdsc_handle_filecaps(struct ceph_mds_client *mdsc, struct ceph_msg *ms struct ceph_mds_session *session; struct inode *inode; struct ceph_mds_file_caps *h; - int mds = msg->hdr.src.name.num; + int mds = le32_to_cpu(msg->hdr.src.name.num); int op; u32 seq; u64 ino, size, max_size; @@ -1279,7 +1281,7 @@ void ceph_mdsc_handle_map(struct ceph_mds_client *mdsc, struct ceph_msg *msg) void *p = msg->front.iov_base; void *end = p + msg->front.iov_len; struct ceph_mdsmap *newmap, *oldmap; - int from = msg->hdr.src.name.num; + int from = le32_to_cpu(msg->hdr.src.name.num); int newstate; if ((err = ceph_decode_32(&p, end, &epoch)) != 0) diff --git a/src/kernel/messenger.c b/src/kernel/messenger.c index c7fdfd3c440fe..a1ab58f59678a 100644 --- a/src/kernel/messenger.c +++ b/src/kernel/messenger.c @@ -340,11 +340,12 @@ static int write_partial_msg_pages(struct ceph_connection *con, struct ceph_msg { struct kvec kv; int ret; + unsigned data_len = le32_to_cpu(msg->hdr.data_len); while (con->out_msg_pos.page < con->out_msg->nr_pages) { kv.iov_base = kmap(msg->pages[con->out_msg_pos.page]) + con->out_msg_pos.page_pos; kv.iov_len = min((int)(PAGE_SIZE - con->out_msg_pos.page_pos), - (int)(msg->hdr.data_len - con->out_msg_pos.data_pos)); + (int)(data_len - con->out_msg_pos.data_pos)); ret = ceph_tcp_sendmsg(con->sock, &kv, 1, kv.iov_len); if (ret < 0) return ret; if (ret == 0) return 0; /* socket full */ @@ -375,25 +376,24 @@ static void prepare_write_message(struct ceph_connection *con) con->out_msg = m; /* FIXME: do we want to take a reference here? */ /* encode header */ - ceph_encode_header(&con->out_hdr, &m->hdr); - dout(20, "prepare_write_message %p seq %lld type %d len %d+%d\n", - m, m->hdr.seq, m->hdr.type, m->hdr.front_len, m->hdr.data_len); - BUG_ON(m->hdr.front_len != m->front.iov_len); + m, le64_to_cpu(m->hdr.seq), le32_to_cpu(m->hdr.type), + le32_to_cpu(m->hdr.front_len), le32_to_cpu(m->hdr.data_len)); + BUG_ON(le32_to_cpu(m->hdr.front_len) != m->front.iov_len); /* tag + hdr + front */ con->out_kvec[0].iov_base = &tag_msg; con->out_kvec[0].iov_len = 1; - con->out_kvec[1].iov_base = &con->out_hdr; - con->out_kvec[1].iov_len = sizeof(con->out_hdr); + con->out_kvec[1].iov_base = &m->hdr; + con->out_kvec[1].iov_len = sizeof(m->hdr); con->out_kvec[2] = m->front; con->out_kvec_left = 3; - con->out_kvec_bytes = 1 + sizeof(con->out_hdr) + m->front.iov_len; + con->out_kvec_bytes = 1 + sizeof(m->hdr) + m->front.iov_len; con->out_kvec_cur = con->out_kvec; /* pages */ con->out_msg_pos.page = 0; - con->out_msg_pos.page_pos = m->hdr.data_off & ~PAGE_MASK; + con->out_msg_pos.page_pos = le32_to_cpu(m->hdr.data_off) & ~PAGE_MASK; con->out_msg_pos.data_pos = 0; set_bit(WRITE_PENDING, &con->state); @@ -593,6 +593,7 @@ static int read_message_partial(struct ceph_connection *con) void *p; int ret; int want, left; + unsigned front_len, data_len, data_off; dout(20, "read_message_partial con %p msg %p\n", con, m); @@ -602,41 +603,41 @@ static int read_message_partial(struct ceph_connection *con) ret = ceph_tcp_recvmsg(con->sock, &m->hdr + con->in_base_pos, left); if (ret <= 0) return ret; con->in_base_pos += ret; - if (con->in_base_pos == sizeof(struct ceph_msg_header)) { - /* decode/swab */ - ceph_decode_header(&m->hdr); + if (con->in_base_pos == sizeof(struct ceph_msg_header)) break; - } } /* front */ - if (m->front.iov_len < m->hdr.front_len) { + front_len = le32_to_cpu(m->hdr.front_len); + if (m->front.iov_len < front_len) { if (m->front.iov_base == NULL) { - m->front.iov_base = kmalloc(m->hdr.front_len, GFP_KERNEL); + m->front.iov_base = kmalloc(front_len, GFP_KERNEL); if (m->front.iov_base == NULL) return -ENOMEM; } - left = m->hdr.front_len - m->front.iov_len; + left = front_len - m->front.iov_len; ret = ceph_tcp_recvmsg(con->sock, (char*)m->front.iov_base + m->front.iov_len, left); if (ret <= 0) return ret; m->front.iov_len += ret; } /* (page) data */ - if (m->hdr.data_len == 0) + data_len = le32_to_cpu(m->hdr.data_len); + data_off = le32_to_cpu(m->hdr.data_off); + if (data_len == 0) goto done; if (m->nr_pages == 0) { con->in_msg_pos.page = 0; - con->in_msg_pos.page_pos = m->hdr.data_off & ~PAGE_MASK; + con->in_msg_pos.page_pos = data_off & ~PAGE_MASK; con->in_msg_pos.data_pos = 0; /* find (or alloc) pages for data payload */ - want = calc_pages_for(m->hdr.data_len, m->hdr.data_off & ~PAGE_MASK); + want = calc_pages_for(data_len, data_off & ~PAGE_MASK); ret = 0; BUG_ON(!con->msgr->prepare_pages); ret = con->msgr->prepare_pages(con->msgr->parent, m, want); if (ret < 0) { dout(10, "prepare_pages failed, skipping+discarding message\n"); - con->in_base_pos = -m->hdr.data_len; /* ignore rest of message */ + con->in_base_pos = -data_len; /* ignore rest of message */ ceph_msg_put(con->in_msg); con->in_msg = 0; con->in_tag = CEPH_MSGR_TAG_READY; @@ -648,8 +649,8 @@ static int read_message_partial(struct ceph_connection *con) * FIXME: we should discard the data payload if ret */ } - while (con->in_msg_pos.data_pos < m->hdr.data_len) { - left = min((int)(m->hdr.data_len - con->in_msg_pos.data_pos), + while (con->in_msg_pos.data_pos < data_len) { + left = min((int)(data_len - con->in_msg_pos.data_pos), (int)(PAGE_SIZE - con->in_msg_pos.page_pos)); /*dout(10, "data_pos = %d, data_len = %d, page_pos=%d left = %d\n", con->in_msg_pos.data_pos, m->hdr.data_len, con->in_msg_pos.page_pos, left);*/ @@ -710,10 +711,14 @@ static int read_ack_partial(struct ceph_connection *con) static void process_ack(struct ceph_connection *con, __u32 ack) { struct ceph_msg *m; + __u64 seq; while (!list_empty(&con->out_sent)) { m = list_entry(con->out_sent.next, struct ceph_msg, list_head); - if (m->hdr.seq > ack) break; - dout(5, "got ack for seq %llu type %d at %p\n", m->hdr.seq, m->hdr.type, m); + seq = le64_to_cpu(m->hdr.seq); + if (seq > ack) + break; + dout(5, "got ack for seq %llu type %d at %p\n", seq, + le32_to_cpu(m->hdr.type), m); list_del(&m->list_head); ceph_msg_put(m); } @@ -945,9 +950,12 @@ more: if (ret <= 0) goto done; dout(1, "===== %p from %s%d %d=%s len %d+%d =====\n", con->in_msg, - ceph_name_type_str(con->in_msg->hdr.src.name.type), con->in_msg->hdr.src.name.num, - con->in_msg->hdr.type, ceph_msg_type_name(con->in_msg->hdr.type), - con->in_msg->hdr.front_len, con->in_msg->hdr.data_len); + ceph_name_type_str(le32_to_cpu(con->in_msg->hdr.src.name.type)), + le32_to_cpu(con->in_msg->hdr.src.name.num), + le32_to_cpu(con->in_msg->hdr.type), + ceph_msg_type_name(le32_to_cpu(con->in_msg->hdr.type)), + le32_to_cpu(con->in_msg->hdr.front_len), + le32_to_cpu(con->in_msg->hdr.data_len)); msgr->dispatch(con->msgr->parent, con->in_msg); /* fixme: use a workqueue */ con->in_msg = 0; con->in_tag = CEPH_MSGR_TAG_READY; @@ -1153,13 +1161,18 @@ int ceph_msg_send(struct ceph_messenger *msgr, struct ceph_msg *msg, unsigned lo /* queue */ spin_lock(&con->out_queue_lock); - msg->hdr.seq = ++con->out_seq; + msg->hdr.seq = cpu_to_le64(++con->out_seq); dout(1, "----- %p to %s%d %d=%s len %d+%d -----\n", msg, - ceph_name_type_str(msg->hdr.dst.name.type), msg->hdr.dst.name.num, - msg->hdr.type, ceph_msg_type_name(msg->hdr.type), - msg->hdr.front_len, msg->hdr.data_len); - dout(2, "ceph_msg_send queuing %p seq %llu for %s%d on %p\n", msg, msg->hdr.seq, - ceph_name_type_str(msg->hdr.dst.name.type), msg->hdr.dst.name.num, con); + ceph_name_type_str(le32_to_cpu(msg->hdr.dst.name.type)), + le32_to_cpu(msg->hdr.dst.name.num), + le32_to_cpu(msg->hdr.type), + ceph_msg_type_name(le32_to_cpu(msg->hdr.type)), + le32_to_cpu(msg->hdr.front_len), + le32_to_cpu(msg->hdr.data_len)); + dout(2, "ceph_msg_send queuing %p seq %llu for %s%d on %p\n", msg, + le64_to_cpu(msg->hdr.seq), + ceph_name_type_str(le32_to_cpu(msg->hdr.dst.name.type)), + le32_to_cpu(msg->hdr.dst.name.num), con); ceph_msg_get(msg); list_add_tail(&msg->list_head, &con->out_queue); spin_unlock(&con->out_queue_lock); @@ -1184,10 +1197,10 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, int page_len, int page_of if (m == NULL) goto out; atomic_set(&m->nref, 1); - m->hdr.type = type; - m->hdr.front_len = front_len; - m->hdr.data_len = page_len; - m->hdr.data_off = page_off; + m->hdr.type = cpu_to_le32(type); + m->hdr.front_len = cpu_to_le32(front_len); + m->hdr.data_len = cpu_to_le32(page_len); + m->hdr.data_off = cpu_to_le32(page_off); /* front */ if (front_len) { diff --git a/src/kernel/messenger.h b/src/kernel/messenger.h index bf230912c07cd..859058af78508 100644 --- a/src/kernel/messenger.h +++ b/src/kernel/messenger.h @@ -93,7 +93,6 @@ struct ceph_connection { struct list_head out_queue; struct list_head out_sent; /* sending/sent but unacked; resend if connection drops */ - struct ceph_msg_header out_hdr; struct ceph_entity_addr out_addr; __le32 out32; struct kvec out_kvec[4], @@ -206,28 +205,6 @@ static __inline__ void ceph_encode_inst(struct ceph_entity_inst *to, struct ceph ceph_encode_addr(&to->addr, &from->addr); } -static __inline__ void ceph_encode_header(struct ceph_msg_header *to, struct ceph_msg_header *from) -{ - to->seq = cpu_to_le32(from->seq); - to->type = cpu_to_le32(from->type); - ceph_encode_inst(&to->src, &from->src); - ceph_encode_inst(&to->dst, &from->dst); - to->front_len = cpu_to_le32(from->front_len); - to->data_off = cpu_to_le32(from->data_off); - to->data_len = cpu_to_le32(from->data_len); -} -static __inline__ void ceph_decode_header(struct ceph_msg_header *to) -{ - to->seq = cpu_to_le32(to->seq); - to->type = cpu_to_le32(to->type); - ceph_decode_inst(&to->src); - ceph_decode_inst(&to->dst); - to->front_len = cpu_to_le32(to->front_len); - to->data_off = cpu_to_le32(to->data_off); - to->data_len = cpu_to_le32(to->data_len); -} - - static __inline__ int ceph_encode_64(void **p, void *end, __u64 v) { BUG_ON(*p + sizeof(v) > end); *(__u64*)*p = cpu_to_le64(v); diff --git a/src/kernel/osd_client.c b/src/kernel/osd_client.c index e3525476bfbdc..09e147db347ff 100644 --- a/src/kernel/osd_client.c +++ b/src/kernel/osd_client.c @@ -201,8 +201,8 @@ static void send_request(struct ceph_osd_client *osdc, struct ceph_osd_request * } if (i < nr_osds) { dout(10, "send_request %p tid %llu to osd%d flags %d\n", req, req->r_tid, osds[i], req->r_flags); - req->r_request->hdr.dst.name.type = CEPH_ENTITY_TYPE_OSD; - req->r_request->hdr.dst.name.num = osds[i]; + req->r_request->hdr.dst.name.type = cpu_to_le32(CEPH_ENTITY_TYPE_OSD); + req->r_request->hdr.dst.name.num = cpu_to_le32(osds[i]); req->r_request->hdr.dst.addr = osdc->osdmap->osd_addr[osds[i]]; ceph_msg_get(req->r_request); /* send consumes a ref */ ceph_msg_send(osdc->client->msgr, req->r_request, 0); @@ -268,9 +268,10 @@ int ceph_osdc_prepare_pages(void *p, struct ceph_msg *m, int want) struct ceph_osd_request *req; __u64 tid; int ret = -1; + int type = le32_to_cpu(m->hdr.type); dout(10, "prepare_pages on msg %p want %d\n", m, want); - if (unlikely(le32_to_cpu(m->hdr.type) != CEPH_MSG_OSD_OPREPLY)) + if (unlikely(type != CEPH_MSG_OSD_OPREPLY)) return -1; /* hmm! */ tid = le64_to_cpu(rhead->tid); @@ -504,8 +505,8 @@ int ceph_osdc_silly_write(struct ceph_osd_client *osdc, ceph_ino_t ino, } req->r_request->pages = req->r_pages; req->r_request->nr_pages = req->r_nr_pages; - req->r_request->hdr.data_len = len; - req->r_request->hdr.data_off = off; + req->r_request->hdr.data_len = cpu_to_le32(len); + req->r_request->hdr.data_off = cpu_to_le32(off); reqhead->osdmap_epoch = osdc->osdmap->epoch; send_request(osdc, req); -- 2.39.5