From b0f43d935426144f1ace0df641485008e36b86c0 Mon Sep 17 00:00:00 2001 From: Mateusz Majewski Date: Fri, 10 Sep 2021 12:54:33 +0200 Subject: [PATCH] Do it correctly Change-Id: Ie277ce05e215a00c5424ebf77375a8cd3b138e48 --- kernel/logger.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/kernel/logger.c b/kernel/logger.c index 37867a8..4b80eb4 100644 --- a/kernel/logger.c +++ b/kernel/logger.c @@ -531,7 +531,10 @@ static void write_log_data(struct logger_log *log, log->w_off = logger_offset(log, w_off + chunk_len); } -static void flush_thread_data(struct file* file, bool log_locked) +/* + * The caller needs to hold log->mutex. + */ +static void flush_thread_data(struct file* file) { struct logger_writer *writer = file->private_data; struct logger_log *log = file_get_log(file); @@ -540,16 +543,10 @@ static void flush_thread_data(struct file* file, bool log_locked) chunk_len = writer->b_off + 1; writer->b_header.len = chunk_len + writer->tag_len + 2; - if (!log_locked) - mutex_lock(&log->mutex); - fix_up_readers(log, sizeof(struct logger_entry) + writer->b_header.len); write_log_data(log, &writer->b_header, writer, chunk_len); - if (!log_locked) - mutex_unlock(&log->mutex); - writer->b_off = 0; writer->buffer[0] = '\0'; } @@ -631,7 +628,7 @@ static ssize_t logger_write_iter(struct kiocb *iocb, struct iov_iter *from) /* flush message from a different thread */ if (writer->b_owner != current && writer->b_off) - flush_thread_data(file, true); + flush_thread_data(file); count = 0; /* -1 : leave space for message terminating '\0' */ @@ -812,10 +809,15 @@ static int logger_release(struct inode *ignored, struct file *file) kfree(reader); } else { struct logger_writer *writer = file->private_data; + struct logger_log *log = writer->log; + bool from_stdio = writer->tag && writer->prio >= 2; - if (from_stdio && writer->b_off > 0) - flush_thread_data(file, false); + if (from_stdio && writer->b_off > 0) { + mutex_lock(&log->mutex); + flush_thread_data(file); + mutex_unlock(&log->mutex); + } kfree(writer->tag); kfree(writer->buffer); -- 2.34.1