// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (C) 2006-2009 Red Hat, Inc. * * This file is released under the LGPL. */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <net/sock.h> #include <linux/workqueue.h> #include <linux/connector.h> #include <linux/device-mapper.h> #include <linux/dm-log-userspace.h> #include "dm-log-userspace-transfer.h" static uint32_t dm_ulog_seq; /* * Netlink/Connector is an unreliable protocol. How long should * we wait for a response before assuming it was lost and retrying? * (If we do receive a response after this time, it will be discarded * and the response to the resent request will be waited for. */ #define DM_ULOG_RETRY_TIMEOUT … /* * Pre-allocated space for speed */ #define DM_ULOG_PREALLOCED_SIZE … static struct cn_msg *prealloced_cn_msg; static struct dm_ulog_request *prealloced_ulog_tfr; static struct cb_id ulog_cn_id = …; static DEFINE_MUTEX(dm_ulog_lock); struct receiving_pkg { … }; static DEFINE_SPINLOCK(receiving_list_lock); static struct list_head receiving_list; static int dm_ulog_sendto_server(struct dm_ulog_request *tfr) { … } /* * Parameters for this function can be either msg or tfr, but not * both. This function fills in the reply for a waiting request. * If just msg is given, then the reply is simply an ACK from userspace * that the request was received. * * Returns: 0 on success, -ENOENT on failure */ static int fill_pkg(struct cn_msg *msg, struct dm_ulog_request *tfr) { … } /* * This is the connector callback that delivers data * that was sent from userspace. */ static void cn_ulog_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { … } /** * dm_consult_userspace * @uuid: log's universal unique identifier (must be DM_UUID_LEN in size) * @luid: log's local unique identifier * @request_type: found in include/linux/dm-log-userspace.h * @data: data to tx to the server * @data_size: size of data in bytes * @rdata: place to put return data from server * @rdata_size: value-result (amount of space given/amount of space used) * * rdata_size is undefined on failure. * * Memory used to communicate with userspace is zero'ed * before populating to ensure that no unwanted bits leak * from kernel space to user-space. All userspace log communications * between kernel and user space go through this function. * * Returns: 0 on success, -EXXX on failure **/ int dm_consult_userspace(const char *uuid, uint64_t luid, int request_type, char *data, size_t data_size, char *rdata, size_t *rdata_size) { … } int dm_ulog_tfr_init(void) { … } void dm_ulog_tfr_exit(void) { … }