|
@@ -1352,71 +1352,78 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
|
|
|
{
|
|
|
char *text;
|
|
|
int len = 0;
|
|
|
+ u64 next_seq;
|
|
|
+ u64 seq;
|
|
|
+ u32 idx;
|
|
|
+
|
|
|
+ if (!buf) {
|
|
|
+ if (clear) {
|
|
|
+ logbuf_lock_irq();
|
|
|
+ clear_seq = log_next_seq;
|
|
|
+ clear_idx = log_next_idx;
|
|
|
+ logbuf_unlock_irq();
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
|
|
|
if (!text)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
logbuf_lock_irq();
|
|
|
- if (buf) {
|
|
|
- u64 next_seq;
|
|
|
- u64 seq;
|
|
|
- u32 idx;
|
|
|
+ /*
|
|
|
+ * Find first record that fits, including all following records,
|
|
|
+ * into the user-provided buffer for this dump.
|
|
|
+ */
|
|
|
+ seq = clear_seq;
|
|
|
+ idx = clear_idx;
|
|
|
+ while (seq < log_next_seq) {
|
|
|
+ struct printk_log *msg = log_from_idx(idx);
|
|
|
|
|
|
- /*
|
|
|
- * Find first record that fits, including all following records,
|
|
|
- * into the user-provided buffer for this dump.
|
|
|
- */
|
|
|
- seq = clear_seq;
|
|
|
- idx = clear_idx;
|
|
|
- while (seq < log_next_seq) {
|
|
|
- struct printk_log *msg = log_from_idx(idx);
|
|
|
-
|
|
|
- len += msg_print_text(msg, true, NULL, 0);
|
|
|
- idx = log_next(idx);
|
|
|
- seq++;
|
|
|
- }
|
|
|
+ len += msg_print_text(msg, true, NULL, 0);
|
|
|
+ idx = log_next(idx);
|
|
|
+ seq++;
|
|
|
+ }
|
|
|
|
|
|
- /* move first record forward until length fits into the buffer */
|
|
|
- seq = clear_seq;
|
|
|
- idx = clear_idx;
|
|
|
- while (len > size && seq < log_next_seq) {
|
|
|
- struct printk_log *msg = log_from_idx(idx);
|
|
|
+ /* move first record forward until length fits into the buffer */
|
|
|
+ seq = clear_seq;
|
|
|
+ idx = clear_idx;
|
|
|
+ while (len > size && seq < log_next_seq) {
|
|
|
+ struct printk_log *msg = log_from_idx(idx);
|
|
|
|
|
|
- len -= msg_print_text(msg, true, NULL, 0);
|
|
|
- idx = log_next(idx);
|
|
|
- seq++;
|
|
|
- }
|
|
|
+ len -= msg_print_text(msg, true, NULL, 0);
|
|
|
+ idx = log_next(idx);
|
|
|
+ seq++;
|
|
|
+ }
|
|
|
|
|
|
- /* last message fitting into this dump */
|
|
|
- next_seq = log_next_seq;
|
|
|
+ /* last message fitting into this dump */
|
|
|
+ next_seq = log_next_seq;
|
|
|
|
|
|
- len = 0;
|
|
|
- while (len >= 0 && seq < next_seq) {
|
|
|
- struct printk_log *msg = log_from_idx(idx);
|
|
|
- int textlen;
|
|
|
+ len = 0;
|
|
|
+ while (len >= 0 && seq < next_seq) {
|
|
|
+ struct printk_log *msg = log_from_idx(idx);
|
|
|
+ int textlen;
|
|
|
|
|
|
- textlen = msg_print_text(msg, true, text,
|
|
|
- LOG_LINE_MAX + PREFIX_MAX);
|
|
|
- if (textlen < 0) {
|
|
|
- len = textlen;
|
|
|
- break;
|
|
|
- }
|
|
|
- idx = log_next(idx);
|
|
|
- seq++;
|
|
|
+ textlen = msg_print_text(msg, true, text,
|
|
|
+ LOG_LINE_MAX + PREFIX_MAX);
|
|
|
+ if (textlen < 0) {
|
|
|
+ len = textlen;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ idx = log_next(idx);
|
|
|
+ seq++;
|
|
|
|
|
|
- logbuf_unlock_irq();
|
|
|
- if (copy_to_user(buf + len, text, textlen))
|
|
|
- len = -EFAULT;
|
|
|
- else
|
|
|
- len += textlen;
|
|
|
- logbuf_lock_irq();
|
|
|
+ logbuf_unlock_irq();
|
|
|
+ if (copy_to_user(buf + len, text, textlen))
|
|
|
+ len = -EFAULT;
|
|
|
+ else
|
|
|
+ len += textlen;
|
|
|
+ logbuf_lock_irq();
|
|
|
|
|
|
- if (seq < log_first_seq) {
|
|
|
- /* messages are gone, move to next one */
|
|
|
- seq = log_first_seq;
|
|
|
- idx = log_first_idx;
|
|
|
- }
|
|
|
+ if (seq < log_first_seq) {
|
|
|
+ /* messages are gone, move to next one */
|
|
|
+ seq = log_first_seq;
|
|
|
+ idx = log_first_idx;
|
|
|
}
|
|
|
}
|
|
|
|