All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Elder <elder@inktank.com>
To: ceph-devel@vger.kernel.org
Subject: [PATCH 4/7] ceph: only set message data pointers if non-empty
Date: Sat, 09 Mar 2013 10:03:09 -0600	[thread overview]
Message-ID: <513B5D3D.6020200@inktank.com> (raw)
In-Reply-To: <513B5CAF.4010702@inktank.com>

Change it so we only assign outgoing data information for
messages if there is outgoing data to send.

This then allows us to add a few more (currently commented-out)
assertions.

This is related to:
    http://tracker.ceph.com/issues/4284

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
---
 fs/ceph/mds_client.c  |   13 ++++++++++---
 net/ceph/messenger.c  |    4 ++++
 net/ceph/osd_client.c |    9 ++++++---
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index ae9438f..4bef0ab 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -1721,7 +1721,11 @@ static struct ceph_msg
*create_request_message(struct ceph_mds_client *mdsc,
 	msg->front.iov_len = p - msg->front.iov_base;
 	msg->hdr.front_len = cpu_to_le32(msg->front.iov_len);

-	ceph_msg_data_set_pages(msg, req->r_pages, req->r_data_len, 0);
+	if (req->r_data_len) {
+		/* outbound data set only by ceph_sync_setxattr() */
+		BUG_ON(!req->r_pages);
+		ceph_msg_data_set_pages(msg, req->r_pages, req->r_data_len, 0);
+	}

 	msg->hdr.data_len = cpu_to_le32(req->r_data_len);
 	msg->hdr.data_off = cpu_to_le16(0);
@@ -2603,10 +2607,13 @@ static void send_mds_reconnect(struct
ceph_mds_client *mdsc,
 			goto fail;
 	}

-	ceph_msg_data_set_pagelist(reply, pagelist);
 	if (recon_state.flock)
 		reply->hdr.version = cpu_to_le16(2);
-	reply->hdr.data_len = cpu_to_le32(pagelist->length);
+	if (pagelist->length) {
+		/* set up outbound data if we have any */
+		reply->hdr.data_len = cpu_to_le32(pagelist->length);
+		ceph_msg_data_set_pagelist(reply, pagelist);
+	}
 	ceph_con_send(&session->s_con, reply);

 	mutex_unlock(&session->s_mutex);
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index d118353..1965d78 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -2692,6 +2692,8 @@ EXPORT_SYMBOL(ceph_con_keepalive);
 void ceph_msg_data_set_pages(struct ceph_msg *msg, struct page **pages,
 		size_t length, size_t alignment)
 {
+	/* BUG_ON(!pages); */
+	/* BUG_ON(!length); */
 	/* BUG_ON(msg->pages); */
 	/* BUG_ON(msg->page_count); */

@@ -2705,6 +2707,7 @@ void ceph_msg_data_set_pagelist(struct ceph_msg *msg,
 				struct ceph_pagelist *pagelist)
 {
 	/* BUG_ON(!pagelist); */
+	/* BUG_ON(!pagelist->length); */
 	/* BUG_ON(msg->pagelist); */

 	msg->pagelist = pagelist;
@@ -2723,6 +2726,7 @@ EXPORT_SYMBOL(ceph_msg_data_set_bio);
 void ceph_msg_data_set_trail(struct ceph_msg *msg, struct ceph_pagelist
*trail)
 {
 	/* BUG_ON(!trail); */
+	/* BUG_ON(!trail->length); */
 	/* BUG_ON(msg->trail); */

 	msg->trail = trail;
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 387e312..4402e91 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -1759,8 +1759,10 @@ int ceph_osdc_start_request(struct
ceph_osd_client *osdc,
 	osd_data = &req->r_data_out;
 	if (osd_data->type == CEPH_OSD_DATA_TYPE_PAGES) {
 		BUG_ON(osd_data->length > (u64) SIZE_MAX);
-		ceph_msg_data_set_pages(req->r_request, osd_data->pages,
-			osd_data->length, osd_data->alignment);
+		if (osd_data->length)
+			ceph_msg_data_set_pages(req->r_request,
+				osd_data->pages, osd_data->length,
+				osd_data->alignment);
 #ifdef CONFIG_BLOCK
 	} else if (osd_data->type == CEPH_OSD_DATA_TYPE_BIO) {
 		ceph_msg_data_set_bio(req->r_request, osd_data->bio);
@@ -1768,7 +1770,8 @@ int ceph_osdc_start_request(struct ceph_osd_client
*osdc,
 	} else {
 		BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_NONE);
 	}
-	ceph_msg_data_set_trail(req->r_request, &req->r_trail);
+	if (req->r_trail.length)
+		ceph_msg_data_set_trail(req->r_request, &req->r_trail);

 	register_request(osdc, req);

-- 
1.7.9.5


  parent reply	other threads:[~2013-03-09 16:03 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-09 16:00 [PATCH 0/7, v2] libceph: abstract message data information Alex Elder
2013-03-09 16:02 ` [PATCH 1/7] libceph: isolate message page field manipulation Alex Elder
2013-03-09 16:02 ` [PATCH 2/7] libceph: set page info with byte length Alex Elder
2013-03-09 16:02 ` [PATCH 3/7] libceph: isolate other message data fields Alex Elder
2013-03-09 16:03 ` Alex Elder [this message]
2013-03-09 16:03 ` [PATCH 5/7] libceph: record message data byte length Alex Elder
2013-03-09 16:03 ` [PATCH 6/7] libceph: set response data fields earlier Alex Elder
2013-03-09 16:03 ` [PATCH 7/7] libceph: activate message data assignment checks Alex Elder
2013-03-09 16:14 ` [PATCH 0/7, v2] libceph: abstract message data information Alex Elder
2013-03-11 19:03 ` 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=513B5D3D.6020200@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.