Commit 034633cc authored by Petr Mladek's avatar Petr Mladek Committed by Linus Torvalds

printk: return really stored message length

I wonder if anyone uses printk return value but it is there and should be
counted correctly.

This patch modifies log_store() to return the number of really stored
bytes from the 'text' part.  Also it handles the return value in
vprintk_emit().

Note that log_store() is used also in cont_flush() but we could ignore the
return value there.  The function works with characters that were already
counted earlier.  In addition, the store could newer fail here because the
length of the printed text is limited by the "cont" buffer and "dict" is
NULL.
Signed-off-by: default avatarPetr Mladek <pmladek@suse.cz>
Cc: Jan Kara <jack@suse.cz>
Cc: Jiri Kosina <jkosina@suse.cz>
Cc: Kay Sievers <kay@vrfy.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 55bd53a4
...@@ -378,10 +378,10 @@ static u32 truncate_msg(u16 *text_len, u16 *trunc_msg_len, ...@@ -378,10 +378,10 @@ static u32 truncate_msg(u16 *text_len, u16 *trunc_msg_len,
} }
/* insert record into the buffer, discard old ones, update heads */ /* insert record into the buffer, discard old ones, update heads */
static void log_store(int facility, int level, static int log_store(int facility, int level,
enum log_flags flags, u64 ts_nsec, enum log_flags flags, u64 ts_nsec,
const char *dict, u16 dict_len, const char *dict, u16 dict_len,
const char *text, u16 text_len) const char *text, u16 text_len)
{ {
struct printk_log *msg; struct printk_log *msg;
u32 size, pad_len; u32 size, pad_len;
...@@ -396,7 +396,7 @@ static void log_store(int facility, int level, ...@@ -396,7 +396,7 @@ static void log_store(int facility, int level,
&dict_len, &pad_len); &dict_len, &pad_len);
/* survive when the log buffer is too small for trunc_msg */ /* survive when the log buffer is too small for trunc_msg */
if (log_make_free_space(size)) if (log_make_free_space(size))
return; return 0;
} }
if (log_next_idx + size + sizeof(struct printk_log) > log_buf_len) { if (log_next_idx + size + sizeof(struct printk_log) > log_buf_len) {
...@@ -432,6 +432,8 @@ static void log_store(int facility, int level, ...@@ -432,6 +432,8 @@ static void log_store(int facility, int level,
/* insert message */ /* insert message */
log_next_idx += msg->len; log_next_idx += msg->len;
log_next_seq++; log_next_seq++;
return msg->text_len;
} }
#ifdef CONFIG_SECURITY_DMESG_RESTRICT #ifdef CONFIG_SECURITY_DMESG_RESTRICT
...@@ -1606,10 +1608,10 @@ asmlinkage int vprintk_emit(int facility, int level, ...@@ -1606,10 +1608,10 @@ asmlinkage int vprintk_emit(int facility, int level,
"BUG: recent printk recursion!"; "BUG: recent printk recursion!";
recursion_bug = 0; recursion_bug = 0;
printed_len += strlen(recursion_msg); text_len = strlen(recursion_msg);
/* emit KERN_CRIT message */ /* emit KERN_CRIT message */
log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0, printed_len += log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
NULL, 0, recursion_msg, printed_len); NULL, 0, recursion_msg, text_len);
} }
/* /*
...@@ -1662,9 +1664,12 @@ asmlinkage int vprintk_emit(int facility, int level, ...@@ -1662,9 +1664,12 @@ asmlinkage int vprintk_emit(int facility, int level,
cont_flush(LOG_NEWLINE); cont_flush(LOG_NEWLINE);
/* buffer line if possible, otherwise store it right away */ /* buffer line if possible, otherwise store it right away */
if (!cont_add(facility, level, text, text_len)) if (cont_add(facility, level, text, text_len))
log_store(facility, level, lflags | LOG_CONT, 0, printed_len += text_len;
dict, dictlen, text, text_len); else
printed_len += log_store(facility, level,
lflags | LOG_CONT, 0,
dict, dictlen, text, text_len);
} else { } else {
bool stored = false; bool stored = false;
...@@ -1683,11 +1688,12 @@ asmlinkage int vprintk_emit(int facility, int level, ...@@ -1683,11 +1688,12 @@ asmlinkage int vprintk_emit(int facility, int level,
cont_flush(LOG_NEWLINE); cont_flush(LOG_NEWLINE);
} }
if (!stored) if (stored)
log_store(facility, level, lflags, 0, printed_len += text_len;
dict, dictlen, text, text_len); else
printed_len += log_store(facility, level, lflags, 0,
dict, dictlen, text, text_len);
} }
printed_len += text_len;
/* /*
* Try to acquire and then immediately release the console semaphore. * Try to acquire and then immediately release the console semaphore.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment