2
* jprobe module for debugging eCryptfs file create operations
5
#include <linux/module.h>
6
#include <linux/init.h>
7
#include <linux/kprobes.h>
8
#include <linux/kallsyms.h>
11
#include <linux/namei.h>
13
struct jprobe_mapping_elem {
19
int jp_ecryptfs_create(struct inode *directory_inode,
20
struct dentry *ecryptfs_dentry,
21
int mode, struct nameidata *nd)
23
printk(KERN_INFO "%s: directory_inode = [0x%p]; ecryptfs_dentry = [0x%p]; mode = [%.8x]; nd = [0x%p]\n", __FUNCTION__, directory_inode, ecryptfs_dentry, mode, nd);
28
int jp_ecryptfs_do_create(struct inode *directory_inode,
29
struct dentry *ecryptfs_dentry, int mode,
32
printk(KERN_INFO "%s: directory_inode = [0x%p]; ecryptfs_dentry = [0x%p]; mode = [%.4x]; nd = [0x%p]\n", __FUNCTION__, directory_inode, ecryptfs_dentry, mode, nd);
37
int jp_ecryptfs_create_underlying_file(struct inode *lower_dir_inode,
38
struct dentry *lower_dentry,
39
struct dentry *ecryptfs_dentry, int mode,
42
printk(KERN_INFO "%s: lower_dir_inode = [0x%p]; lower_dentry = [0x%p]; ecryptfs_dentry = [0x%p]; mode = [%.8x]; nd = [0x%p]\n", __FUNCTION__, lower_dir_inode, lower_dentry, ecryptfs_dentry, mode, nd);
43
printk(KERN_INFO "%s: Calling vfs_create()\n", __FUNCTION__);
48
int jp_ecryptfs_interpose(struct dentry *lower_dentry, struct dentry *dentry,
49
struct super_block *sb, int flag)
51
printk(KERN_INFO "%s: lower_dentry = [0x%p]; dentry = [0x%p]; sb = [0x%p]; flag = [0x%.8x]\n", __FUNCTION__, lower_dentry, dentry, sb, flag);
56
int jp_ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
58
printk(KERN_INFO "%s: ecryptfs_dentry = [0x%p]\n", __FUNCTION__, ecryptfs_dentry);
63
int jp_ecryptfs_new_file_context(struct dentry *ecryptfs_dentry)
65
printk(KERN_INFO "%s: ecryptfs_dentry = [0x%p]\n", __FUNCTION__, ecryptfs_dentry);
70
/* ecryptfs_set_default_crypt_stat_vals */
71
/* ecryptfs_generate_new_key */
72
/* ecryptfs_init_crypt_ctx */
74
int jp_ecryptfs_write_headers(struct dentry *ecryptfs_dentry,
75
struct file *lower_file)
77
printk(KERN_INFO "%s: ecryptfs_dentry = [0x%p]; lower_file = [0x%p]\n", __FUNCTION__, ecryptfs_dentry, lower_file);
82
struct ecryptfs_crypt_stat;
84
int jp_ecryptfs_write_headers_virt(char *page_virt,
85
struct ecryptfs_crypt_stat *crypt_stat,
86
struct dentry *ecryptfs_dentry)
88
printk(KERN_INFO "%s: page_virt = [0x%p]; crypt_stat = [0x%p]; ecryptfs_dentry = [0x%p]\n", __FUNCTION__, page_virt, crypt_stat, ecryptfs_dentry);
93
int jp_grow_file(struct dentry *ecryptfs_dentry, struct file *lower_file,
94
struct inode *inode, struct inode *lower_inode)
96
printk(KERN_INFO "%s: ecryptfs_dentry = [0x%p]; lower_file = [0x%p]; inode = [0x%p]; lower_inode = [0x%p]\n", __FUNCTION__, ecryptfs_dentry, lower_file, inode, lower_inode);
101
int jp_ecryptfs_fill_zeros(struct file *file, loff_t new_length)
103
printk(KERN_INFO "%s: file = [0x%p]; new_length = [%llu]\n", __FUNCTION__, file, new_length);
111
jp_ecryptfs_write_inode_size_to_header(struct file *lower_file,
112
struct inode *lower_inode,
115
printk(KERN_INFO "%s: lower_file = [0x%p]; lower_inode = [0x%p]; inode = [0x%p]\n", __FUNCTION__, lower_file, lower_inode, inode);
121
int jp_ecryptfs_grab_and_map_lower_page(struct page **lower_page,
123
struct inode *lower_inode,
124
unsigned long lower_page_index)
126
printk(KERN_INFO "%s: lower_page = [0x%p]; lower_virt = [0x%p]; lower_inode = [0x%p]; lower_page_index = [%lu]\n", __FUNCTION__, lower_page, lower_virt, lower_inode, lower_page_index);
131
void jp_ecryptfs_unmap_and_release_lower_page(struct page *lower_page)
133
printk(KERN_INFO "%s: lower_page = [0x%p]\n", __FUNCTION__, lower_page);
138
int jp_ecryptfs_commit_write(struct file *file, struct page *page,
139
unsigned from, unsigned to)
141
printk(KERN_INFO "%s: file = [0x%p]; page = [0x%p]; page->mapping = [0x%p]\n", __FUNCTION__, file, page, page->mapping);
147
jp_ecryptfs_permission(struct inode *inode, int mask, struct nameidata *nd)
149
printk(KERN_INFO "%s: inode = [0x%p]; mask = [0x%.8x]; nd = [0x%p]\n", __FUNCTION__, inode, mask, nd);
151
printk(KERN_INFO "%s: nd->dentry = [0x%p]\n", __FUNCTION__,
154
printk(KERN_INFO "%s: nd->dentry->d_fsdata = [0x%p]\n",
155
__FUNCTION__, nd->dentry->d_fsdata);
161
struct dentry *jp_ecryptfs_lookup(struct inode *dir, struct dentry *dentry,
162
struct nameidata *nd)
164
printk(KERN_INFO "%s: dir = [0x%p]; dentry = [0x%p]; nd = [0x%p]\n",
165
__FUNCTION__, dir, dentry, nd);
166
printk(KERN_INFO "%s: dentry->d_name.name = [%s]\n",
167
__FUNCTION__, dentry->d_name.name);
172
struct jprobe_mapping_elem jprobe_mapping[] = {
173
{NULL, "ecryptfs_create", jp_ecryptfs_create},
174
{NULL, "ecryptfs_do_create", jp_ecryptfs_do_create},
175
{NULL, "ecryptfs_create_underlying_file", jp_ecryptfs_create_underlying_file},
176
{NULL, "ecryptfs_interpose", jp_ecryptfs_interpose},
177
{NULL, "ecryptfs_initialize_file", jp_ecryptfs_initialize_file},
178
{NULL, "ecryptfs_new_file_context", jp_ecryptfs_new_file_context},
179
{NULL, "ecryptfs_write_headers", jp_ecryptfs_write_headers},
180
{NULL, "ecryptfs_write_headers_virt", jp_ecryptfs_write_headers_virt},
181
{NULL, "grow_file", jp_grow_file},
182
{NULL, "ecryptfs_fill_zeros", jp_ecryptfs_fill_zeros},
183
{NULL, "ecryptfs_write_inode_size_to_header", jp_ecryptfs_write_inode_size_to_header},
184
{NULL, "ecryptfs_grab_and_map_lower_page", jp_ecryptfs_grab_and_map_lower_page},
185
{NULL, "ecryptfs_unmap_and_release_lower_page", jp_ecryptfs_unmap_and_release_lower_page},
186
{NULL, "ecryptfs_commit_write", jp_ecryptfs_commit_write},
187
{NULL, "ecryptfs_permission", jp_ecryptfs_permission},
188
{NULL, "ecryptfs_lookup", jp_ecryptfs_lookup}
191
static int __init jprobe_create_init(void)
195
for (i = 0; i < ARRAY_SIZE(jprobe_mapping); i++) {
196
jprobe_mapping[i].jp = kmalloc(sizeof(struct jprobe),
198
jprobe_mapping[i].jp->entry = jprobe_mapping[i].fp;
199
jprobe_mapping[i].jp->kp.addr = (kprobe_opcode_t *)
200
kallsyms_lookup_name(jprobe_mapping[i].symbol);
201
if (jprobe_mapping[i].jp->kp.addr == NULL) {
204
printk(KERN_NOTICE "Unable to find symbol [%s]\n",
205
jprobe_mapping[i].symbol);
206
for (j = 0; j < i; j++) {
207
unregister_jprobe(jprobe_mapping[j].jp);
208
kfree(jprobe_mapping[j].jp);
212
register_jprobe(jprobe_mapping[i].jp);
217
static void __exit jprobe_create_exit(void)
221
for (i = 0; i < ARRAY_SIZE(jprobe_mapping); i++) {
222
unregister_jprobe(jprobe_mapping[i].jp);
223
kfree(jprobe_mapping[i].jp);
227
module_init(jprobe_create_init);
228
module_exit(jprobe_create_exit);
229
MODULE_LICENSE("GPL");