2
* jprobe module for debugging eCryptfs mount operations
5
#include <linux/module.h>
6
#include <linux/init.h>
7
#include <linux/kprobes.h>
8
#include <linux/kallsyms.h>
10
#include <linux/mount.h>
12
struct jprobe_mapping_elem {
18
struct ecryptfs_crypt_stat {
22
/* file private data. */
23
struct ecryptfs_file_info {
24
struct file *wfi_file;
25
struct ecryptfs_crypt_stat *crypt_stat;
28
static inline struct ecryptfs_file_info *
29
ecryptfs_file_to_private(struct file *file)
31
return (struct ecryptfs_file_info *)file->private_data;
34
static inline struct file *ecryptfs_file_to_lower(struct file *file)
36
return ((struct ecryptfs_file_info *)file->private_data)->wfi_file;
39
/* inode private data. */
40
struct ecryptfs_inode_info {
41
struct inode *wii_inode;
42
struct inode vfs_inode;
43
struct ecryptfs_crypt_stat crypt_stat;
46
static inline struct inode *ecryptfs_inode_to_lower(struct inode *inode)
48
return ((struct ecryptfs_inode_info *)inode->i_private)->wii_inode;
51
int jp_ecryptfs_release(struct inode *inode, struct file *file)
53
struct file *lower_file = ecryptfs_file_to_lower(file);
54
struct ecryptfs_file_info *file_info = ecryptfs_file_to_private(file);
55
struct inode *lower_inode = ecryptfs_inode_to_lower(inode);
59
inode->i_blocks = lower_inode->i_blocks;
60
kmem_cache_free(ecryptfs_file_info_cache, file_info); */
61
printk(KERN_INFO "%s: inode = [0x%p]; file = [0x%p]; lower_file = "
62
"[0x%p]; file_info = [0x%p]; lower_inode = [0x%p]\n",
63
__FUNCTION__, inode, file, lower_file, file_info, lower_inode);
64
fcnt = atomic_read(&lower_file->f_count);
65
printk(KERN_INFO "%s: lower_file->f_count = [%d]\n", __FUNCTION__,
71
struct jprobe_mapping_elem jprobe_mapping[] = {
72
{NULL, "ecryptfs_release", jp_ecryptfs_release},
75
static int __init jprobe_mount_init(void)
79
for (i = 0; i < ARRAY_SIZE(jprobe_mapping); i++) {
80
jprobe_mapping[i].jp = kmalloc(sizeof(struct jprobe),
82
jprobe_mapping[i].jp->entry = jprobe_mapping[i].fp;
83
jprobe_mapping[i].jp->kp.addr = (kprobe_opcode_t *)
84
kallsyms_lookup_name(jprobe_mapping[i].symbol);
85
if (jprobe_mapping[i].jp->kp.addr == NULL) {
88
printk(KERN_NOTICE "Unable to find symbol [%s]\n",
89
jprobe_mapping[i].symbol);
90
for (j = 0; j < i; j++) {
91
unregister_jprobe(jprobe_mapping[j].jp);
92
kfree(jprobe_mapping[j].jp);
96
register_jprobe(jprobe_mapping[i].jp);
101
static void __exit jprobe_mount_exit(void)
105
for (i = 0; i < ARRAY_SIZE(jprobe_mapping); i++) {
106
unregister_jprobe(jprobe_mapping[i].jp);
107
kfree(jprobe_mapping[i].jp);
111
module_init(jprobe_mount_init);
112
module_exit(jprobe_mount_exit);
113
MODULE_LICENSE("GPL");