[RESEND][PATCH v4 5/7] efi_pstore: Add a sequence counter to a variable name

2012-11-01 Thread Seiji Aguchi
[Issue]

Currently, a variable name, which identifies each entry, consists of type, id 
and ctime.
But if multiple events happens in a short time, a second/third event may fail 
to log because
efi_pstore can't distinguish each event with current variable name.

[Solution]

A reasonable way to identify all events precisely is introducing a sequence 
counter to
the variable name.

The sequence counter has already supported in a pstore layer with "oopscount".
So, this patch adds it to a variable name.
Also, it is passed to read/erase callbacks of platform drivers in accordance 
with
the modification of the variable name.

  
 a variable name of first event: dump-type0-1-12345678
 a variable name of second event: dump-type0-1-12345678

  type:0
  id:1
  ctime:12345678

 If multiple events happen in a short time, efi_pstore can't distinguish them 
because
 variable names are same among them.

  

 it can be distinguishable by adding a sequence counter as follows.

 a variable name of first event: dump-type0-1-1-12345678
 a variable name of Second event: dump-type0-1-2-12345678

  type:0
  id:1
  sequence counter: 1(first event), 2(second event)
  ctime:12345678

Signed-off-by: Seiji Aguchi 
Acked-by: Rafael J. Wysocki 
---
 drivers/acpi/apei/erst.c   |   12 ++--
 drivers/firmware/efivars.c |   23 ++-
 fs/pstore/inode.c  |8 +---
 fs/pstore/internal.h   |2 +-
 fs/pstore/platform.c   |   11 ++-
 fs/pstore/ram.c|7 +++
 include/linux/pstore.h |8 +---
 7 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
index 0bd6ae4..6d894bf 100644
--- a/drivers/acpi/apei/erst.c
+++ b/drivers/acpi/apei/erst.c
@@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst 
*erst_tab)
 
 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,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi);
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi);
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi);
 
 static struct pstore_info erst_info = {
@@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi)
return 0;
 }
 
-static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi)
 {
@@ -1055,7 +1055,7 @@ out:
 }
 
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi)
 {
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
@@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum 
kmsg_dump_reason reason,
return ret;
 }
 
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi)
 {
return erst_clear(id);
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 3803621..7ad3aae 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -658,13 +658,14 @@ static int efi_pstore_close(struct pstore_info *psi)
 }
 
 static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
-  struct timespec *timespec,
+  int *count, struct timespec *timespec,
   char **buf, struct pstore_info *psi)
 {
efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
struct efivars *efivars = psi->data;
char name[DUMP_NAME_LEN];
int i;
+   int cnt;
unsigned int part, size;
unsigned long time;
 
@@ -674,8 +675,10 @@ static ssize_t efi_pstore_read(u64 *id, enum 
pstore_type_id *type,
for (i = 0; i < DUMP_NAME_LEN; i++) {
name[i] = 
efivars->walk_entry->var.VariableName[i];
}
-   if (sscanf(name, "dump-type%u-%u-%lu", type, , 
) == 3) {
+   if (sscanf(name, "dump-type%u-%u-%d-%lu",
+  type, , , ) == 4) {

[RESEND][PATCH v4 5/7] efi_pstore: Add a sequence counter to a variable name

2012-11-01 Thread Seiji Aguchi
[Issue]

Currently, a variable name, which identifies each entry, consists of type, id 
and ctime.
But if multiple events happens in a short time, a second/third event may fail 
to log because
efi_pstore can't distinguish each event with current variable name.

[Solution]

A reasonable way to identify all events precisely is introducing a sequence 
counter to
the variable name.

The sequence counter has already supported in a pstore layer with oopscount.
So, this patch adds it to a variable name.
Also, it is passed to read/erase callbacks of platform drivers in accordance 
with
the modification of the variable name.

  before applying this patch
 a variable name of first event: dump-type0-1-12345678
 a variable name of second event: dump-type0-1-12345678

  type:0
  id:1
  ctime:12345678

 If multiple events happen in a short time, efi_pstore can't distinguish them 
because
 variable names are same among them.

  after applying this patch

 it can be distinguishable by adding a sequence counter as follows.

 a variable name of first event: dump-type0-1-1-12345678
 a variable name of Second event: dump-type0-1-2-12345678

  type:0
  id:1
  sequence counter: 1(first event), 2(second event)
  ctime:12345678

Signed-off-by: Seiji Aguchi seiji.agu...@hds.com
Acked-by: Rafael J. Wysocki rafael.j.wyso...@intel.com
---
 drivers/acpi/apei/erst.c   |   12 ++--
 drivers/firmware/efivars.c |   23 ++-
 fs/pstore/inode.c  |8 +---
 fs/pstore/internal.h   |2 +-
 fs/pstore/platform.c   |   11 ++-
 fs/pstore/ram.c|7 +++
 include/linux/pstore.h |8 +---
 7 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
index 0bd6ae4..6d894bf 100644
--- a/drivers/acpi/apei/erst.c
+++ b/drivers/acpi/apei/erst.c
@@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst 
*erst_tab)
 
 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,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi);
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi);
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi);
 
 static struct pstore_info erst_info = {
@@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi)
return 0;
 }
 
