
From: Kees Cook <keescook@chromium.org> stable inclusion from stable-5.10 category: feature commit:df9bf19d88965758c700f46ef75110336fea8654 issue: #I4919J -------------------------------- This changes the ftrace record merging code to be agnostic of pstore/ram, as the first step to making it available as a generic routine for other backends to use, such as pstore/zone. Link: https://lore.kernel.org/lkml/20200510202436.63222-6-keescook@chromium.org/ Signed-off-by: Kees Cook <keescook@chromium.org> (cherry picked from commit df9bf19d88965758c700f46ef75110336fea8654) Signed-off-by: roger <kongzhengrong@huawei.com> --- fs/pstore/ram.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index 44e3823b7354..89bd5d479b33 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -182,8 +182,9 @@ static bool prz_ok(struct persistent_ram_zone *prz) persistent_ram_ecc_string(prz, NULL, 0)); } -static ssize_t ftrace_log_combine(struct persistent_ram_zone *dest, - struct persistent_ram_zone *src) +static +ssize_t ftrace_log_combine(char **dest_log, size_t *dest_log_size, + const char *src_log, size_t src_log_size) { size_t dest_size, src_size, total, dest_off, src_off; size_t dest_idx = 0, src_idx = 0, merged_idx = 0; @@ -191,19 +192,19 @@ static ssize_t ftrace_log_combine(struct persistent_ram_zone *dest, struct pstore_ftrace_record *drec, *srec, *mrec; size_t record_size = sizeof(struct pstore_ftrace_record); - dest_off = dest->old_log_size % record_size; - dest_size = dest->old_log_size - dest_off; + dest_off = *dest_log_size % record_size; + dest_size = *dest_log_size - dest_off; - src_off = src->old_log_size % record_size; - src_size = src->old_log_size - src_off; + src_off = src_log_size % record_size; + src_size = src_log_size - src_off; total = dest_size + src_size; merged_buf = kmalloc(total, GFP_KERNEL); if (!merged_buf) return -ENOMEM; - drec = (struct pstore_ftrace_record *)(dest->old_log + dest_off); - srec = (struct pstore_ftrace_record *)(src->old_log + src_off); + drec = (struct pstore_ftrace_record *)(*dest_log + dest_off); + srec = (struct pstore_ftrace_record *)(src_log + src_off); mrec = (struct pstore_ftrace_record *)(merged_buf); while (dest_size > 0 && src_size > 0) { @@ -227,9 +228,9 @@ static ssize_t ftrace_log_combine(struct persistent_ram_zone *dest, src_size -= record_size; } - kfree(dest->old_log); - dest->old_log = merged_buf; - dest->old_log_size = total; + kfree(*dest_log); + *dest_log = merged_buf; + *dest_log_size = total; return 0; } @@ -305,7 +306,11 @@ static ssize_t ramoops_pstore_read(struct pstore_record *record) tmp_prz->corrected_bytes += prz_next->corrected_bytes; tmp_prz->bad_blocks += prz_next->bad_blocks; - size = ftrace_log_combine(tmp_prz, prz_next); + + size = ftrace_log_combine(&tmp_prz->old_log, + &tmp_prz->old_log_size, + prz_next->old_log, + prz_next->old_log_size); if (size) goto out; } -- 2.17.1