Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 115952
b: refs/heads/master
c: 85a0ee3
h: refs/heads/master
v: v3
  • Loading branch information
Simon Horman authored and Linus Torvalds committed Oct 20, 2008
1 parent a0ef2e3 commit 935dee7
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 630bf20747e27391b20f137a5be2edb4235ca8fa
refs/heads/master: 85a0ee342e0c06c19d78fdf48307211c6cf18fcb
4 changes: 2 additions & 2 deletions trunk/arch/ia64/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,11 +509,11 @@ int __init reserve_elfcorehdr(unsigned long *start, unsigned long *end)
* to work properly.
*/

if (elfcorehdr_addr >= ELFCORE_ADDR_MAX)
if (!is_vmcore_usable())
return -EINVAL;

if ((length = vmcore_find_descriptor_size(elfcorehdr_addr)) == 0) {
elfcorehdr_addr = ELFCORE_ADDR_MAX;
vmcore_unusable();
return -EINVAL;
}

Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/proc/vmcore.c
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ static int __init vmcore_init(void)
int rc = 0;

/* If elfcorehdr= has been passed in cmdline, then capture the dump.*/
if (!(elfcorehdr_addr < ELFCORE_ADDR_MAX))
if (!(is_vmcore_usable()))
return rc;
rc = parse_crash_elf_headers();
if (rc) {
Expand Down
24 changes: 24 additions & 0 deletions trunk/include/linux/crash_dump.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <linux/proc_fs.h>

#define ELFCORE_ADDR_MAX (-1ULL)
#define ELFCORE_ADDR_ERR (-2ULL)

extern unsigned long long elfcorehdr_addr;

Expand Down Expand Up @@ -38,6 +39,29 @@ static inline int is_kdump_kernel(void)
{
return (elfcorehdr_addr != ELFCORE_ADDR_MAX) ? 1 : 0;
}

/* is_vmcore_usable() checks if the kernel is booting after a panic and
* the vmcore region is usable.
*
* This makes use of the fact that due to alignment -2ULL is not
* a valid pointer, much in the vain of IS_ERR(), except
* dealing directly with an unsigned long long rather than a pointer.
*/

static inline int is_vmcore_usable(void)
{
return is_kdump_kernel() && elfcorehdr_addr != ELFCORE_ADDR_ERR ? 1 : 0;
}

/* vmcore_unusable() marks the vmcore as unusable,
* without disturbing the logic of is_kdump_kernel()
*/

static inline void vmcore_unusable(void)
{
if (is_kdump_kernel())
elfcorehdr_addr = ELFCORE_ADDR_ERR;
}
#else /* !CONFIG_CRASH_DUMP */
static inline int is_kdump_kernel(void) { return 0; }
#endif /* CONFIG_CRASH_DUMP */
Expand Down

0 comments on commit 935dee7

Please sign in to comment.