-static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi)
 {
@@ -1055,7 +1055,7 @@ out:
 }
 
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi)
 {
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
@@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum 
kmsg_dump_reason reason,
return ret;
 }
 
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi)
 {
return erst_clear(id);
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 3803621..7ad3aae 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -658,13 +658,14 @@ static int efi_pstore_close(struct pstore_info *psi)
 }
 
 static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
-  struct timespec *timespec,
+  int *count, struct timespec *timespec,
   char **buf, struct pstore_info *psi)
 {
efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
struct efivars *efivars = psi-data;
char name[DUMP_NAME_LEN];
int i;
+   int cnt;
unsigned int part, size;
unsigned long time;
 
@@ -674,8 +675,10 @@ static ssize_t efi_pstore_read(u64 *id, enum 
pstore_type_id *type,
for (i = 0; i  DUMP_NAME_LEN; i++) {
name[i] = 
efivars-walk_entry-var.VariableName[i];
}
-   if (sscanf(name, dump-type%u-%u-%lu, type, part, 
time) == 3) {
+   

Re: [PATCH v4 5/7] efi_pstore: Add a sequence counter to a variable name

2012-10-30 Thread Rafael J. Wysocki
On Tuesday, October 30, 2012 08:02:54 PM Seiji Aguchi wrote:
> 
> [Issue]
> 
> Currently, a variable name, which identifies each entry, consists of type, id 
> and ctime.
> But if multiple events happens in a short time, a second/third event may fail 
> to log because
> efi_pstore can't distinguish each event with current variable name.
> 
> [Solution]
> 
> A reasonable way to identify all events precisely is introducing a sequence 
> counter to
> the variable name.
> 
> The sequence counter has already supported in a pstore layer with "oopscount".
> So, this patch adds it to a variable name.
> Also, it is passed to read/erase callbacks of platform drivers in accordance 
> with
> the modification of the variable name.
> 
>   
>  a variable name of first event: dump-type0-1-12345678
>  a variable name of second event: dump-type0-1-12345678
> 
>   type:0
>   id:1
>   ctime:12345678
> 
>  If multiple events happen in a short time, efi_pstore can't distinguish them 
> because
>  variable names are same among them.
> 
>   
> 
>  it can be distinguishable by adding a sequence counter as follows.
> 
>  a variable name of first event: dump-type0-1-1-12345678
>  a variable name of Second event: dump-type0-1-2-12345678
> 
>   type:0
>   id:1
>   sequence counter: 1(first event), 2(second event)
>   ctime:12345678
> 
> Signed-off-by: Seiji Aguchi 

Please feel free to add

Acked-by: Rafael J. Wysocki 

for the erst.c change.

Thanks!


> ---
>  drivers/acpi/apei/erst.c   |   12 ++--
>  drivers/firmware/efivars.c |   23 ++-
>  fs/pstore/inode.c  |8 +---
>  fs/pstore/internal.h   |2 +-
>  fs/pstore/platform.c   |   11 ++-
>  fs/pstore/ram.c|7 +++
>  include/linux/pstore.h |8 +---
>  7 files changed, 40 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
> index 0bd6ae4..6d894bf 100644
> --- a/drivers/acpi/apei/erst.c
> +++ b/drivers/acpi/apei/erst.c
> @@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst 
> *erst_tab)
>  
>  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,
> +static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
>  struct timespec *time, char **buf,
>  struct pstore_info *psi);
>  static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason 
> reason,
> -u64 *id, unsigned int part,
> +u64 *id, unsigned int part, int count,
>  size_t size, struct pstore_info *psi);
> -static int erst_clearer(enum pstore_type_id type, u64 id,
> +static int erst_clearer(enum pstore_type_id type, u64 id, int count,
>   struct timespec time, struct pstore_info *psi);
>  
>  static struct pstore_info erst_info = {
> @@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi)
>   return 0;
>  }
>  
> -static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
> +static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
>  struct timespec *time, char **buf,
>  struct pstore_info *psi)
>  {
> @@ -1055,7 +1055,7 @@ out:
>  }
>  
>  static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason 
> reason,
> -u64 *id, unsigned int part,
> +u64 *id, unsigned int part, int count,
>  size_t size, struct pstore_info *psi)
>  {
>   struct cper_pstore_record *rcd = (struct cper_pstore_record *)
> @@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum 
> kmsg_dump_reason reason,
>   return ret;
>  }
>  
> -static int erst_clearer(enum pstore_type_id type, u64 id,
> +static int erst_clearer(enum pstore_type_id type, u64 id, int count,
>   struct timespec time, struct pstore_info *psi)
>  {
>   return erst_clear(id);
> diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
> index 3803621..7ad3aae 100644
> --- a/drivers/firmware/efivars.c
> +++ b/drivers/firmware/efivars.c
> @@ -658,13 +658,14 @@ static int efi_pstore_close(struct pstore_info *psi)
>  }
>  
>  static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
> -struct timespec *timespec,
> +int *count, struct timespec *timespec,
>  char **buf, struct pstore_info *psi)
>  {
>   efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
>   struct efivars *efivars = psi->data;
>   char name[DUMP_NAME_LEN];
>   int i;
> + int cnt;
>   unsigned int part, size;
>   unsigned long time;
>  
> @@ -674,8 +675,10 @@ static ssize_t efi_pstore_read(u64 *id, enum 
> pstore_type_id *type,
>   for (i = 0; i < 

[PATCH v4 5/7] efi_pstore: Add a sequence counter to a variable name

2012-10-30 Thread Seiji Aguchi

[Issue]

Currently, a variable name, which identifies each entry, consists of type, id 
and ctime.
But if multiple events happens in a short time, a second/third event may fail 
to log because
efi_pstore can't distinguish each event with current variable name.

[Solution]

A reasonable way to identify all events precisely is introducing a sequence 
counter to
the variable name.

The sequence counter has already supported in a pstore layer with "oopscount".
So, this patch adds it to a variable name.
Also, it is passed to read/erase callbacks of platform drivers in accordance 
with
the modification of the variable name.

  
 a variable name of first event: dump-type0-1-12345678
 a variable name of second event: dump-type0-1-12345678

  type:0
  id:1
  ctime:12345678

 If multiple events happen in a short time, efi_pstore can't distinguish them 
because
 variable names are same among them.

  

 it can be distinguishable by adding a sequence counter as follows.

 a variable name of first event: dump-type0-1-1-12345678
 a variable name of Second event: dump-type0-1-2-12345678

  type:0
  id:1
  sequence counter: 1(first event), 2(second event)
  ctime:12345678

Signed-off-by: Seiji Aguchi 
---
 drivers/acpi/apei/erst.c   |   12 ++--
 drivers/firmware/efivars.c |   23 ++-
 fs/pstore/inode.c  |8 +---
 fs/pstore/internal.h   |2 +-
 fs/pstore/platform.c   |   11 ++-
 fs/pstore/ram.c|7 +++
 include/linux/pstore.h |8 +---
 7 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
index 0bd6ae4..6d894bf 100644
--- a/drivers/acpi/apei/erst.c
+++ b/drivers/acpi/apei/erst.c
@@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst 
*erst_tab)
 
 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,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi);
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi);
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi);
 
 static struct pstore_info erst_info = {
@@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi)
return 0;
 }
 
