Skip to content

Commit

Permalink
pstore: Add extra context for writes and erases
Browse files Browse the repository at this point in the history
EFI only provides small amounts of individual storage, and conventionally
puts metadata in the storage variable name. Rather than add a metadata
header to the (already limited) variable storage, it's easier for us to
modify pstore to pass all the information we need to construct a unique
variable name to the appropriate functions.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
  • Loading branch information
Matthew Garrett authored and Tony Luck committed Jul 22, 2011
1 parent 638c1fd commit 5628068
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 12 deletions.
10 changes: 6 additions & 4 deletions drivers/acpi/apei/erst.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,9 +933,10 @@ static int erst_open_pstore(struct pstore_info *psi);
static int erst_close_pstore(struct pstore_info *psi);
static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
struct timespec *time, struct pstore_info *psi);
static u64 erst_writer(enum pstore_type_id type, size_t size,
static u64 erst_writer(enum pstore_type_id type, int part, size_t size,
struct pstore_info *psi);
static int erst_clearer(u64 id, struct pstore_info *psi);
static int erst_clearer(enum pstore_type_id type, u64 id,
struct pstore_info *psi);

static struct pstore_info erst_info = {
.owner = THIS_MODULE,
Expand Down Expand Up @@ -1039,7 +1040,7 @@ static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
return (rc < 0) ? rc : (len - sizeof(*rcd));
}

static u64 erst_writer(enum pstore_type_id type, size_t size,
static u64 erst_writer(enum pstore_type_id type, int part, size_t size,
struct pstore_info *psi)
{
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
Expand Down Expand Up @@ -1083,7 +1084,8 @@ static u64 erst_writer(enum pstore_type_id type, size_t size,
return rcd->hdr.record_id;
}

static int erst_clearer(u64 id, struct pstore_info *psi)
static int erst_clearer(enum pstore_type_id type, u64 id,
struct pstore_info *psi)
{
return erst_clear(id);
}
Expand Down
6 changes: 4 additions & 2 deletions fs/pstore/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@
#define PSTORE_NAMELEN 64

struct pstore_private {
u64 id;
struct pstore_info *psi;
enum pstore_type_id type;
u64 id;
ssize_t size;
char data[];
};
Expand Down Expand Up @@ -73,7 +74,7 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry)
{
struct pstore_private *p = dentry->d_inode->i_private;

p->psi->erase(p->id, p->psi);
p->psi->erase(p->type, p->id, p->psi);

return simple_unlink(dir, dentry);
}
Expand Down Expand Up @@ -192,6 +193,7 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id,
private = kmalloc(sizeof *private + size, GFP_KERNEL);
if (!private)
goto fail_alloc;
private->type = type;
private->id = id;
private->psi = psi;

Expand Down
9 changes: 5 additions & 4 deletions fs/pstore/platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
oopscount++;
while (total < kmsg_bytes) {
dst = psinfo->buf;
hsize = sprintf(dst, "%s#%d Part%d\n", why, oopscount, part++);
hsize = sprintf(dst, "%s#%d Part%d\n", why, oopscount, part);
size = psinfo->bufsize - hsize;
dst += hsize;

Expand All @@ -94,15 +94,16 @@ static void pstore_dump(struct kmsg_dumper *dumper,
memcpy(dst, s1 + s1_start, l1_cpy);
memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy);

id = psinfo->write(PSTORE_TYPE_DMESG, hsize + l1_cpy + l2_cpy,
psinfo);
id = psinfo->write(PSTORE_TYPE_DMESG, part,
hsize + l1_cpy + l2_cpy, psinfo);
if (reason == KMSG_DUMP_OOPS && pstore_is_mounted())
pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id,
psinfo->buf, hsize + l1_cpy + l2_cpy,
CURRENT_TIME, psinfo);
l1 -= l1_cpy;
l2 -= l2_cpy;
total += l1_cpy + l2_cpy;
part++;
}
mutex_unlock(&psinfo->buf_mutex);
}
Expand Down Expand Up @@ -197,7 +198,7 @@ int pstore_write(enum pstore_type_id type, char *buf, size_t size)

mutex_lock(&psinfo->buf_mutex);
memcpy(psinfo->buf, buf, size);
id = psinfo->write(type, size, psinfo);
id = psinfo->write(type, 0, size, psinfo);
if (pstore_is_mounted())
pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, psinfo->buf,
size, CURRENT_TIME, psinfo);
Expand Down
5 changes: 3 additions & 2 deletions include/linux/pstore.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ struct pstore_info {
int (*close)(struct pstore_info *psi);
ssize_t (*read)(u64 *id, enum pstore_type_id *type,
struct timespec *time, struct pstore_info *psi);
u64 (*write)(enum pstore_type_id type, size_t size,
u64 (*write)(enum pstore_type_id type, int part,
size_t size, struct pstore_info *psi);
int (*erase)(enum pstore_type_id type, u64 id,
struct pstore_info *psi);
int (*erase)(u64 id, struct pstore_info *psi);
void *data;
};

Expand Down

0 comments on commit 5628068

Please sign in to comment.