All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Elder <elder@inktank.com>
To: "ceph-devel@vger.kernel.org" <ceph-devel@vger.kernel.org>
Subject: [PATCH 4/4] libceph: isolate other message data fields
Date: Mon, 25 Feb 2013 17:42:53 -0600	[thread overview]
Message-ID: <512BF6FD.6010708@inktank.com> (raw)
In-Reply-To: <512BF683.5050905@inktank.com>

Define ceph_msg_data_set_pagelist(), ceph_msg_data_set_bio(), and
ceph_msg_data_set_trail() to clearly abstract the assignment the
remaining data-related fields in a ceph message structure.  These
fields should never be used more than once; add BUG_ON() calls to
guarantee this.  Use the new functions in the osd client and mds
client.

Signed-off-by: Alex Elder <elder@inktank.com>
---
 fs/ceph/mds_client.c           |    4 ++--
 include/linux/ceph/messenger.h |    6 ++++++
 net/ceph/messenger.c           |   28 ++++++++++++++++++++++++++++
 net/ceph/osd_client.c          |    6 +++---
 4 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index d8842a1..c0eb44d 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -2599,8 +2599,8 @@ static void send_mds_reconnect(struct
ceph_mds_client *mdsc,
 			goto fail;
 	}

-	reply->pagelist = pagelist;
-	reply->pagelist_count = calc_pages_for(0, pagelist->length);
+	ceph_msg_data_set_pagelist(reply, pagelist,
+				calc_pages_for(0, pagelist->length));
 	if (recon_state.flock)
 		reply->hdr.version = cpu_to_le16(2);
 	reply->hdr.data_len = cpu_to_le32(pagelist->length);
diff --git a/include/linux/ceph/messenger.h b/include/linux/ceph/messenger.h
index eeb28a0..3cb3e8c 100644
--- a/include/linux/ceph/messenger.h
+++ b/include/linux/ceph/messenger.h
@@ -222,6 +222,12 @@ extern void ceph_con_keepalive(struct
ceph_connection *con);

 extern void ceph_msg_data_set_pages(struct ceph_msg *msg, struct page
**pages,
 				unsigned int page_count, size_t alignment);
+extern void ceph_msg_data_set_pagelist(struct ceph_msg *msg,
+				struct ceph_pagelist *pagelist,
+				unsigned int page_count);
+extern void ceph_msg_data_set_bio(struct ceph_msg *msg, struct bio *bio);
+extern void ceph_msg_data_set_trail(struct ceph_msg *msg,
+				struct ceph_pagelist *trail);

 extern struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
 				     bool can_fail);
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 7328e1b..82e3212 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -2687,6 +2687,34 @@ void ceph_msg_data_set_pages(struct ceph_msg
*msg, struct page **pages,
 }
 EXPORT_SYMBOL(ceph_msg_data_set_pages);

+void ceph_msg_data_set_pagelist(struct ceph_msg *msg,
+				struct ceph_pagelist *pagelist,
+				unsigned int pagelist_count)
+{
+	BUG_ON(msg->pagelist);
+	BUG_ON(msg->pagelist_count);
+
+	msg->pagelist = pagelist;
+	msg->pagelist_count = pagelist_count;
+}
+EXPORT_SYMBOL(ceph_msg_data_set_pagelist);
+
+void ceph_msg_data_set_bio(struct ceph_msg *msg, struct bio *bio)
+{
+	BUG_ON(msg->bio);
+
+	msg->bio = bio;
+}
+EXPORT_SYMBOL(ceph_msg_data_set_bio);
+
+void ceph_msg_data_set_trail(struct ceph_msg *msg, struct ceph_pagelist
*trail)
+{
+	BUG_ON(msg->trail);
+
+	msg->trail = trail;
+}
+EXPORT_SYMBOL(ceph_msg_data_set_trail);
+
 /*
  * construct a new message with given type, size
  * the new msg has a ref count of 1.
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 0f8351d..f984500 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1632,9 +1632,9 @@ int ceph_osdc_start_request(struct ceph_osd_client
*osdc,
 	ceph_msg_data_set_pages(req->r_request, req->r_pages, req->r_num_pages,
 				req->r_page_alignment);
 #ifdef CONFIG_BLOCK
-	req->r_request->bio = req->r_bio;
+	ceph_msg_data_set_bio(req->r_request, req->r_bio);
 #endif
-	req->r_request->trail = &req->r_trail;
+	ceph_msg_data_set_trail(req->r_request, &req->r_trail);

 	register_request(osdc, req);

@@ -1984,7 +1984,7 @@ static struct ceph_msg *get_reply(struct
ceph_connection *con,
 		ceph_msg_data_set_pages(m, req->r_pages, req->r_num_pages,
 					req->r_page_alignment);
 #ifdef CONFIG_BLOCK
-		m->bio = req->r_bio;
+		ceph_msg_data_set_bio(m, req->r_bio);
 #endif
 	}
 	*skip = 0;
-- 
1.7.9.5


  parent reply	other threads:[~2013-02-25 23:42 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-25 23:40 [PATCH 0/4] libceph: abstract setting message data info Alex Elder
2013-02-25 23:42 ` [PATCH 1/4] libceph: distinguish page array and pagelist count Alex Elder
2013-02-25 23:42 ` [PATCH 2/4] libceph: set page alignment in start_request() Alex Elder
2013-02-25 23:42 ` [PATCH 3/4] libceph: isolate message page field manipulation Alex Elder
2013-02-25 23:42 ` Alex Elder [this message]
2013-02-26 18:39 ` [PATCH 0/4] libceph: abstract setting message data info Josh Durgin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=512BF6FD.6010708@inktank.com \
    --to=elder@inktank.com \
    --cc=ceph-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.