-static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi)
 {
@@ -1055,7 +1055,7 @@ out:
 }
 
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi)
 {
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
@@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum 
kmsg_dump_reason reason,
return ret;
 }
 
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi)
 {
return erst_clear(id);
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 3803621..7ad3aae 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -658,13 +658,14 @@ static int efi_pstore_close(struct pstore_info *psi)
 }
 
 static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
-  struct timespec *timespec,
+  int *count, struct timespec *timespec,
   char **buf, struct pstore_info *psi)
 {
efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
struct efivars *efivars = psi->data;
char name[DUMP_NAME_LEN];
int i;
+   int cnt;
unsigned int part, size;
unsigned long time;
 
@@ -674,8 +675,10 @@ static ssize_t efi_pstore_read(u64 *id, enum 
pstore_type_id *type,
for (i = 0; i < DUMP_NAME_LEN; i++) {
name[i] = 
efivars->walk_entry->var.VariableName[i];
}
-   if (sscanf(name, "dump-type%u-%u-%lu", type, , 
) == 3) {
+   if (sscanf(name, "dump-type%u-%u-%d-%lu",
+  type, , , ) == 4) {

[PATCH v4 5/7] efi_pstore: Add a sequence counter to a variable name

2012-10-30 Thread Seiji Aguchi

[Issue]

Currently, a variable name, which identifies each entry, consists of type, id 
and ctime.
But if multiple events happens in a short time, a second/third event may fail 
to log because
efi_pstore can't distinguish each event with current variable name.

[Solution]

A reasonable way to identify all events precisely is introducing a sequence 
counter to
the variable name.

The sequence counter has already supported in a pstore layer with oopscount.
So, this patch adds it to a variable name.
Also, it is passed to read/erase callbacks of platform drivers in accordance 
with
the modification of the variable name.

  before applying this patch
 a variable name of first event: dump-type0-1-12345678
 a variable name of second event: dump-type0-1-12345678

  type:0
  id:1
  ctime:12345678

 If multiple events happen in a short time, efi_pstore can't distinguish them 
because
 variable names are same among them.

  after applying this patch

 it can be distinguishable by adding a sequence counter as follows.

 a variable name of first event: dump-type0-1-1-12345678
 a variable name of Second event: dump-type0-1-2-12345678

  type:0
  id:1
  sequence counter: 1(first event), 2(second event)
  ctime:12345678

Signed-off-by: Seiji Aguchi seiji.agu...@hds.com
---
 drivers/acpi/apei/erst.c   |   12 ++--
 drivers/firmware/efivars.c |   23 ++-
 fs/pstore/inode.c  |8 +---
 fs/pstore/internal.h   |2 +-
 fs/pstore/platform.c   |   11 ++-
 fs/pstore/ram.c|7 +++
 include/linux/pstore.h |8 +---
 7 files changed, 40 insertions(+), 31 deletions(-)

diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
index 0bd6ae4..6d894bf 100644
--- a/drivers/acpi/apei/erst.c
+++ b/drivers/acpi/apei/erst.c
@@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst 
*erst_tab)
 
 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,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi);
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi);
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi);
 
 static struct pstore_info erst_info = {
@@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi)
return 0;
 }
 
