Parcourir la source

CPG: Remove zero-copy CPG

zero-copy cpg is unused and unmaintainable in its current state.
It's also largely pointless as there is only a send portion (no
zero-copy recv was ever implemented) and corosync was never designed
for high-performance message passing anyway. There are far better
systems for that including direct knet and nozzle devices.

This patch keeps backward compatibility with existing applications
that use cpg_zcb (thogh I seriously doubt there are any), provided
corosync libraries are updated at the same time as the daemon, which
should always be the case.

There is a small exposure if old libraries are used with a new daemon,
then cpg_zcb_alloc will fail silently. This is a bug in the original
zcb implementation that does not check the return code from corosync
alloc call correctly.

Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
Reviewed-by: Jan Friesse <jfriesse@redhat.com>
Christine Caulfield il y a 1 semaine
Parent
commit
28fb342552

+ 19 - 283
exec/cpg.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2006-2019 Red Hat, Inc.
+ * Copyright (c) 2006-2026 Red Hat, Inc.
  *
  * All rights reserved.
  *
@@ -86,11 +86,6 @@ enum cpg_message_req_types {
 	MESSAGE_REQ_EXEC_CPG_PARTIAL_MCAST = 6,
 };
 
-struct zcb_mapped {
-	struct qb_list_head list;
-	void *addr;
-	size_t size;
-};
 /*
  * state`		exec deliver
  * match group name, pid -> if matched deliver for YES:
@@ -153,7 +148,6 @@ struct cpg_pd {
 	uint64_t initial_transition_counter;
 	struct qb_list_head list;
 	struct qb_list_head iteration_instance_list_head;
-	struct qb_list_head zcb_mapped_list_head;
 };
 
 struct cpg_iteration_instance {
@@ -249,6 +243,8 @@ static void exec_cpg_downlist_endian_convert_old (void *msg);
 
 static void exec_cpg_downlist_endian_convert (void *msg);
 
+static void message_handler_req_lib_cpg_null (void *conn, const void *message);
+
 static void message_handler_req_lib_cpg_join (void *conn, const void *message);
 
 static void message_handler_req_lib_cpg_leave (void *conn, const void *message);
@@ -277,18 +273,6 @@ static void message_handler_req_lib_cpg_iteration_finalize (
 	void *conn,
 	const void *message);
 
-static void message_handler_req_lib_cpg_zc_alloc (
-	void *conn,
-	const void *message);
-
-static void message_handler_req_lib_cpg_zc_free (
-	void *conn,
-	const void *message);
-
-static void message_handler_req_lib_cpg_zc_execute (
-	void *conn,
-	const void *message);
-
 static int cpg_node_joinleave_send (unsigned int pid, const mar_cpg_name_t *group_name, int fn, int reason);
 
 static int cpg_exec_send_downlist(void);
@@ -332,9 +316,6 @@ static int notify_lib_totem_membership (
 	int member_list_entries,
 	const unsigned int *member_list);
 
-static inline int zcb_all_free (
-	struct cpg_pd *cpd);
-
 static char *cpg_print_group_name (
 	const mar_cpg_name_t *group);
 
@@ -379,16 +360,16 @@ static struct corosync_lib_handler cpg_lib_engine[] =
 		.lib_handler_fn				= message_handler_req_lib_cpg_finalize,
 		.flow_control				= CS_LIB_FLOW_CONTROL_REQUIRED
 	},
-	{ /* 9 */
-		.lib_handler_fn				= message_handler_req_lib_cpg_zc_alloc,
+	{ /* 9 ZCB handers do nothing now, but we can't remove them from this list */
+		.lib_handler_fn				= message_handler_req_lib_cpg_null,
 		.flow_control				= CS_LIB_FLOW_CONTROL_REQUIRED
 	},
 	{ /* 10 */
-		.lib_handler_fn				= message_handler_req_lib_cpg_zc_free,
+		.lib_handler_fn				= message_handler_req_lib_cpg_null,
 		.flow_control				= CS_LIB_FLOW_CONTROL_REQUIRED
 	},
 	{ /* 11 */
-		.lib_handler_fn				= message_handler_req_lib_cpg_zc_execute,
+		.lib_handler_fn				= message_handler_req_lib_cpg_null,
 		.flow_control				= CS_LIB_FLOW_CONTROL_REQUIRED
 	},
 	{ /* 12 */
@@ -1053,7 +1034,6 @@ static void cpg_pd_finalize (struct cpg_pd *cpd)
 	struct qb_list_head *iter, *tmp_iter;
 	struct cpg_iteration_instance *cpii;
 
-	zcb_all_free(cpd);
 	qb_list_for_each_safe(iter, tmp_iter, &(cpd->iteration_instance_list_head)) {
 		cpii = qb_list_entry (iter, struct cpg_iteration_instance, list);
 
@@ -1547,13 +1527,24 @@ static int cpg_lib_init_fn (void *conn)
 	qb_list_add (&cpd->list, &cpg_pd_list_head);
 
 	qb_list_init (&cpd->iteration_instance_list_head);
-	qb_list_init (&cpd->zcb_mapped_list_head);
 
 	api->ipc_refcnt_inc (conn);
 	log_printf(LOGSYS_LEVEL_DEBUG, "lib_init_fn: conn=%p, cpd=%p", conn, cpd);
 	return (0);
 }
 
+
+/* NULL message so old zcb clients don't crash us */
+static void message_handler_req_lib_cpg_null (void *conn, const void *message)
+{
+	struct res_lib_cpg_null res_lib_cpg_null;
+
+	res_lib_cpg_null.header.size = sizeof(res_lib_cpg_null);
+	res_lib_cpg_null.header.id = MESSAGE_RES_CPG_NULL;
+	res_lib_cpg_null.header.error = CS_ERR_NOT_SUPPORTED;
+	api->ipc_response_send (conn, &res_lib_cpg_null, sizeof(res_lib_cpg_null));
+}
+
 /* Join message from the library */
 static void message_handler_req_lib_cpg_join (void *conn, const void *message)
 {
@@ -1690,195 +1681,6 @@ static void message_handler_req_lib_cpg_finalize (
 		sizeof (res_lib_cpg_finalize));
 }
 
-static int
-memory_map (
-	const char *path,
-	size_t bytes,
-	void **buf)
-{
-	int32_t fd;
-	void *addr;
-	int32_t res;
-
-	fd = open (path, O_RDWR, 0600);
-
-	unlink (path);
-
-	if (fd == -1) {
-		return (-1);
-	}
-
-	res = ftruncate (fd, bytes);
-	if (res == -1) {
-		goto error_close_unlink;
-	}
-
-	addr = mmap (NULL, bytes, PROT_READ | PROT_WRITE,
-		MAP_SHARED, fd, 0);
-
-	if (addr == MAP_FAILED) {
-		goto error_close_unlink;
-	}
-#ifdef MADV_NOSYNC
-	madvise(addr, bytes, MADV_NOSYNC);
-#endif
-
-	res = close (fd);
-	if (res) {
-		munmap (addr, bytes);
-		return (-1);
-	}
-	*buf = addr;
-	return (0);
-
-error_close_unlink:
-	close (fd);
-	unlink(path);
-	return -1;
-}
-
-static inline int zcb_alloc (
-	struct cpg_pd *cpd,
-	const char *path_to_file,
-	size_t size,
-	void **addr)
-{
-	struct zcb_mapped *zcb_mapped;
-	unsigned int res;
-
-	zcb_mapped = malloc (sizeof (struct zcb_mapped));
-	if (zcb_mapped == NULL) {
-		return (-1);
-	}
-
-	res = memory_map (
-		path_to_file,
-		size,
-		addr);
-	if (res == -1) {
-		free (zcb_mapped);
-		return (-1);
-	}
-
-	qb_list_init (&zcb_mapped->list);
-	zcb_mapped->addr = *addr;
-	zcb_mapped->size = size;
-	qb_list_add_tail (&zcb_mapped->list, &cpd->zcb_mapped_list_head);
-	return (0);
-}
-
-
-static inline int zcb_free (struct zcb_mapped *zcb_mapped)
-{
-	int res;
-
-	res = munmap (zcb_mapped->addr, zcb_mapped->size);
-	qb_list_del (&zcb_mapped->list);
-	free (zcb_mapped);
-	return (res);
-}
-
-static inline int zcb_by_addr_free (struct cpg_pd *cpd, void *addr)
-{
-	struct qb_list_head *list, *tmp_iter;
-	struct zcb_mapped *zcb_mapped;
-	int res = 0;
-
-	qb_list_for_each_safe(list, tmp_iter, &(cpd->zcb_mapped_list_head)) {
-		zcb_mapped = qb_list_entry (list, struct zcb_mapped, list);
-
-		if (zcb_mapped->addr == addr) {
-			res = zcb_free (zcb_mapped);
-			break;
-		}
-
-	}
-	return (res);
-}
-
-static inline int zcb_all_free (
-	struct cpg_pd *cpd)
-{
-	struct qb_list_head *list, *tmp_iter;
-	struct zcb_mapped *zcb_mapped;
-
-	qb_list_for_each_safe(list, tmp_iter, &(cpd->zcb_mapped_list_head)) {
-		zcb_mapped = qb_list_entry (list, struct zcb_mapped, list);
-
-		zcb_free (zcb_mapped);
-	}
-	return (0);
-}
-
-union u {
-	uint64_t server_addr;
-	void *server_ptr;
-};
-
-static uint64_t void2serveraddr (void *server_ptr)
-{
-	union u u;
-
-	u.server_ptr = server_ptr;
-	return (u.server_addr);
-}
-
-static void *serveraddr2void (uint64_t server_addr)
-{
-	union u u;
-
-	u.server_addr = server_addr;
-	return (u.server_ptr);
-};
-
-static void message_handler_req_lib_cpg_zc_alloc (
-	void *conn,
-	const void *message)
-{
-	mar_req_coroipcc_zc_alloc_t *hdr = (mar_req_coroipcc_zc_alloc_t *)message;
-	struct qb_ipc_response_header res_header;
-	void *addr = NULL;
-	struct coroipcs_zc_header *zc_header;
-	unsigned int res;
-	struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn);
-
-	log_printf(LOGSYS_LEVEL_DEBUG, "path: %s", hdr->path_to_file);
-
-	res = zcb_alloc (cpd, hdr->path_to_file, hdr->map_size,
-		&addr);
-	assert(res == 0);
-
-	zc_header = (struct coroipcs_zc_header *)addr;
-	zc_header->server_address = void2serveraddr(addr);
-
-	res_header.size = sizeof (struct qb_ipc_response_header);
-	res_header.id = 0;
-	api->ipc_response_send (conn,
-		&res_header,
-		res_header.size);
-}
-
-static void message_handler_req_lib_cpg_zc_free (
-	void *conn,
-	const void *message)
-{
-	mar_req_coroipcc_zc_free_t *hdr = (mar_req_coroipcc_zc_free_t *)message;
-	struct qb_ipc_response_header res_header;
-	void *addr = NULL;
-	struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn);
-
-	log_printf(LOGSYS_LEVEL_DEBUG, " free'ing");
-
-	addr = serveraddr2void (hdr->server_address);
-
-	zcb_by_addr_free (cpd, addr);
-
-	res_header.size = sizeof (struct qb_ipc_response_header);
-	res_header.id = 0;
-	api->ipc_response_send (
-		conn, &res_header,
-		res_header.size);
-}
 
 /* Fragmented mcast message from the library */
 static void message_handler_req_lib_cpg_partial_mcast (void *conn, const void *message)
