🔐
authorMateusz Majewski <m.majewski2@samsung.com>
Fri, 10 Sep 2021 10:12:02 +0000 (12:12 +0200)
committerMateusz Majewski <m.majewski2@samsung.com>
Fri, 10 Sep 2021 10:12:02 +0000 (12:12 +0200)
Change-Id: I028391ae1fd09e6281446958b8bd3ff2f91492de

kernel/logger.c

index 48dbf4aab9e5e55ffa5122c83269f4fafc8424d8..37867a80c7c536845137f46803d1b3662a44c38e 100644 (file)
@@ -531,7 +531,7 @@ 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)
+static void flush_thread_data(struct file* file, bool log_locked)
 {
        struct logger_writer *writer = file->private_data;
        struct logger_log *log = file_get_log(file);
@@ -540,10 +540,16 @@ static void flush_thread_data(struct file* file)
        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';
 }
@@ -625,7 +631,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);
+                       flush_thread_data(file, true);
 
                count = 0;
                /* -1 : leave space for message terminating '\0' */
@@ -809,7 +815,7 @@ static int logger_release(struct inode *ignored, struct file *file)
 
                bool from_stdio = writer->tag && writer->prio >= 2;
                if (from_stdio && writer->b_off > 0)
-                       flush_thread_data(file);
+                       flush_thread_data(file, false);
 
                kfree(writer->tag);
                kfree(writer->buffer);