diff options
Diffstat (limited to 'fs/pstore/platform.c')
-rw-r--r-- | fs/pstore/platform.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index c0d401e732e6..d897e2f11b6a 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c @@ -828,14 +828,22 @@ void pstore_get_records(int quiet) if (psi->open && psi->open(psi)) goto out; + /* + * Backend callback read() allocates record.buf. decompress_record() + * may reallocate record.buf. On success, pstore_mkfile() will keep + * the record.buf, so free it only on failure. + */ while ((record.size = psi->read(&record)) > 0) { decompress_record(&record); rc = pstore_mkfile(&record); + if (rc) { + /* pstore_mkfile() did not take buf, so free it. */ + kfree(record.buf); + if (rc != -EEXIST || !quiet) + failed++; + } - if (rc && (rc != -EEXIST || !quiet)) - failed++; - - kfree(record.buf); + /* Reset for next record. */ memset(&record, 0, sizeof(record)); record.psi = psi; } |