1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
/*
FUSE: Filesystem in Userspace
Copyright (C) 2001 Miklos Szeredi (mszeredi@inf.bme.hu)
This program can be distributed under the terms of the GNU GPL.
See the file COPYING.
*/
#include "fuse_i.h"
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/smp_lock.h>
#include <linux/poll.h>
#include <linux/file.h>
#include <linux/proc_fs.h>
static struct proc_dir_entry *proc_fs_fuse;
struct proc_dir_entry *proc_fuse_dev;
static ssize_t fuse_dev_read(struct file *file, char *buf, size_t nbytes,
loff_t *off)
{
printk(KERN_DEBUG "fuse_dev_read\n");
return 0;
}
static ssize_t fuse_dev_write(struct file *file, const char *buf,
size_t nbytes, loff_t *off)
{
printk(KERN_DEBUG "fuse_dev_write <%.*s>\n", (int) nbytes, buf);
return nbytes;
}
static unsigned int fuse_dev_poll(struct file *file, poll_table *wait)
{
printk(KERN_DEBUG "fuse_dev_poll\n");
return 0;
}
static int fuse_dev_open(struct inode *inode, struct file *file)
{
int res;
struct fuse_conn *fc;
printk(KERN_DEBUG "fuse_dev_open\n");
res = -ENOMEM;
fc = kmalloc(sizeof(*fc), GFP_KERNEL);
if(!fc)
goto out;
fc->sb = NULL;
fc->file = file;
lock_kernel();
file->private_data = fc;
unlock_kernel();
res = 0;
out:
return res;
}
static int fuse_dev_release(struct inode *inode, struct file *file)
{
struct fuse_conn *fc = file->private_data;
printk(KERN_DEBUG "fuse_dev_release\n");
lock_kernel();
fc->file = NULL;
fuse_release_conn(fc);
unlock_kernel();
return 0;
}
static struct file_operations fuse_dev_operations = {
owner: THIS_MODULE,
read: fuse_dev_read,
write: fuse_dev_write,
poll: fuse_dev_poll,
open: fuse_dev_open,
release: fuse_dev_release,
};
int fuse_dev_init()
{
int res;
proc_fs_fuse = NULL;
proc_fuse_dev = NULL;
res = -EIO;
proc_fs_fuse = proc_mkdir("fuse", proc_root_fs);
if(!proc_fs_fuse) {
printk("fuse: failed to create directory in /proc/fs\n");
goto err;
}
proc_fs_fuse->owner = THIS_MODULE;
proc_fuse_dev = create_proc_entry("dev", S_IFSOCK | S_IRUGO | S_IWUGO,
proc_fs_fuse);
if(!proc_fuse_dev) {
printk("fuse: failed to create entry in /proc/fs/fuse\n");
goto err;
}
proc_fuse_dev->proc_fops = &fuse_dev_operations;
return 0;
err:
fuse_dev_cleanup();
return res;
}
void fuse_dev_cleanup()
{
if(proc_fs_fuse) {
remove_proc_entry("dev", proc_fs_fuse);
remove_proc_entry("fuse", proc_root_fs);
}
}
/*
* Local Variables:
* indent-tabs-mode: t
* c-basic-offset: 8
* End:
*/
|