Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
3935bb94
Commit
3935bb94
authored
May 20, 2011
by
Tony Luck
Browse files
Options
Browse Files
Download
Plain Diff
Pull pstore into release branch
parents
61c4f2c8
5d2a8342
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
58 additions
and
20 deletions
+58
-20
drivers/acpi/apei/Kconfig
drivers/acpi/apei/Kconfig
+1
-0
drivers/acpi/apei/erst.c
drivers/acpi/apei/erst.c
+45
-16
fs/pstore/platform.c
fs/pstore/platform.c
+9
-3
include/linux/pstore.h
include/linux/pstore.h
+3
-1
No files found.
drivers/acpi/apei/Kconfig
View file @
3935bb94
config ACPI_APEI
config ACPI_APEI
bool "ACPI Platform Error Interface (APEI)"
bool "ACPI Platform Error Interface (APEI)"
select MISC_FILESYSTEMS
select PSTORE
select PSTORE
depends on X86
depends on X86
help
help
...
...
drivers/acpi/apei/erst.c
View file @
3935bb94
...
@@ -929,13 +929,17 @@ static int erst_check_table(struct acpi_table_erst *erst_tab)
...
@@ -929,13 +929,17 @@ static int erst_check_table(struct acpi_table_erst *erst_tab)
return
0
;
return
0
;
}
}
static
size_t
erst_reader
(
u64
*
id
,
enum
pstore_type_id
*
type
,
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
timespec
*
time
);
static
u64
erst_writer
(
enum
pstore_type_id
type
,
size_t
size
);
static
u64
erst_writer
(
enum
pstore_type_id
type
,
size_t
size
);
static
struct
pstore_info
erst_info
=
{
static
struct
pstore_info
erst_info
=
{
.
owner
=
THIS_MODULE
,
.
owner
=
THIS_MODULE
,
.
name
=
"erst"
,
.
name
=
"erst"
,
.
open
=
erst_open_pstore
,
.
close
=
erst_close_pstore
,
.
read
=
erst_reader
,
.
read
=
erst_reader
,
.
write
=
erst_writer
,
.
write
=
erst_writer
,
.
erase
=
erst_clear
.
erase
=
erst_clear
...
@@ -957,12 +961,32 @@ struct cper_pstore_record {
...
@@ -957,12 +961,32 @@ struct cper_pstore_record {
char
data
[];
char
data
[];
}
__packed
;
}
__packed
;
static
size_t
erst_reader
(
u64
*
id
,
enum
pstore_type_id
*
type
,
static
int
reader_pos
;
static
int
erst_open_pstore
(
struct
pstore_info
*
psi
)
{
int
rc
;
if
(
erst_disable
)
return
-
ENODEV
;
rc
=
erst_get_record_id_begin
(
&
reader_pos
);
return
rc
;
}
static
int
erst_close_pstore
(
struct
pstore_info
*
psi
)
{
erst_get_record_id_end
();
return
0
;
}
static
ssize_t
erst_reader
(
u64
*
id
,
enum
pstore_type_id
*
type
,
struct
timespec
*
time
)
struct
timespec
*
time
)
{
{
int
rc
;
int
rc
;
ssize_t
len
;
ssize_t
len
=
0
;
unsigned
long
flags
;
u64
record_id
;
u64
record_id
;
struct
cper_pstore_record
*
rcd
=
(
struct
cper_pstore_record
*
)
struct
cper_pstore_record
*
rcd
=
(
struct
cper_pstore_record
*
)
(
erst_info
.
buf
-
sizeof
(
*
rcd
));
(
erst_info
.
buf
-
sizeof
(
*
rcd
));
...
@@ -970,24 +994,28 @@ static size_t erst_reader(u64 *id, enum pstore_type_id *type,
...
@@ -970,24 +994,28 @@ static size_t erst_reader(u64 *id, enum pstore_type_id *type,
if
(
erst_disable
)
if
(
erst_disable
)
return
-
ENODEV
;
return
-
ENODEV
;
raw_spin_lock_irqsave
(
&
erst_lock
,
flags
);
skip:
skip:
rc
=
__erst_get_next_record_id
(
&
record_id
);
rc
=
erst_get_record_id_next
(
&
reader_pos
,
&
record_id
);
if
(
rc
)
{
if
(
rc
)
raw_spin_unlock_irqrestore
(
&
erst_lock
,
flags
);
goto
out
;
return
rc
;
}
/* no more record */
/* no more record */
if
(
record_id
==
APEI_ERST_INVALID_RECORD_ID
)
{
if
(
record_id
==
APEI_ERST_INVALID_RECORD_ID
)
{
r
aw_spin_unlock_irqrestore
(
&
erst_lock
,
flags
)
;
r
c
=
-
1
;
return
0
;
goto
out
;
}
}
len
=
__erst_read
(
record_id
,
&
rcd
->
hdr
,
sizeof
(
*
rcd
)
+
len
=
erst_read
(
record_id
,
&
rcd
->
hdr
,
sizeof
(
*
rcd
)
+
erst_erange
.
size
);
erst_info
.
bufsize
);
/* The record may be cleared by others, try read next record */
if
(
len
==
-
ENOENT
)
goto
skip
;
else
if
(
len
<
0
)
{
rc
=
-
1
;
goto
out
;
}
if
(
uuid_le_cmp
(
rcd
->
hdr
.
creator_id
,
CPER_CREATOR_PSTORE
)
!=
0
)
if
(
uuid_le_cmp
(
rcd
->
hdr
.
creator_id
,
CPER_CREATOR_PSTORE
)
!=
0
)
goto
skip
;
goto
skip
;
raw_spin_unlock_irqrestore
(
&
erst_lock
,
flags
);
*
id
=
record_id
;
*
id
=
record_id
;
if
(
uuid_le_cmp
(
rcd
->
sec_hdr
.
section_type
,
if
(
uuid_le_cmp
(
rcd
->
sec_hdr
.
section_type
,
...
@@ -1005,7 +1033,8 @@ static size_t erst_reader(u64 *id, enum pstore_type_id *type,
...
@@ -1005,7 +1033,8 @@ static size_t erst_reader(u64 *id, enum pstore_type_id *type,
time
->
tv_sec
=
0
;
time
->
tv_sec
=
0
;
time
->
tv_nsec
=
0
;
time
->
tv_nsec
=
0
;
return
len
-
sizeof
(
*
rcd
);
out:
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
,
size_t
size
)
...
...
fs/pstore/platform.c
View file @
3935bb94
...
@@ -152,21 +152,27 @@ EXPORT_SYMBOL_GPL(pstore_register);
...
@@ -152,21 +152,27 @@ EXPORT_SYMBOL_GPL(pstore_register);
void
pstore_get_records
(
void
)
void
pstore_get_records
(
void
)
{
{
struct
pstore_info
*
psi
=
psinfo
;
struct
pstore_info
*
psi
=
psinfo
;
size_t
size
;
s
s
ize_t
size
;
u64
id
;
u64
id
;
enum
pstore_type_id
type
;
enum
pstore_type_id
type
;
struct
timespec
time
;
struct
timespec
time
;
int
failed
=
0
;
int
failed
=
0
,
rc
;
if
(
!
psi
)
if
(
!
psi
)
return
;
return
;
mutex_lock
(
&
psinfo
->
buf_mutex
);
mutex_lock
(
&
psinfo
->
buf_mutex
);
rc
=
psi
->
open
(
psi
);
if
(
rc
)
goto
out
;
while
((
size
=
psi
->
read
(
&
id
,
&
type
,
&
time
))
>
0
)
{
while
((
size
=
psi
->
read
(
&
id
,
&
type
,
&
time
))
>
0
)
{
if
(
pstore_mkfile
(
type
,
psi
->
name
,
id
,
psi
->
buf
,
size
,
if
(
pstore_mkfile
(
type
,
psi
->
name
,
id
,
psi
->
buf
,
(
size_t
)
size
,
time
,
psi
->
erase
))
time
,
psi
->
erase
))
failed
++
;
failed
++
;
}
}
psi
->
close
(
psi
);
out:
mutex_unlock
(
&
psinfo
->
buf_mutex
);
mutex_unlock
(
&
psinfo
->
buf_mutex
);
if
(
failed
)
if
(
failed
)
...
...
include/linux/pstore.h
View file @
3935bb94
...
@@ -35,7 +35,9 @@ struct pstore_info {
...
@@ -35,7 +35,9 @@ struct pstore_info {
struct
mutex
buf_mutex
;
/* serialize access to 'buf' */
struct
mutex
buf_mutex
;
/* serialize access to 'buf' */
char
*
buf
;
char
*
buf
;
size_t
bufsize
;
size_t
bufsize
;
size_t
(
*
read
)(
u64
*
id
,
enum
pstore_type_id
*
type
,
int
(
*
open
)(
struct
pstore_info
*
psi
);
int
(
*
close
)(
struct
pstore_info
*
psi
);
ssize_t
(
*
read
)(
u64
*
id
,
enum
pstore_type_id
*
type
,
struct
timespec
*
time
);
struct
timespec
*
time
);
u64
(
*
write
)(
enum
pstore_type_id
type
,
size_t
size
);
u64
(
*
write
)(
enum
pstore_type_id
type
,
size_t
size
);
int
(
*
erase
)(
u64
id
);
int
(
*
erase
)(
u64
id
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment