libceph: make message data be a pointer

Begin the transition from a single message data item to a list of
them by replacing the "data" structure in a message with a pointer
to a ceph_msg_data structure.

A null pointer will indicate the message has no data; replace the
use of ceph_msg_has_data() with a simple check for a null pointer.

Create functions ceph_msg_data_create() and ceph_msg_data_destroy()
to dynamically allocate and free a data item structure of a given type.

When a message has its data item "set," allocate one of these to
hold the data description, and free it when the last reference to
the message is dropped.

This partially resolves:
    http://tracker.ceph.com/issues/4429

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
This commit is contained in:
Alex Elder
2013-03-11 23:34:24 -05:00
committed by Sage Weil
parent 8ea299bcbc
commit 6644ed7b7e
2 changed files with 63 additions and 38 deletions

View File

@@ -64,8 +64,6 @@ struct ceph_messenger {
u32 required_features;
};
#define ceph_msg_has_data(m) ((m)->data.type != CEPH_MSG_DATA_NONE)
enum ceph_msg_data_type {
CEPH_MSG_DATA_NONE, /* message contains no data payload */
CEPH_MSG_DATA_PAGES, /* data source/destination is a page array */
@@ -141,8 +139,7 @@ struct ceph_msg {
struct kvec front; /* unaligned blobs of message */
struct ceph_buffer *middle;
/* data payload */
struct ceph_msg_data data;
struct ceph_msg_data *data; /* data payload */
struct ceph_connection *con;
struct list_head list_head; /* links for connection lists */