@@ -2006,72 +1808,6 @@ static void message_handler_req_lib_cpg_mcast (void *conn, const void *message)
 	}
 }
 
-static void message_handler_req_lib_cpg_zc_execute (
-	void *conn,
-	const void *message)
-{
-	mar_req_coroipcc_zc_execute_t *hdr = (mar_req_coroipcc_zc_execute_t *)message;
-	struct qb_ipc_request_header *header;
-	struct res_lib_cpg_mcast res_lib_cpg_mcast;
-	struct cpg_pd *cpd = (struct cpg_pd *)api->ipc_private_data_get (conn);
-	struct iovec req_exec_cpg_iovec[2];
-	struct req_exec_cpg_mcast req_exec_cpg_mcast;
-	struct req_lib_cpg_mcast *req_lib_cpg_mcast;
-	int result;
-	cs_error_t error = CS_ERR_NOT_EXIST;
-
-	log_printf(LOGSYS_LEVEL_TRACE, "got ZC mcast request on %p", conn);
-
-	header = (struct qb_ipc_request_header *)(((char *)serveraddr2void(hdr->server_address) + sizeof (struct coroipcs_zc_header)));
-	req_lib_cpg_mcast = (struct req_lib_cpg_mcast *)header;
-
-	switch (cpd->cpd_state) {
-	case CPD_STATE_UNJOINED:
-		error = CS_ERR_NOT_EXIST;
-		break;
-	case CPD_STATE_LEAVE_STARTED:
-		error = CS_ERR_NOT_EXIST;
-		break;
-	case CPD_STATE_JOIN_STARTED:
-		error = CS_OK;
-		break;
-	case CPD_STATE_JOIN_COMPLETED:
-		error = CS_OK;
-		break;
-	}
-
-	res_lib_cpg_mcast.header.size = sizeof(res_lib_cpg_mcast);
-	res_lib_cpg_mcast.header.id = MESSAGE_RES_CPG_MCAST;
-	if (error == CS_OK) {
-		req_exec_cpg_mcast.header.size = sizeof(req_exec_cpg_mcast) + req_lib_cpg_mcast->msglen;
-		req_exec_cpg_mcast.header.id = SERVICE_ID_MAKE(CPG_SERVICE,
-			MESSAGE_REQ_EXEC_CPG_MCAST);
-		req_exec_cpg_mcast.pid = cpd->pid;
-		req_exec_cpg_mcast.msglen = req_lib_cpg_mcast->msglen;
-		api->ipc_source_set (&req_exec_cpg_mcast.source, conn);
-		memcpy(&req_exec_cpg_mcast.group_name, &cpd->group_name,
-			sizeof(mar_cpg_name_t));
-
-		req_exec_cpg_iovec[0].iov_base = (char *)&req_exec_cpg_mcast;
-		req_exec_cpg_iovec[0].iov_len = sizeof(req_exec_cpg_mcast);
-		req_exec_cpg_iovec[1].iov_base = (char *)header + sizeof(struct req_lib_cpg_mcast);
-		req_exec_cpg_iovec[1].iov_len = req_exec_cpg_mcast.msglen;
-
-		result = api->totem_mcast (req_exec_cpg_iovec, 2, TOTEM_AGREED);
-		if (result == 0) {
-			res_lib_cpg_mcast.header.error = CS_OK;
-		} else {
-			res_lib_cpg_mcast.header.error = CS_ERR_TRY_AGAIN;
-		}
-	} else {
-		res_lib_cpg_mcast.header.error = error;
-	}
-
-	api->ipc_response_send (conn, &res_lib_cpg_mcast,
-		sizeof (res_lib_cpg_mcast));
-
-}
-
 static void message_handler_req_lib_cpg_membership (void *conn,
 						    const void *message)
 {

+ 9 - 0
include/corosync/cpg.h

@@ -371,6 +371,9 @@ cs_error_t cpg_flow_control_state_get (
  * @param size
  * @param buffer
  * @return
+ *
+ * This is left here for backward compatibility only
+ * it just calls malloc()
  */
 cs_error_t cpg_zcb_alloc (
 	cpg_handle_t handle,
@@ -382,6 +385,9 @@ cs_error_t cpg_zcb_alloc (
  * @param handle
  * @param buffer
  * @return
+ *
+ * This is left here for backward compatibility only
+ * it just calls free()
  */
 cs_error_t cpg_zcb_free (
 	cpg_handle_t handle,
@@ -394,6 +400,9 @@ cs_error_t cpg_zcb_free (
  * @param msg
  * @param msg_len
  * @return
+ *
+ * This is left here for backward compatibility only
+ * it just calls cpg_mcast_joined()
  */
 cs_error_t cpg_zcb_mcast_joined (
 	cpg_handle_t handle,

+ 13 - 42
include/corosync/ipc_cpg.h

@@ -40,8 +40,6 @@
 #include <corosync/corotypes.h>
 #include <corosync/mar_gen.h>
 
-#define CPG_ZC_PATH_LEN				128
-
 /**
  * @brief The req_cpg_types enum
  */
@@ -55,9 +53,9 @@ enum req_cpg_types {
 	MESSAGE_REQ_CPG_ITERATIONNEXT = 6,
 	MESSAGE_REQ_CPG_ITERATIONFINALIZE = 7,
 	MESSAGE_REQ_CPG_FINALIZE = 8,
-	MESSAGE_REQ_CPG_ZC_ALLOC = 9,
-	MESSAGE_REQ_CPG_ZC_FREE = 10,
-	MESSAGE_REQ_CPG_ZC_EXECUTE = 11,
+	MESSAGE_REQ_CPG_NULL = 9,
+	MESSAGE_REQ_CPG_PAD1 = 10,
+	MESSAGE_REQ_CPG_PAD2 = 11,
 	MESSAGE_REQ_CPG_PARTIAL_MCAST = 12,
 };
 
@@ -79,9 +77,9 @@ enum res_cpg_types {
 	MESSAGE_RES_CPG_ITERATIONFINALIZE = 11,
 	MESSAGE_RES_CPG_FINALIZE = 12,
 	MESSAGE_RES_CPG_TOTEM_CONFCHG_CALLBACK = 13,
-	MESSAGE_RES_CPG_ZC_ALLOC = 14,
-	MESSAGE_RES_CPG_ZC_FREE = 15,
-	MESSAGE_RES_CPG_ZC_EXECUTE = 16,
+	MESSAGE_RES_CPG_NULL = 14,
+	MESSAGE_RES_CPG_PAD1 = 15,
+	MESSAGE_RES_CPG_PAD2 = 16,
 	MESSAGE_RES_CPG_PARTIAL_DELIVER_CALLBACK = 17,
 	MESSAGE_RES_CPG_PARTIAL_SEND = 18,
 };
@@ -283,6 +281,13 @@ struct req_lib_cpg_local_get {
 	struct qb_ipc_request_header header __attribute__((aligned(8)));
 };
 
+/**
+ * @brief The res_lib_cpg_null struct
+ */
+struct res_lib_cpg_null {
+	struct qb_ipc_response_header header __attribute__((aligned(8)));
+};
+
 /**
  * @brief The res_lib_cpg_local_get struct
  */
@@ -465,38 +470,4 @@ struct req_lib_cpg_iterationfinalize {
 struct res_lib_cpg_iterationfinalize {
 	struct qb_ipc_response_header header __attribute__((aligned(8)));
 };
-
-/**
- * @brief mar_req_coroipcc_zc_alloc_t struct
- */
-typedef struct {
-        struct qb_ipc_request_header header __attribute__((aligned(8)));
-        size_t map_size __attribute__((aligned(8)));
-        char path_to_file[CPG_ZC_PATH_LEN] __attribute__((aligned(8)));
-} mar_req_coroipcc_zc_alloc_t __attribute__((aligned(8)));
-
-/**
- * @brief mar_req_coroipcc_zc_free_t struct
- */
-typedef struct {
-        struct qb_ipc_request_header header __attribute__((aligned(8)));
-        size_t map_size __attribute__((aligned(8)));
-	uint64_t server_address __attribute__((aligned(8)));
-} mar_req_coroipcc_zc_free_t __attribute__((aligned(8)));
-
-/**
- * @brief mar_req_coroipcc_zc_execute_t struct
- */
-typedef struct {
-        struct qb_ipc_request_header header __attribute__((aligned(8)));
-	uint64_t server_address __attribute__((aligned(8)));
-} mar_req_coroipcc_zc_execute_t __attribute__((aligned(8)));
-
-/**
- * @brief coroipcs_zc_header struct
- */
-struct coroipcs_zc_header {
-	int map_size;
-	uint64_t server_address;
-};
 #endif /* IPC_CPG_H_DEFINED */

+ 13 - 234
lib/cpg.c

@@ -75,11 +75,6 @@
  */
 #define MAX_RETRIES 100
 
-/*
- * ZCB files have following umask (umask is same as used in libqb)
- */
-#define CPG_MEMORY_MAP_UMASK		077
-
 struct cpg_assembly_data
 {
 	struct qb_list_head list;
@@ -863,150 +858,21 @@ cs_error_t cpg_flow_control_state_get (
 	return (error);
 }
 
-static int
-memory_map (char *path, const char *file, void **buf, size_t bytes)
-{
-	int32_t fd;
-	void *addr;
-	int32_t res;
-	char *buffer;
-	int32_t i;
-	size_t written;
-	size_t page_size; 
-	long int sysconf_page_size;
-	mode_t old_umask;
-
-	snprintf (path, PATH_MAX, "/dev/shm/%s", file);
-
-	old_umask = umask(CPG_MEMORY_MAP_UMASK);
-	fd = mkstemp (path);
-	(void)umask(old_umask);
-	if (fd == -1) {
-		snprintf (path, PATH_MAX, LOCALSTATEDIR "/run/%s", file);
-		old_umask = umask(CPG_MEMORY_MAP_UMASK);
-		fd = mkstemp (path);
-		(void)umask(old_umask);
-		if (fd == -1) {
-			return (-1);
-		}
-	}
-
-	res = ftruncate (fd, bytes);
-	if (res == -1) {
-		goto error_close_unlink;
-	}
-	sysconf_page_size = sysconf(_SC_PAGESIZE);
-	if (sysconf_page_size <= 0) {
-		goto error_close_unlink;
-	}
-	page_size = sysconf_page_size;
-	buffer = malloc (page_size);
-	if (buffer == NULL) {
-		goto error_close_unlink;
-	}
-	memset (buffer, 0, page_size);
-	for (i = 0; i < (bytes / page_size); i++) {
-retry_write:
-		written = write (fd, buffer, page_size);
-		if (written == -1 && errno == EINTR) {
-			goto retry_write;
-		}
-		if (written != page_size) {
-			free (buffer);
-			goto error_close_unlink;
-		}
-	}
-	free (buffer);
-
-	addr = mmap (NULL, bytes, PROT_READ | PROT_WRITE,
-		MAP_SHARED, fd, 0);
-
-	if (addr == MAP_FAILED) {
-		goto error_close_unlink;
-	}
-#ifdef MADV_NOSYNC
-	madvise(addr, bytes, MADV_NOSYNC);
-#endif
-
-	res = close (fd);
-	if (res) {
-		munmap(addr, bytes);
-
-		return (-1);
-	}
-	*buf = addr;
-
-	return 0;
-
-error_close_unlink:
-	close (fd);
-	unlink(path);
-	return -1;
-}
-
+/*
+ * Dummy-ish function that just allocates some memory for the user
+ */
 cs_error_t cpg_zcb_alloc (
 	cpg_handle_t handle,
 	size_t size,
 	void **buffer)
 {
-	void *buf = NULL;
-	char path[PATH_MAX];
-	mar_req_coroipcc_zc_alloc_t req_coroipcc_zc_alloc;
-	struct qb_ipc_response_header res_coroipcs_zc_alloc;
-	size_t map_size;
-	struct iovec iovec;
-	struct coroipcs_zc_header *hdr;
-	cs_error_t error;
-	struct cpg_inst *cpg_inst;
+	int error = CS_OK;
 
-	error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst));
-	if (error != CS_OK) {
-		return (error);
+	*buffer = malloc(size);
+	if (*buffer == NULL) {
+		error = CS_ERR_NO_MEMORY;
 	}
 
-	map_size = size + sizeof (struct req_lib_cpg_mcast) + sizeof (struct coroipcs_zc_header);
-	assert(memory_map (path, "corosync_zerocopy-XXXXXX", &buf, map_size) != -1);
-
-	if (strlen(path) >= CPG_ZC_PATH_LEN) {
-		unlink(path);
-		munmap (buf, map_size);
-		return (CS_ERR_NAME_TOO_LONG);
-	}
-
-	req_coroipcc_zc_alloc.header.size = sizeof (mar_req_coroipcc_zc_alloc_t);
-	req_coroipcc_zc_alloc.header.id = MESSAGE_REQ_CPG_ZC_ALLOC;
-	req_coroipcc_zc_alloc.map_size = map_size;
-	strcpy (req_coroipcc_zc_alloc.path_to_file, path);
-
-	iovec.iov_base = (void *)&req_coroipcc_zc_alloc;
-	iovec.iov_len = sizeof (mar_req_coroipcc_zc_alloc_t);
-
-	error = coroipcc_msg_send_reply_receive (
-		cpg_inst->c,
-		&iovec,
-		1,
-		&res_coroipcs_zc_alloc,
-		sizeof (struct qb_ipc_response_header));
-
-	if (error != CS_OK) {
-		goto error_exit;
-	}
-
-	hdr = (struct coroipcs_zc_header *)buf;
-	hdr->map_size = map_size;
-	*buffer = ((char *)buf) + sizeof (struct coroipcs_zc_header) + sizeof (struct req_lib_cpg_mcast);
-
-error_exit:
-	hdb_handle_put (&cpg_handle_t_db, handle);
-	/*
-	 * Coverity correctly reports an error here. We cannot safely munmap and unlink the file, because
-	 * the timing of the failure is the key issue: if a failure occurs before the IPC reply,
-	 * the file should be deleted.
-	 * However, if the failure happens during the IPC reply, Corosync has already deleted the file.
-	 * This means the cpg library could attempt to delete a non-existing file (not a problem) or,
-	 * in a theoretical race condition, delete a new file created by another application.
-	 * There are multiple possible solutions, but none of them are ready to be implemented yet.
-	 */
 	return (error);
 }
 
@@ -1014,49 +880,8 @@ cs_error_t cpg_zcb_free (
 	cpg_handle_t handle,
 	void *buffer)
 {
-	cs_error_t error;
-	unsigned int res;
-	struct cpg_inst *cpg_inst;
-	mar_req_coroipcc_zc_free_t req_coroipcc_zc_free;
-	struct qb_ipc_response_header res_coroipcs_zc_free;
-	struct iovec iovec;
-	struct coroipcs_zc_header *header = (struct coroipcs_zc_header *)((char *)buffer - sizeof (struct coroipcs_zc_header) - sizeof (struct req_lib_cpg_mcast));
-
-	error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst));
-	if (error != CS_OK) {
-		return (error);
-	}
-
-	req_coroipcc_zc_free.header.size = sizeof (mar_req_coroipcc_zc_free_t);
-	req_coroipcc_zc_free.header.id = MESSAGE_REQ_CPG_ZC_FREE;
-	req_coroipcc_zc_free.map_size = header->map_size;
-	req_coroipcc_zc_free.server_address = header->server_address;
-
-	iovec.iov_base = (void *)&req_coroipcc_zc_free;
-	iovec.iov_len = sizeof (mar_req_coroipcc_zc_free_t);
-
-	error = coroipcc_msg_send_reply_receive (
-		cpg_inst->c,
-		&iovec,
-		1,
-		&res_coroipcs_zc_free,
-		sizeof (struct qb_ipc_response_header));
-
-	if (error != CS_OK) {
-		goto error_exit;
-	}
-
-	res = munmap ((void *)header, header->map_size);
-	if (res == -1) {
-		error = qb_to_cs_error(-errno);
-
-		goto error_exit;
-	}
-
-error_exit:
-	hdb_handle_put (&cpg_handle_t_db, handle);
-
-	return (error);
+	free(buffer);
+	return (CS_OK);
 }
 
 cs_error_t cpg_zcb_mcast_joined (
@@ -1065,58 +890,12 @@ cs_error_t cpg_zcb_mcast_joined (
 	void *msg,
 	size_t msg_len)
 {
-	cs_error_t error;
-	struct cpg_inst *cpg_inst;
-	struct req_lib_cpg_mcast *req_lib_cpg_mcast;
-	struct res_lib_cpg_mcast res_lib_cpg_mcast;
-	mar_req_coroipcc_zc_execute_t req_coroipcc_zc_execute;
-	struct coroipcs_zc_header *hdr;
-	struct iovec iovec;
-
-	error = hdb_error_to_cs (hdb_handle_get (&cpg_handle_t_db, handle, (void *)&cpg_inst));
-	if (error != CS_OK) {
-		return (error);
-	}
-
-	if (msg_len > IPC_REQUEST_SIZE) {
-		error = CS_ERR_TOO_BIG;
-		goto error_exit;
-	}
-
-	req_lib_cpg_mcast = (struct req_lib_cpg_mcast *)(((char *)msg) - sizeof (struct req_lib_cpg_mcast));
-	req_lib_cpg_mcast->header.size = sizeof (struct req_lib_cpg_mcast) +
-		msg_len;
-
-	req_lib_cpg_mcast->header.id = MESSAGE_REQ_CPG_MCAST;
-	req_lib_cpg_mcast->guarantee = guarantee;
-	req_lib_cpg_mcast->msglen = msg_len;
-
-	hdr = (struct coroipcs_zc_header *)(((char *)req_lib_cpg_mcast) - sizeof (struct coroipcs_zc_header));
+	struct iovec iov[1];
 
-	req_coroipcc_zc_execute.header.size = sizeof (mar_req_coroipcc_zc_execute_t);
-	req_coroipcc_zc_execute.header.id = MESSAGE_REQ_CPG_ZC_EXECUTE;
-	req_coroipcc_zc_execute.server_address = hdr->server_address;
+	iov[0].iov_base = msg;
+	iov[0].iov_len = msg_len;
 
-	iovec.iov_base = (void *)&req_coroipcc_zc_execute;
-	iovec.iov_len = sizeof (mar_req_coroipcc_zc_execute_t);
-
-	error = coroipcc_msg_send_reply_receive (
-		cpg_inst->c,
-		&iovec,
-		1,
-		&res_lib_cpg_mcast,
-		sizeof(res_lib_cpg_mcast));
-
-	if (error != CS_OK) {
-		goto error_exit;
-	}
-
-	error = res_lib_cpg_mcast.header.error;
-
-error_exit:
-	hdb_handle_put (&cpg_handle_t_db, handle);
-
-	return (error);
+	return cpg_mcast_joined(handle, guarantee, iov, 1);
 }
 
 static cs_error_t send_fragments (

+ 0 - 3
man/Makefile.am

@@ -52,9 +52,6 @@ autogen_man		= cpg_context_get.3 \
 			  cpg_local_get.3 \
 			  cpg_mcast_joined.3 \
 			  cpg_model_initialize.3 \
-			  cpg_zcb_mcast_joined.3 \
-			  cpg_zcb_alloc.3 \
-			  cpg_zcb_free.3 \
 			  cpg_membership_get.3 \
 			  cpg_iteration_finalize.3 \
 			  cpg_iteration_initialize.3 \

+ 0 - 3
man/cpg_context_get.3.in

@@ -58,9 +58,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_context_set.3.in

@@ -60,9 +60,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_dispatch.3.in

@@ -102,9 +102,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_fd_get.3.in

@@ -65,9 +65,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_finalize.3.in

@@ -61,9 +61,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_initialize.3.in

@@ -166,9 +166,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_join.3.in

@@ -102,9 +102,6 @@ Not all errors are documented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_leave.3.in

@@ -67,9 +67,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_local_get.3.in

@@ -62,9 +62,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_mcast_joined.3.in

@@ -132,9 +132,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_membership_get.3.in

@@ -71,9 +71,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_model_initialize.3.in

@@ -224,9 +224,6 @@ The errors are undocumented.
 .BR cpg_leave (3),
 .BR cpg_mcast_joined (3),
 .BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
 .BR cpg_context_get (3)
 .BR cpg_context_set (3)
 .BR cpg_local_get (3)

+ 0 - 3
man/cpg_overview.3

@@ -70,9 +70,6 @@ access the corosync services.
 .BR cpg_mcast_joined (3),
 .BR cpg_model_initialize (3),
 .BR cpg_membership_get (3),
-.BR cpg_zcb_alloc (3),
-.BR cpg_zcb_free (3),
-.BR cpg_zcb_mcast_joined (3),
 .BR cpg_context_get (3),
 .BR cpg_context_set (3),
 .BR cpg_local_get (3),

+ 0 - 85
man/cpg_zcb_alloc.3.in

@@ -1,85 +0,0 @@
-.\"/*
-.\" * Copyright (c) 2009 Red Hat, Inc.
-.\" *
-.\" * All rights reserved.
-.\" *
-.\" * Author: Steven Dake <sdake@redhat.com>
-.\" *
-.\" * This software licensed under BSD license, the text of which follows:
-.\" *
-.\" * Redistribution and use in source and binary forms, with or without
-.\" * modification, are permitted provided that the following conditions are met:
-.\" *
-.\" * - Redistributions of source code must retain the above copyright notice,
-.\" *   this list of conditions and the following disclaimer.
-.\" * - Redistributions in binary form must reproduce the above copyright notice,
-.\" *   this list of conditions and the following disclaimer in the documentation
-.\" *   and/or other materials provided with the distribution.
-.\" * - Neither the name of the MontaVista Software, Inc. nor the names of its
-.\" *   contributors may be used to endorse or promote products derived from this
-.\" *   software without specific prior written permission.
-.\" *
-.\" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-.\" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-.\" * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-.\" * THE POSSIBILITY OF SUCH DAMAGE.
-.\" */
-.TH "CPG_ZCB_ALLOC" 3 "2009-04-15" "corosync Man Page" "Corosync Cluster Engine Programmer's Manual"
-.SH NAME
-cpg_zcb_alloc \- Allocates a zero copy buffer
-.SH SYNOPSIS
-.B #include <corosync/cpg.h>
-.sp
-.BI "int cpg_zcb_alloc(cpg_handle_t " handle ", size_t " size ", void **" buffer ");
-.SH DESCRIPTION
-The
-.B cpg_zcb_alloc
-function will allocate a zero copy buffer for use with the
-.B cpg_zcb_mcast_joined(3)
-function.  This buffer should not be used in another thread while a
-cpg_zcb_mcast_joined operation is taking place on the buffer.  The buffer is
-allocated via operating system mechanisms to avoid copying in the IPC layer.
-
-.PP
-The argument
-.I handle
-describes the handle on which the buffer will be allocated.
-.PP
-The argument
-.I size
-requests a buffer of size be allocated.
-.PP
-The
-.I buffer
-argument is set to the buffer address that is allocated by this operation.
-
-.SH RETURN VALUE
-This call returns the CS_OK value if successful, otherwise an error is returned.
-.PP
-.SH ERRORS
-The errors are undocumented.
-.SH "SEE ALSO"
-.BR cpg_overview (3),
-.BR cpg_initialize (3),
-.BR cpg_finalize (3),
-.BR cpg_fd_get (3),
-.BR cpg_dispatch (3),
-.BR cpg_join (3),
-.BR cpg_leave (3),
-.BR cpg_mcast_joined (3),
-.BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
-.BR cpg_context_get (3)
-.BR cpg_context_set (3)
-.BR cpg_local_get (3)
-
-.PP

+ 0 - 77
man/cpg_zcb_free.3.in

@@ -1,77 +0,0 @@
-.\"/*
-.\" * Copyright (c) 2009 Red Hat, Inc.
-.\" *
-.\" * All rights reserved.
-.\" *
-.\" * Author: Steven Dake <sdake@redhat.com>
-.\" *
-.\" * This software licensed under BSD license, the text of which follows:
-.\" *
-.\" * Redistribution and use in source and binary forms, with or without
-.\" * modification, are permitted provided that the following conditions are met:
-.\" *
-.\" * - Redistributions of source code must retain the above copyright notice,
-.\" *   this list of conditions and the following disclaimer.
-.\" * - Redistributions in binary form must reproduce the above copyright notice,
-.\" *   this list of conditions and the following disclaimer in the documentation
-.\" *   and/or other materials provided with the distribution.
-.\" * - Neither the name of the MontaVista Software, Inc. nor the names of its
-.\" *   contributors may be used to endorse or promote products derived from this
-.\" *   software without specific prior written permission.
-.\" *
-.\" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-.\" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-.\" * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-.\" * THE POSSIBILITY OF SUCH DAMAGE.
-.\" */
-.TH "CPG_ZCB_FREE" 3 "2009-04-15" "corosync Man Page" "Corosync Cluster Engine Programmer's Manual"
-.SH NAME
-cpg_zcb_free \- Frees a zero copy buffer
-.SH SYNOPSIS
-.B #include <corosync/cpg.h>
-.sp
-.BI "int cpg_zcb_fre(cpg_handle_t " handle ", void *" buffer ");
-.SH DESCRIPTION
-The
-.B cpg_zcb_free
-function will free a zero copy buffer.
-
-.PP
-The argument
-.I handle
-describes the handle on which the buffer will be allocated.
-.PP
-The argument
-.I buffer
-is the zero copy buffer to free.
-
-.SH RETURN VALUE
-This call returns the CS_OK value if successful, otherwise an error is returned.
-.PP
-.SH ERRORS
-The errors are undocumented.
-.SH "SEE ALSO"
-.BR cpg_overview (3),
-.BR cpg_initialize (3),
-.BR cpg_finalize (3),
-.BR cpg_fd_get (3),
-.BR cpg_dispatch (3),
-.BR cpg_join (3),
-.BR cpg_leave (3),
-.BR cpg_mcast_joined (3),
-.BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
-.BR cpg_context_get (3)
-.BR cpg_context_set (3)
-.BR cpg_local_get (3)
-
-.PP

+ 0 - 127
man/cpg_zcb_mcast_joined.3.in

@@ -1,127 +0,0 @@
-.\"/*
-.\" * Copyright (c) 2009 Red Hat, Inc.
-.\" *
-.\" * All rights reserved.
-.\" *
-.\" * Author: Steven Dake <sdake@redhat.com>
-.\" *
-.\" * This software licensed under BSD license, the text of which follows:
-.\" *
-.\" * Redistribution and use in source and binary forms, with or without
-.\" * modification, are permitted provided that the following conditions are met:
-.\" *
-.\" * - Redistributions of source code must retain the above copyright notice,
-.\" *   this list of conditions and the following disclaimer.
-.\" * - Redistributions in binary form must reproduce the above copyright notice,
-.\" *   this list of conditions and the following disclaimer in the documentation
-.\" *   and/or other materials provided with the distribution.
-.\" * - Neither the name of the MontaVista Software, Inc. nor the names of its
-.\" *   contributors may be used to endorse or promote products derived from this
-.\" *   software without specific prior written permission.
-.\" *
-.\" * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-.\" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-.\" * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-.\" * THE POSSIBILITY OF SUCH DAMAGE.
-.\" */
-.TH CPG_ZCB_MCAST_JOINED 3 2004-08-31 "corosync Man Page" "Corosync Cluster Engine Programmer's Manual"
-.SH NAME
-cpg_mcast_joined \- Multicasts a zero copy buffer to all groups joined to a handle
-.SH SYNOPSIS
-.B #include <sys/uio.h>
-.B #include <corosync/cpg.h>
-.sp
-.BI "int cpg_zcb_mcast_joined(cpg_handle_t " handle ", cpg_guarantee_t " guarantee ", const void *" buffer "", int " msg_len ");
-.SH DESCRIPTION
-The
-.B cpg_zcb_mcast_joined
-function will multicast a zero copy buffer message to all the processes that
-have been joined with the
-.B cpg_join(3)
-function for the same group name.
-Messages that are sent to any of the groups joined to the parameter
-.I handle
-will be delivered to all subscribed processes in the system.
-.PP
-The argument
-.I guarantee
-requests a delivery guarantee for the message to be sent.  The cpg_guarantee_t type is
-defined by:
-.IP
-.RS
-.ne 18
-.nf
-.ta 4n 30n 33n
-typedef enum {
-        CPG_TYPE_UNORDERED,     /* not implemented */
-        CPG_TYPE_FIFO,          /* same as agreed */
-        CPG_TYPE_AGREED,        /* implemented */
-        CPG_TYPE_SAFE           /* not implemented */
-} cpg_guarantee_t;
-.ta
-.fi
-.RE
-.IP
-.PP
-.PP
-The meanings of the cpg_guarantee_t typedef are:
-.TP
-.B CPG_TYPE_UNORDERED
-Messages are guaranteed to be delivered, but with no particular order.  This
-mode is unimplemented in the CPG library.
-.TP
-.B CPG_TYPE_FIFO
-Messages are guaranteed to be delivered in first sent first delivery order.
-In fact, this guarantee is equivalent to the CPG_TYPE_AGREED guarantee.
-.TP
-.B CPG_TYPE_AGREED
-All processors must agree on the order of delivery.  If a message is sent
-from two or more processes at about the same time, the delivery will occur
-in the same order to all processes.
-.TP
-.B CPG_TYPE_SAFE
-All processes must agree on the order of delivery.  Further all processes
-must have a copy of the message before any delivery takes place.  This mode is
-unimplemented in the CPG library.
-.PP
-The
-.I msg
-argument describes the zero copy buffer which is used to transmit a message.
-this buffer must be allocated by
-.B cpg_zcb_alloc(3).
-
-.PP
-The
-.I msg_len
-argument describes the number of bytes to be transmitted in the zero copy buffer.
-
-.SH RETURN VALUE
-This call returns the CS_OK value if successful, otherwise an error is returned.
-.PP
-.SH ERRORS
-The errors are undocumented.
-.SH "SEE ALSO"
-.BR cpg_overview (3),
-.BR cpg_initialize (3),
-.BR cpg_finalize (3),
-.BR cpg_fd_get (3),
-.BR cpg_dispatch (3),
-.BR cpg_join (3),
-.BR cpg_leave (3),
-.BR cpg_mcast_joined (3),
-.BR cpg_membership_get (3)
-.BR cpg_zcb_alloc (3)
-.BR cpg_zcb_free (3)
-.BR cpg_zcb_mcast_joined (3)
-.BR cpg_context_get (3)
-.BR cpg_context_set (3)
-.BR cpg_local_get (3)
-
-.PP

+ 0 - 12
man/index.html

@@ -146,18 +146,6 @@
       Create a new connection to the CPG service
       <br>
 
-      <a href="cpg_zcb_alloc.3.html">cpg_zcb_alloc(3)</a>:
-      Allocates a zero copy buffer.
-      <br>
-
-      <a href="cpg_zcb_free.3.html">cpg_zcb_free(3)</a>:
-      Frees a zero copy buffer.
-      <br>
-
-      <a href="cpg_zcb_mcast_joined.3.html">cpg_zcb_mcast_joined(3)</a>:
-      Multicasts a zero copy buffer to all groups joined to a handle.
-      <br>
-
       <h3>SAM service</h3>
 
       <a href="sam_overview.3.html">sam_overview(3)</a>: