]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/sysfs-crash-debugging.patch
Move xen patchset to new version's subdir.
[ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / sysfs-crash-debugging.patch
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/sysfs-crash-debugging.patch b/src/patches/suse-2.6.27.31/patches.drivers/sysfs-crash-debugging.patch
new file mode 100644 (file)
index 0000000..0868b04
--- /dev/null
@@ -0,0 +1,127 @@
+Subject: display last accessed sysfs file on kernel panic message
+From: Andrew Morton <akpm@osdl.org>
+Patch-mainline: never
+
+Display the most-recently-opened sysfs file's name when oopsing.
+
+From: Adrian Bunk <bunk@stusta.de>
+
+  Build fix
+
+From: Greg Kroah-Hartman <gregkh@suse.de>
+
+  Modified to make the api call cleaner, and available to all arches if
+  need be.  Also added it to x86-64's crash dump message.
+
+
+Signed-off-by: Adrian Bunk <bunk@stusta.de>
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ arch/x86/kernel/traps_32.c |    2 ++
+ arch/x86/kernel/traps_64.c |    2 ++
+ fs/sysfs/file.c            |   14 ++++++++++++++
+ fs/sysfs/mount.c           |    2 +-
+ include/linux/sysfs.h      |    7 +++++++
+ 5 files changed, 26 insertions(+), 1 deletion(-)
+
+--- a/arch/x86/kernel/traps_32.c
++++ b/arch/x86/kernel/traps_32.c
+@@ -428,6 +428,8 @@ int __kprobes __die(const char *str, str
+       printk("DEBUG_PAGEALLOC");
+ #endif
+       printk("\n");
++
++      sysfs_printk_last_file();
+       if (notify_die(DIE_OOPS, str, regs, err,
+                       current->thread.trap_no, SIGSEGV) == NOTIFY_STOP)
+               return 1;
+--- a/arch/x86/kernel/traps_64.c
++++ b/arch/x86/kernel/traps_64.c
+@@ -537,6 +537,8 @@ int __kprobes __die(const char *str, str
+       printk("DEBUG_PAGEALLOC");
+ #endif
+       printk("\n");
++
++      sysfs_printk_last_file();
+       if (notify_die(DIE_OOPS, str, regs, err,
+                       current->thread.trap_no, SIGSEGV) == NOTIFY_STOP)
+               return 1;
+--- a/fs/sysfs/file.c
++++ b/fs/sysfs/file.c
+@@ -16,6 +16,7 @@
+ #include <linux/slab.h>
+ #include <linux/fsnotify.h>
+ #include <linux/namei.h>
++#include <linux/limits.h>
+ #include <linux/poll.h>
+ #include <linux/list.h>
+ #include <linux/mutex.h>
+@@ -23,6 +24,9 @@
+ #include "sysfs.h"
++/* used in crash dumps to help with debugging */
++static char last_sysfs_file[PATH_MAX];
++
+ /*
+  * There's one sysfs_buffer for each open file and one
+  * sysfs_open_dirent for each sysfs_dirent with one or more open
+@@ -328,6 +332,11 @@ static int sysfs_open_file(struct inode
+       struct sysfs_buffer *buffer;
+       struct sysfs_ops *ops;
+       int error = -EACCES;
++      char *p;
++
++      p = d_path(&file->f_path, last_sysfs_file, sizeof(last_sysfs_file));
++      if (p)
++              memmove(last_sysfs_file, p, strlen(p) + 1);
+       /* need attr_sd for attr and ops, its parent for kobj */
+       if (!sysfs_get_active_two(attr_sd))
+@@ -389,6 +398,11 @@ static int sysfs_open_file(struct inode
+       return error;
+ }
++void sysfs_printk_last_file(void)
++{
++      printk(KERN_EMERG "last sysfs file: %s\n", last_sysfs_file);
++}
++
+ static int sysfs_release(struct inode *inode, struct file *filp)
+ {
+       struct sysfs_dirent *sd = filp->f_path.dentry->d_fsdata;
+--- a/fs/sysfs/mount.c
++++ b/fs/sysfs/mount.c
+@@ -22,7 +22,7 @@
+ /* Random magic number */
+ #define SYSFS_MAGIC 0x62656572
+-static struct vfsmount *sysfs_mount;
++struct vfsmount *sysfs_mount;
+ struct super_block * sysfs_sb = NULL;
+ struct kmem_cache *sysfs_dir_cachep;
+--- a/include/linux/sysfs.h
++++ b/include/linux/sysfs.h
+@@ -121,6 +121,8 @@ void sysfs_notify(struct kobject *kobj,
+ extern int __must_check sysfs_init(void);
++void sysfs_printk_last_file(void);
++
+ #else /* CONFIG_SYSFS */
+ static inline int sysfs_schedule_callback(struct kobject *kobj,
+@@ -231,6 +233,11 @@ static inline int __must_check sysfs_ini
+       return 0;
+ }
++static inline void sysfs_printk_last_file(void)
++{
++      ;
++}
++
+ #endif /* CONFIG_SYSFS */
+ #endif /* _SYSFS_H_ */