Lines Matching +full:mux +full:- +full:add +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0-only
31 struct ecryptfs_daemon *daemon = file->private_data; in ecryptfs_miscdev_poll()
34 mutex_lock(&daemon->mux); in ecryptfs_miscdev_poll()
35 if (daemon->flags & ECRYPTFS_DAEMON_ZOMBIE) { in ecryptfs_miscdev_poll()
40 if (daemon->flags & ECRYPTFS_DAEMON_IN_READ) in ecryptfs_miscdev_poll()
42 if (daemon->flags & ECRYPTFS_DAEMON_IN_POLL) in ecryptfs_miscdev_poll()
44 daemon->flags |= ECRYPTFS_DAEMON_IN_POLL; in ecryptfs_miscdev_poll()
45 mutex_unlock(&daemon->mux); in ecryptfs_miscdev_poll()
46 poll_wait(file, &daemon->wait, pt); in ecryptfs_miscdev_poll()
47 mutex_lock(&daemon->mux); in ecryptfs_miscdev_poll()
48 if (!list_empty(&daemon->msg_ctx_out_queue)) in ecryptfs_miscdev_poll()
51 daemon->flags &= ~ECRYPTFS_DAEMON_IN_POLL; in ecryptfs_miscdev_poll()
52 mutex_unlock(&daemon->mux); in ecryptfs_miscdev_poll()
61 * Returns zero on success; non-zero otherwise
72 rc = -EINVAL; in ecryptfs_miscdev_open()
81 mutex_lock(&daemon->mux); in ecryptfs_miscdev_open()
82 if (daemon->flags & ECRYPTFS_DAEMON_MISCDEV_OPEN) { in ecryptfs_miscdev_open()
83 rc = -EBUSY; in ecryptfs_miscdev_open()
86 daemon->flags |= ECRYPTFS_DAEMON_MISCDEV_OPEN; in ecryptfs_miscdev_open()
87 file->private_data = daemon; in ecryptfs_miscdev_open()
90 mutex_unlock(&daemon->mux); in ecryptfs_miscdev_open()
104 * Returns zero on success; non-zero otherwise
109 struct ecryptfs_daemon *daemon = file->private_data; in ecryptfs_miscdev_release()
112 mutex_lock(&daemon->mux); in ecryptfs_miscdev_release()
113 BUG_ON(!(daemon->flags & ECRYPTFS_DAEMON_MISCDEV_OPEN)); in ecryptfs_miscdev_release()
114 daemon->flags &= ~ECRYPTFS_DAEMON_MISCDEV_OPEN; in ecryptfs_miscdev_release()
116 mutex_unlock(&daemon->mux); in ecryptfs_miscdev_release()
132 * @data: Data to send to daemon; may be NULL
133 * @data_size: Amount of data to send to daemon
140 * Add msg_ctx to queue and then, if it exists, notify the blocked
141 * miscdevess about the data being available. Must be called with
144 * Returns zero on success; non-zero otherwise
146 int ecryptfs_send_miscdev(char *data, size_t data_size, in ecryptfs_send_miscdev() argument
154 return -ENOMEM; in ecryptfs_send_miscdev()
156 mutex_lock(&msg_ctx->mux); in ecryptfs_send_miscdev()
157 msg_ctx->msg = msg; in ecryptfs_send_miscdev()
158 msg_ctx->msg->index = msg_ctx->index; in ecryptfs_send_miscdev()
159 msg_ctx->msg->data_len = data_size; in ecryptfs_send_miscdev()
160 msg_ctx->type = msg_type; in ecryptfs_send_miscdev()
161 memcpy(msg_ctx->msg->data, data, data_size); in ecryptfs_send_miscdev()
162 msg_ctx->msg_size = (sizeof(*msg_ctx->msg) + data_size); in ecryptfs_send_miscdev()
163 list_add_tail(&msg_ctx->daemon_out_list, &daemon->msg_ctx_out_queue); in ecryptfs_send_miscdev()
164 mutex_unlock(&msg_ctx->mux); in ecryptfs_send_miscdev()
166 mutex_lock(&daemon->mux); in ecryptfs_send_miscdev()
167 daemon->num_queued_msg_ctx++; in ecryptfs_send_miscdev()
168 wake_up_interruptible(&daemon->wait); in ecryptfs_send_miscdev()
169 mutex_unlock(&daemon->mux); in ecryptfs_send_miscdev()
177 * Octets 1-4: network byte order msg_ctx->counter
178 * Octets 5-N0: Size of struct ecryptfs_message to follow
179 * Octets N0-N1: struct ecryptfs_message (including data)
181 * Octets 5-N1 not written if the packet type does not include a message
198 * ecryptfs_miscdev_read - format and send message from queue
213 struct ecryptfs_daemon *daemon = file->private_data; in ecryptfs_miscdev_read()
221 mutex_lock(&daemon->mux); in ecryptfs_miscdev_read()
222 if (daemon->flags & ECRYPTFS_DAEMON_ZOMBIE) { in ecryptfs_miscdev_read()
228 if (daemon->flags & ECRYPTFS_DAEMON_IN_READ) { in ecryptfs_miscdev_read()
233 daemon->flags |= ECRYPTFS_DAEMON_IN_READ; in ecryptfs_miscdev_read()
235 if (list_empty(&daemon->msg_ctx_out_queue)) { in ecryptfs_miscdev_read()
236 mutex_unlock(&daemon->mux); in ecryptfs_miscdev_read()
238 daemon->wait, !list_empty(&daemon->msg_ctx_out_queue)); in ecryptfs_miscdev_read()
239 mutex_lock(&daemon->mux); in ecryptfs_miscdev_read()
245 if (daemon->flags & ECRYPTFS_DAEMON_ZOMBIE) { in ecryptfs_miscdev_read()
249 if (list_empty(&daemon->msg_ctx_out_queue)) { in ecryptfs_miscdev_read()
255 msg_ctx = list_first_entry(&daemon->msg_ctx_out_queue, in ecryptfs_miscdev_read()
258 mutex_lock(&msg_ctx->mux); in ecryptfs_miscdev_read()
259 if (msg_ctx->msg) { in ecryptfs_miscdev_read()
261 msg_ctx->msg_size, in ecryptfs_miscdev_read()
271 msg_ctx->msg_size = 0; in ecryptfs_miscdev_read()
274 + msg_ctx->msg_size); in ecryptfs_miscdev_read()
282 rc = -EFAULT; in ecryptfs_miscdev_read()
283 if (put_user(msg_ctx->type, buf)) in ecryptfs_miscdev_read()
285 if (put_user(cpu_to_be32(msg_ctx->counter), in ecryptfs_miscdev_read()
289 if (msg_ctx->msg) { in ecryptfs_miscdev_read()
293 if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size)) in ecryptfs_miscdev_read()
295 i += msg_ctx->msg_size; in ecryptfs_miscdev_read()
298 list_del(&msg_ctx->daemon_out_list); in ecryptfs_miscdev_read()
299 kfree(msg_ctx->msg); in ecryptfs_miscdev_read()
300 msg_ctx->msg = NULL; in ecryptfs_miscdev_read()
303 if (msg_ctx->type != ECRYPTFS_MSG_REQUEST) in ecryptfs_miscdev_read()
306 mutex_unlock(&msg_ctx->mux); in ecryptfs_miscdev_read()
308 daemon->flags &= ~ECRYPTFS_DAEMON_IN_READ; in ecryptfs_miscdev_read()
309 mutex_unlock(&daemon->mux); in ecryptfs_miscdev_read()
314 * ecryptfs_miscdev_response - miscdevess response to message previously sent to daemon
316 * @data: Bytes comprising struct ecryptfs_message
317 * @data_size: sizeof(struct ecryptfs_message) + data len
320 * Returns zero on success; non-zero otherwise
322 static int ecryptfs_miscdev_response(struct ecryptfs_daemon *daemon, char *data, in ecryptfs_miscdev_response() argument
325 struct ecryptfs_message *msg = (struct ecryptfs_message *)data; in ecryptfs_miscdev_response()
328 if ((sizeof(*msg) + msg->data_len) != data_size) { in ecryptfs_miscdev_response()
329 printk(KERN_WARNING "%s: (sizeof(*msg) + msg->data_len) = " in ecryptfs_miscdev_response()
331 (sizeof(*msg) + msg->data_len), data_size); in ecryptfs_miscdev_response()
332 rc = -EINVAL; in ecryptfs_miscdev_response()
344 * ecryptfs_miscdev_write - handle write to daemon miscdev handle
346 * @buf: Buffer containing user data
347 * @count: Amount of data in @buf
359 char *data; in ecryptfs_miscdev_write() local
366 /* Likely a harmless MSG_HELO or MSG_QUIT - no packet length */ in ecryptfs_miscdev_write()
370 "[%d-%zu], but amount of data written is [%zu].\n", in ecryptfs_miscdev_write()
372 return -EINVAL; in ecryptfs_miscdev_write()
379 return -EFAULT; in ecryptfs_miscdev_write()
394 return -EINVAL; in ecryptfs_miscdev_write()
398 data = memdup_user(buf, count); in ecryptfs_miscdev_write()
399 if (IS_ERR(data)) { in ecryptfs_miscdev_write()
401 __func__, PTR_ERR(data)); in ecryptfs_miscdev_write()
402 return PTR_ERR(data); in ecryptfs_miscdev_write()
404 switch (data[PKT_TYPE_OFFSET]) { in ecryptfs_miscdev_write()
409 "size is [%zd], but amount of data written is " in ecryptfs_miscdev_write()
414 rc = -EINVAL; in ecryptfs_miscdev_write()
417 memcpy(&counter_nbo, &data[PKT_CTR_OFFSET], PKT_CTR_SIZE); in ecryptfs_miscdev_write()
419 rc = ecryptfs_miscdev_response(file->private_data, in ecryptfs_miscdev_write()
420 &data[PKT_LEN_OFFSET + packet_size_length], in ecryptfs_miscdev_write()
435 data[0]); in ecryptfs_miscdev_write()
436 rc = -EINVAL; in ecryptfs_miscdev_write()
441 kfree(data); in ecryptfs_miscdev_write()
470 * Returns zero on success; non-zero otherwise