diff options
Diffstat (limited to 'kernel/printk/printk.c')
| -rw-r--r-- | kernel/printk/printk.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 4dae9cbe9259..a45b50962295 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c | |||
| @@ -319,7 +319,7 @@ static void log_store(int facility, int level, | |||
| 319 | else | 319 | else |
| 320 | free = log_first_idx - log_next_idx; | 320 | free = log_first_idx - log_next_idx; |
| 321 | 321 | ||
| 322 | if (free > size + sizeof(struct printk_log)) | 322 | if (free >= size + sizeof(struct printk_log)) |
| 323 | break; | 323 | break; |
| 324 | 324 | ||
| 325 | /* drop old messages until we have enough contiuous space */ | 325 | /* drop old messages until we have enough contiuous space */ |
| @@ -327,7 +327,7 @@ static void log_store(int facility, int level, | |||
| 327 | log_first_seq++; | 327 | log_first_seq++; |
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | if (log_next_idx + size + sizeof(struct printk_log) >= log_buf_len) { | 330 | if (log_next_idx + size + sizeof(struct printk_log) > log_buf_len) { |
| 331 | /* | 331 | /* |
| 332 | * This message + an additional empty header does not fit | 332 | * This message + an additional empty header does not fit |
| 333 | * at the end of the buffer. Add an empty header with len == 0 | 333 | * at the end of the buffer. Add an empty header with len == 0 |
| @@ -351,7 +351,7 @@ static void log_store(int facility, int level, | |||
| 351 | else | 351 | else |
| 352 | msg->ts_nsec = local_clock(); | 352 | msg->ts_nsec = local_clock(); |
| 353 | memset(log_dict(msg) + dict_len, 0, pad_len); | 353 | memset(log_dict(msg) + dict_len, 0, pad_len); |
| 354 | msg->len = sizeof(struct printk_log) + text_len + dict_len + pad_len; | 354 | msg->len = size; |
| 355 | 355 | ||
| 356 | /* insert message */ | 356 | /* insert message */ |
| 357 | log_next_idx += msg->len; | 357 | log_next_idx += msg->len; |
| @@ -1560,9 +1560,12 @@ asmlinkage int vprintk_emit(int facility, int level, | |||
| 1560 | level = kern_level - '0'; | 1560 | level = kern_level - '0'; |
| 1561 | case 'd': /* KERN_DEFAULT */ | 1561 | case 'd': /* KERN_DEFAULT */ |
| 1562 | lflags |= LOG_PREFIX; | 1562 | lflags |= LOG_PREFIX; |
| 1563 | case 'c': /* KERN_CONT */ | ||
| 1564 | break; | ||
| 1565 | } | 1563 | } |
| 1564 | /* | ||
| 1565 | * No need to check length here because vscnprintf | ||
| 1566 | * put '\0' at the end of the string. Only valid and | ||
| 1567 | * newly printed level is detected. | ||
| 1568 | */ | ||
| 1566 | text_len -= end_of_header - text; | 1569 | text_len -= end_of_header - text; |
| 1567 | text = (char *)end_of_header; | 1570 | text = (char *)end_of_header; |
| 1568 | } | 1571 | } |
| @@ -1880,6 +1883,7 @@ void suspend_console(void) | |||
| 1880 | console_lock(); | 1883 | console_lock(); |
| 1881 | console_suspended = 1; | 1884 | console_suspended = 1; |
| 1882 | up(&console_sem); | 1885 | up(&console_sem); |
| 1886 | mutex_release(&console_lock_dep_map, 1, _RET_IP_); | ||
| 1883 | } | 1887 | } |
| 1884 | 1888 | ||
| 1885 | void resume_console(void) | 1889 | void resume_console(void) |
| @@ -1887,6 +1891,7 @@ void resume_console(void) | |||
| 1887 | if (!console_suspend_enabled) | 1891 | if (!console_suspend_enabled) |
| 1888 | return; | 1892 | return; |
| 1889 | down(&console_sem); | 1893 | down(&console_sem); |
| 1894 | mutex_acquire(&console_lock_dep_map, 0, 0, _RET_IP_); | ||
| 1890 | console_suspended = 0; | 1895 | console_suspended = 0; |
| 1891 | console_unlock(); | 1896 | console_unlock(); |
| 1892 | } | 1897 | } |
