Merge tag 'pstore-v4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull pstore updates from Kees Cook: "This has a large internal refactoring along with several smaller fixes. - constify compression structures; Bhumika Goyal - restore powerpc dumping; Ankit Kumar - fix more bugs in the rarely exercises module unloading logic - reorganize filesystem locking to fix problems noticed by lockdep - refactor internal pstore APIs to make development and review easier: - improve error reporting - add kernel-doc structure and function comments - avoid insane argument passing by using a common record structure" * tag 'pstore-v4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: (23 commits) pstore: Solve lockdep warning by moving inode locks pstore: Fix flags to enable dumps on powerpc pstore: Remove unused vmalloc.h in pmsg pstore: simplify write_user_compat() pstore: Remove write_buf() callback pstore: Replace arguments for write_buf_user() API pstore: Replace arguments for write_buf() API pstore: Replace arguments for erase() API pstore: Do not duplicate record metadata pstore: Allocate records on heap instead of stack pstore: Pass record contents instead of copying pstore: Always allocate buffer for decompression pstore: Replace arguments for write() API pstore: Replace arguments for read() API pstore: Switch pstore_mkfile to pass record pstore: Move record decompression to function pstore: Extract common arguments into structure pstore: Add kernel-doc for struct pstore_info pstore: Improve register_pstore() error reporting pstore: Avoid race in module unloading ...
This commit is contained in:
@@ -389,51 +389,40 @@ static int nvram_pstore_open(struct pstore_info *psi)
|
||||
|
||||
/**
|
||||
* nvram_pstore_write - pstore write callback for nvram
|
||||
* @type: Type of message logged
|
||||
* @reason: reason behind dump (oops/panic)
|
||||
* @id: identifier to indicate the write performed
|
||||
* @part: pstore writes data to registered buffer in parts,
|
||||
* part number will indicate the same.
|
||||
* @count: Indicates oops count
|
||||
* @compressed: Flag to indicate the log is compressed
|
||||
* @size: number of bytes written to the registered buffer
|
||||
* @psi: registered pstore_info structure
|
||||
* @record: pstore record to write, with @id to be set
|
||||
*
|
||||
* Called by pstore_dump() when an oops or panic report is logged in the
|
||||
* printk buffer.
|
||||
* Returns 0 on successful write.
|
||||
*/
|
||||
static int nvram_pstore_write(enum pstore_type_id type,
|
||||
enum kmsg_dump_reason reason,
|
||||
u64 *id, unsigned int part, int count,
|
||||
bool compressed, size_t size,
|
||||
struct pstore_info *psi)
|
||||
static int nvram_pstore_write(struct pstore_record *record)
|
||||
{
|
||||
int rc;
|
||||
unsigned int err_type = ERR_TYPE_KERNEL_PANIC;
|
||||
struct oops_log_info *oops_hdr = (struct oops_log_info *) oops_buf;
|
||||
|
||||
/* part 1 has the recent messages from printk buffer */
|
||||
if (part > 1 || (type != PSTORE_TYPE_DMESG))
|
||||
if (record->part > 1 || (record->type != PSTORE_TYPE_DMESG))
|
||||
return -1;
|
||||
|
||||
if (clobbering_unread_rtas_event())
|
||||
return -1;
|
||||
|
||||
oops_hdr->version = cpu_to_be16(OOPS_HDR_VERSION);
|
||||
oops_hdr->report_length = cpu_to_be16(size);
|
||||
oops_hdr->report_length = cpu_to_be16(record->size);
|
||||
oops_hdr->timestamp = cpu_to_be64(ktime_get_real_seconds());
|
||||
|
||||
if (compressed)
|
||||
if (record->compressed)
|
||||
err_type = ERR_TYPE_KERNEL_PANIC_GZ;
|
||||
|
||||
rc = nvram_write_os_partition(&oops_log_partition, oops_buf,
|
||||
(int) (sizeof(*oops_hdr) + size), err_type, count);
|
||||
(int) (sizeof(*oops_hdr) + record->size), err_type,
|
||||
record->count);
|
||||
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
||||
*id = part;
|
||||
record->id = record->part;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -442,10 +431,7 @@ static int nvram_pstore_write(enum pstore_type_id type,
|
||||
* Returns the length of the data we read from each partition.
|
||||
* Returns 0 if we've been called before.
|
||||
*/
|
||||
static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
|
||||
int *count, struct timespec *time, char **buf,
|
||||
bool *compressed, ssize_t *ecc_notice_size,
|
||||
struct pstore_info *psi)
|
||||
static ssize_t nvram_pstore_read(struct pstore_record *record)
|
||||
{
|
||||
struct oops_log_info *oops_hdr;
|
||||
unsigned int err_type, id_no, size = 0;
|
||||
@@ -459,40 +445,40 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
|
||||
switch (nvram_type_ids[read_type]) {
|
||||
case PSTORE_TYPE_DMESG:
|
||||
part = &oops_log_partition;
|
||||
*type = PSTORE_TYPE_DMESG;
|
||||
record->type = PSTORE_TYPE_DMESG;
|
||||
break;
|
||||
case PSTORE_TYPE_PPC_COMMON:
|
||||
sig = NVRAM_SIG_SYS;
|
||||
part = &common_partition;
|
||||
*type = PSTORE_TYPE_PPC_COMMON;
|
||||
*id = PSTORE_TYPE_PPC_COMMON;
|
||||
time->tv_sec = 0;
|
||||
time->tv_nsec = 0;
|
||||
record->type = PSTORE_TYPE_PPC_COMMON;
|
||||
record->id = PSTORE_TYPE_PPC_COMMON;
|
||||
record->time.tv_sec = 0;
|
||||
record->time.tv_nsec = 0;
|
||||
break;
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
case PSTORE_TYPE_PPC_RTAS:
|
||||
part = &rtas_log_partition;
|
||||
*type = PSTORE_TYPE_PPC_RTAS;
|
||||
time->tv_sec = last_rtas_event;
|
||||
time->tv_nsec = 0;
|
||||
record->type = PSTORE_TYPE_PPC_RTAS;
|
||||
record->time.tv_sec = last_rtas_event;
|
||||
record->time.tv_nsec = 0;
|
||||
break;
|
||||
case PSTORE_TYPE_PPC_OF:
|
||||
sig = NVRAM_SIG_OF;
|
||||
part = &of_config_partition;
|
||||
*type = PSTORE_TYPE_PPC_OF;
|
||||
*id = PSTORE_TYPE_PPC_OF;
|
||||
time->tv_sec = 0;
|
||||
time->tv_nsec = 0;
|
||||
record->type = PSTORE_TYPE_PPC_OF;
|
||||
record->id = PSTORE_TYPE_PPC_OF;
|
||||
record->time.tv_sec = 0;
|
||||
record->time.tv_nsec = 0;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
case PSTORE_TYPE_PPC_OPAL:
|
||||
sig = NVRAM_SIG_FW;
|
||||
part = &skiboot_partition;
|
||||
*type = PSTORE_TYPE_PPC_OPAL;
|
||||
*id = PSTORE_TYPE_PPC_OPAL;
|
||||
time->tv_sec = 0;
|
||||
time->tv_nsec = 0;
|
||||
record->type = PSTORE_TYPE_PPC_OPAL;
|
||||
record->id = PSTORE_TYPE_PPC_OPAL;
|
||||
record->time.tv_sec = 0;
|
||||
record->time.tv_nsec = 0;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
@@ -520,10 +506,10 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
|
||||
return 0;
|
||||
}
|
||||
|
||||
*count = 0;
|
||||
record->count = 0;
|
||||
|
||||
if (part->os_partition)
|
||||
*id = id_no;
|
||||
record->id = id_no;
|
||||
|
||||
if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) {
|
||||
size_t length, hdr_size;
|
||||
@@ -533,34 +519,35 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
|
||||
/* Old format oops header had 2-byte record size */
|
||||
hdr_size = sizeof(u16);
|
||||
length = be16_to_cpu(oops_hdr->version);
|
||||
time->tv_sec = 0;
|
||||
time->tv_nsec = 0;
|
||||
record->time.tv_sec = 0;
|
||||
record->time.tv_nsec = 0;
|
||||
} else {
|
||||
hdr_size = sizeof(*oops_hdr);
|
||||
length = be16_to_cpu(oops_hdr->report_length);
|
||||
time->tv_sec = be64_to_cpu(oops_hdr->timestamp);
|
||||
time->tv_nsec = 0;
|
||||
record->time.tv_sec = be64_to_cpu(oops_hdr->timestamp);
|
||||
record->time.tv_nsec = 0;
|
||||
}
|
||||
*buf = kmemdup(buff + hdr_size, length, GFP_KERNEL);
|
||||
record->buf = kmemdup(buff + hdr_size, length, GFP_KERNEL);
|
||||
kfree(buff);
|
||||
if (*buf == NULL)
|
||||
if (record->buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
*ecc_notice_size = 0;
|
||||
record->ecc_notice_size = 0;
|
||||
if (err_type == ERR_TYPE_KERNEL_PANIC_GZ)
|
||||
*compressed = true;
|
||||
record->compressed = true;
|
||||
else
|
||||
*compressed = false;
|
||||
record->compressed = false;
|
||||
return length;
|
||||
}
|
||||
|
||||
*buf = buff;
|
||||
record->buf = buff;
|
||||
return part->size;
|
||||
}
|
||||
|
||||
static struct pstore_info nvram_pstore_info = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "nvram",
|
||||
.flags = PSTORE_FLAGS_DMESG,
|
||||
.open = nvram_pstore_open,
|
||||
.read = nvram_pstore_read,
|
||||
.write = nvram_pstore_write,
|
||||
|
Reference in New Issue
Block a user