-static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
+static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
   struct timespec *time, char **buf,
   struct pstore_info *psi)
 {
@@ -1055,7 +1055,7 @@ out:
 }
 
 static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason,
-  u64 *id, unsigned int part,
+  u64 *id, unsigned int part, int count,
   size_t size, struct pstore_info *psi)
 {
struct cper_pstore_record *rcd = (struct cper_pstore_record *)
@@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum 
kmsg_dump_reason reason,
return ret;
 }
 
-static int erst_clearer(enum pstore_type_id type, u64 id,
+static int erst_clearer(enum pstore_type_id type, u64 id, int count,
struct timespec time, struct pstore_info *psi)
 {
return erst_clear(id);
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 3803621..7ad3aae 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -658,13 +658,14 @@ static int efi_pstore_close(struct pstore_info *psi)
 }
 
 static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
-  struct timespec *timespec,
+  int *count, struct timespec *timespec,
   char **buf, struct pstore_info *psi)
 {
efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
struct efivars *efivars = psi-data;
char name[DUMP_NAME_LEN];
int i;
+   int cnt;
unsigned int part, size;
unsigned long time;
 
@@ -674,8 +675,10 @@ static ssize_t efi_pstore_read(u64 *id, enum 
pstore_type_id *type,
for (i = 0; i  DUMP_NAME_LEN; i++) {
name[i] = 
efivars-walk_entry-var.VariableName[i];
}
-   if (sscanf(name, dump-type%u-%u-%lu, type, part, 
time) == 3) {
+   if (sscanf(name, dump-type%u-%u-%d-%lu,
+ 

Re: [PATCH v4 5/7] efi_pstore: Add a sequence counter to a variable name

2012-10-30 Thread Rafael J. Wysocki
On Tuesday, October 30, 2012 08:02:54 PM Seiji Aguchi wrote:
 
 [Issue]
 
 Currently, a variable name, which identifies each entry, consists of type, id 
 and ctime.
 But if multiple events happens in a short time, a second/third event may fail 
 to log because
 efi_pstore can't distinguish each event with current variable name.
 
 [Solution]
 
 A reasonable way to identify all events precisely is introducing a sequence 
 counter to
 the variable name.
 
 The sequence counter has already supported in a pstore layer with oopscount.
 So, this patch adds it to a variable name.
 Also, it is passed to read/erase callbacks of platform drivers in accordance 
 with
 the modification of the variable name.
 
   before applying this patch
  a variable name of first event: dump-type0-1-12345678
  a variable name of second event: dump-type0-1-12345678
 
   type:0
   id:1
   ctime:12345678
 
  If multiple events happen in a short time, efi_pstore can't distinguish them 
 because
  variable names are same among them.
 
   after applying this patch
 
  it can be distinguishable by adding a sequence counter as follows.
 
  a variable name of first event: dump-type0-1-1-12345678
  a variable name of Second event: dump-type0-1-2-12345678
 
   type:0
   id:1
   sequence counter: 1(first event), 2(second event)
   ctime:12345678
 
 Signed-off-by: Seiji Aguchi seiji.agu...@hds.com

Please feel free to add

Acked-by: Rafael J. Wysocki rafael.j.wyso...@intel.com

for the erst.c change.

Thanks!


 ---
  drivers/acpi/apei/erst.c   |   12 ++--
  drivers/firmware/efivars.c |   23 ++-
  fs/pstore/inode.c  |8 +---
  fs/pstore/internal.h   |2 +-
  fs/pstore/platform.c   |   11 ++-
  fs/pstore/ram.c|7 +++
  include/linux/pstore.h |8 +---
  7 files changed, 40 insertions(+), 31 deletions(-)
 
 diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
 index 0bd6ae4..6d894bf 100644
 --- a/drivers/acpi/apei/erst.c
 +++ b/drivers/acpi/apei/erst.c
 @@ -931,13 +931,13 @@ static int erst_check_table(struct acpi_table_erst 
 *erst_tab)
  
  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,
 +static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
  struct timespec *time, char **buf,
  struct pstore_info *psi);
  static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason 
 reason,
 -u64 *id, unsigned int part,
 +u64 *id, unsigned int part, int count,
  size_t size, struct pstore_info *psi);
 -static int erst_clearer(enum pstore_type_id type, u64 id,
 +static int erst_clearer(enum pstore_type_id type, u64 id, int count,
   struct timespec time, struct pstore_info *psi);
  
  static struct pstore_info erst_info = {
 @@ -987,7 +987,7 @@ static int erst_close_pstore(struct pstore_info *psi)
   return 0;
  }
  
 -static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
 +static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, int *count,
  struct timespec *time, char **buf,
  struct pstore_info *psi)
  {
 @@ -1055,7 +1055,7 @@ out:
  }
  
  static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason 
 reason,
 -u64 *id, unsigned int part,
 +u64 *id, unsigned int part, int count,
  size_t size, struct pstore_info *psi)
  {
   struct cper_pstore_record *rcd = (struct cper_pstore_record *)
 @@ -1101,7 +1101,7 @@ static int erst_writer(enum pstore_type_id type, enum 
 kmsg_dump_reason reason,
   return ret;
  }
  
 -static int erst_clearer(enum pstore_type_id type, u64 id,
 +static int erst_clearer(enum pstore_type_id type, u64 id, int count,
   struct timespec time, struct pstore_info *psi)
  {
   return erst_clear(id);
 diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
 index 3803621..7ad3aae 100644
 --- a/drivers/firmware/efivars.c
 +++ b/drivers/firmware/efivars.c
 @@ -658,13 +658,14 @@ static int efi_pstore_close(struct pstore_info *psi)
  }
  
  static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
 -struct timespec *timespec,
 +int *count, struct timespec *timespec,
  char **buf, struct pstore_info *psi)
  {
   efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
   struct efivars *efivars = psi-data;
   char name[DUMP_NAME_LEN];
   int i;
 + int cnt;
   unsigned int part, size;
   unsigned long time;
  
 @@ -674,8 +675,10 @@ static ssize_t efi_pstore_read(u64 *id, enum 
 pstore_type_id *type,
   for (i = 0; i  DUMP_NAME_LEN; i++) {