From: Lin Feng Shen <shenlinf(a)cn.ibm.com>
dump_swap_info() invokes get_pathname() to get the file name of swap
device.
If swap_vfsmnt isn't defined but old_block_size is defined in kernel
struct
swap_info_struct(e.g. 2.6 kernel), 0 is passed as vfsmnt to
get_pathname().
In this case, get_pathname() won't go up to the parent vfsmnt, so the file
name of swap space is shown incompletely.
Here is an example. crash-4.0-25 was installed and udev was mounted on
/dev
in sles10. Swap /dev/sda2 was active before kdump. sub-command "swap" in
crash command showed an incomplete swap file name.
---------------
crash> swap
FILENAME TYPE SIZE USED PCT PRIORITY
/sda2 PARTITION 2104504k 0k 0% -1
---------------
The solution is to retrieve vfsmnt from swap_file just as file_to_dentry()
does to get dentry, and then pass it to get_pathname().
Signed-off-by: Lin Feng Shen <shenlinf(a)cn.ibm.com>
---
diff -ruNp crash-4.0-2.18.orig/defs.h crash-4.0-2.18/defs.h
--- crash-4.0-2.18.orig/defs.h 2006-06-02 02:51:15.000000000 -0400
+++ crash-4.0-2.18/defs.h 2006-06-02 03:06:17.000000000 -0400
@@ -3031,6 +3031,7 @@ void close_tmpfile2(void);
void open_files_dump(ulong, int, struct reference *);
void get_pathname(ulong, char *, int, int, ulong);
ulong file_to_dentry(ulong);
+ulong file_to_vfsmnt(ulong);
void nlm_files_dump(void);
int get_proc_version(void);
int file_checksum(char *, long *);
diff -ruNp crash-4.0-2.18.orig/filesys.c crash-4.0-2.18/filesys.c
--- crash-4.0-2.18.orig/filesys.c 2006-06-02 02:51:14.000000000
-0400
+++ crash-4.0-2.18/filesys.c 2006-06-02 03:11:34.000000000 -0400
@@ -2544,6 +2544,20 @@ file_to_dentry(ulong file)
}
/*
+ * Get the vfsmnt associated with a file.
+ */
+ulong
+file_to_vfsmnt(ulong file)
+{
+ char *file_buf;
+ ulong vfsmnt;
+
+ file_buf = fill_file_cache(file);
+ vfsmnt = ULONG(file_buf + OFFSET(file_f_vfsmnt));
+ return vfsmnt;
+}
+
+/*
* get_pathname() fills in a pathname string for an ending dentry
* See __d_path() in the kernel for help fixing problems.
*/
diff -ruNp crash-4.0-2.18.orig/memory.c crash-4.0-2.18/memory.c
--- crash-4.0-2.18.orig/memory.c 2006-06-02 02:51:15.000000000
-0400
+++ crash-4.0-2.18/memory.c 2006-06-02 03:06:31.000000000 -0400
@@ -10293,7 +10293,7 @@ dump_swap_info(ulong swapflags, ulong *t
} else if (VALID_MEMBER
(swap_info_struct_old_block_size)) {
get_pathname(file_to_dentry(swap_file),
- buf, BUFSIZE, 1, 0);
+ buf, BUFSIZE, 1,
file_to_vfsmnt(swap_file));
} else {
get_pathname(swap_file, buf, BUFSIZE, 1,
0);
}