inode.c (334f485df85ac7736ebe14940bf0a059c5f26d7d) inode.c (e5e5558e923f35839108a12718494ecb73fb782f)
1/*
2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.hu>
4
5 This program can be distributed under the terms of the GNU GPL.
6 See the file COPYING.
7*/
8

--- 37 unchanged lines hidden (view full) ---

46
47 inode = kmem_cache_alloc(fuse_inode_cachep, SLAB_KERNEL);
48 if (!inode)
49 return NULL;
50
51 fi = get_fuse_inode(inode);
52 fi->i_time = jiffies - 1;
53 fi->nodeid = 0;
1/*
2 FUSE: Filesystem in Userspace
3 Copyright (C) 2001-2005 Miklos Szeredi <miklos@szeredi.hu>
4
5 This program can be distributed under the terms of the GNU GPL.
6 See the file COPYING.
7*/
8

--- 37 unchanged lines hidden (view full) ---

46
47 inode = kmem_cache_alloc(fuse_inode_cachep, SLAB_KERNEL);
48 if (!inode)
49 return NULL;
50
51 fi = get_fuse_inode(inode);
52 fi->i_time = jiffies - 1;
53 fi->nodeid = 0;
54 fi->forget_req = fuse_request_alloc();
55 if (!fi->forget_req) {
56 kmem_cache_free(fuse_inode_cachep, inode);
57 return NULL;
58 }
54
55 return inode;
56}
57
58static void fuse_destroy_inode(struct inode *inode)
59{
59
60 return inode;
61}
62
63static void fuse_destroy_inode(struct inode *inode)
64{
65 struct fuse_inode *fi = get_fuse_inode(inode);
66 if (fi->forget_req)
67 fuse_request_free(fi->forget_req);
60 kmem_cache_free(fuse_inode_cachep, inode);
61}
62
63static void fuse_read_inode(struct inode *inode)
64{
65 /* No op */
66}
67
68 kmem_cache_free(fuse_inode_cachep, inode);
69}
70
71static void fuse_read_inode(struct inode *inode)
72{
73 /* No op */
74}
75
76void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,
77 unsigned long nodeid, int version)
78{
79 struct fuse_forget_in *inarg = &req->misc.forget_in;
80 inarg->version = version;
81 req->in.h.opcode = FUSE_FORGET;
82 req->in.h.nodeid = nodeid;
83 req->in.numargs = 1;
84 req->in.args[0].size = sizeof(struct fuse_forget_in);
85 req->in.args[0].value = inarg;
86 request_send_noreply(fc, req);
87}
88
68static void fuse_clear_inode(struct inode *inode)
69{
89static void fuse_clear_inode(struct inode *inode)
90{
91 struct fuse_conn *fc = get_fuse_conn(inode);
92 if (fc) {
93 struct fuse_inode *fi = get_fuse_inode(inode);
94 fuse_send_forget(fc, fi->forget_req, fi->nodeid, inode->i_version);
95 fi->forget_req = NULL;
96 }
70}
71
72void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr)
73{
74 if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size)
75 invalidate_inode_pages(inode->i_mapping);
76
77 inode->i_ino = attr->ino;

--- 11 unchanged lines hidden (view full) ---

89 inode->i_ctime.tv_sec = attr->ctime;
90 inode->i_ctime.tv_nsec = attr->ctimensec;
91}
92
93static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr)
94{
95 inode->i_mode = attr->mode & S_IFMT;
96 i_size_write(inode, attr->size);
97}
98
99void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr)
100{
101 if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size)
102 invalidate_inode_pages(inode->i_mapping);
103
104 inode->i_ino = attr->ino;

--- 11 unchanged lines hidden (view full) ---

116 inode->i_ctime.tv_sec = attr->ctime;
117 inode->i_ctime.tv_nsec = attr->ctimensec;
118}
119
120static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr)
121{
122 inode->i_mode = attr->mode & S_IFMT;
123 i_size_write(inode, attr->size);
124 if (S_ISREG(inode->i_mode)) {
125 fuse_init_common(inode);
126 } else if (S_ISDIR(inode->i_mode))
127 fuse_init_dir(inode);
128 else if (S_ISLNK(inode->i_mode))
129 fuse_init_symlink(inode);
130 else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
131 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
132 fuse_init_common(inode);
133 init_special_inode(inode, inode->i_mode,
134 new_decode_dev(attr->rdev));
135 } else {
136 /* Don't let user create weird files */
137 inode->i_mode = S_IFREG;
138 fuse_init_common(inode);
139 }
97}
98
99static int fuse_inode_eq(struct inode *inode, void *_nodeidp)
100{
101 unsigned long nodeid = *(unsigned long *) _nodeidp;
102 if (get_node_id(inode) == nodeid)
103 return 1;
104 else

--- 48 unchanged lines hidden (view full) ---

153 fc->user_id = 0;
154 /* Flush all readers on this fs */
155 wake_up_all(&fc->waitq);
156 fuse_release_conn(fc);
157 *get_fuse_conn_super_p(sb) = NULL;
158 spin_unlock(&fuse_lock);
159}
160
140}
141
142static int fuse_inode_eq(struct inode *inode, void *_nodeidp)
143{
144 unsigned long nodeid = *(unsigned long *) _nodeidp;
145 if (get_node_id(inode) == nodeid)
146 return 1;
147 else

--- 48 unchanged lines hidden (view full) ---

196 fc->user_id = 0;
197 /* Flush all readers on this fs */
198 wake_up_all(&fc->waitq);
199 fuse_release_conn(fc);
200 *get_fuse_conn_super_p(sb) = NULL;
201 spin_unlock(&fuse_lock);
202}
203
204static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr)
205{
206 stbuf->f_type = FUSE_SUPER_MAGIC;
207 stbuf->f_bsize = attr->bsize;
208 stbuf->f_blocks = attr->blocks;
209 stbuf->f_bfree = attr->bfree;
210 stbuf->f_bavail = attr->bavail;
211 stbuf->f_files = attr->files;
212 stbuf->f_ffree = attr->ffree;
213 stbuf->f_namelen = attr->namelen;
214 /* fsid is left zero */
215}
216
217static int fuse_statfs(struct super_block *sb, struct kstatfs *buf)
218{
219 struct fuse_conn *fc = get_fuse_conn_super(sb);
220 struct fuse_req *req;
221 struct fuse_statfs_out outarg;
222 int err;
223
224 req = fuse_get_request(fc);
225 if (!req)
226 return -ERESTARTSYS;
227
228 req->in.numargs = 0;
229 req->in.h.opcode = FUSE_STATFS;
230 req->out.numargs = 1;
231 req->out.args[0].size = sizeof(outarg);
232 req->out.args[0].value = &outarg;
233 request_send(fc, req);
234 err = req->out.h.error;
235 if (!err)
236 convert_fuse_statfs(buf, &outarg.st);
237 fuse_put_request(fc, req);
238 return err;
239}
240
161enum {
162 OPT_FD,
163 OPT_ROOTMODE,
164 OPT_USER_ID,
165 OPT_DEFAULT_PERMISSIONS,
166 OPT_ALLOW_OTHER,
167 OPT_ALLOW_ROOT,
168 OPT_KERNEL_CACHE,

--- 144 unchanged lines hidden (view full) ---

313}
314
315static struct super_operations fuse_super_operations = {
316 .alloc_inode = fuse_alloc_inode,
317 .destroy_inode = fuse_destroy_inode,
318 .read_inode = fuse_read_inode,
319 .clear_inode = fuse_clear_inode,
320 .put_super = fuse_put_super,
241enum {
242 OPT_FD,
243 OPT_ROOTMODE,
244 OPT_USER_ID,
245 OPT_DEFAULT_PERMISSIONS,
246 OPT_ALLOW_OTHER,
247 OPT_ALLOW_ROOT,
248 OPT_KERNEL_CACHE,

--- 144 unchanged lines hidden (view full) ---

393}
394
395static struct super_operations fuse_super_operations = {
396 .alloc_inode = fuse_alloc_inode,
397 .destroy_inode = fuse_destroy_inode,
398 .read_inode = fuse_read_inode,
399 .clear_inode = fuse_clear_inode,
400 .put_super = fuse_put_super,
401 .statfs = fuse_statfs,
321 .show_options = fuse_show_options,
322};
323
324static int inc_mount_count(void)
325{
326 int success = 0;
327 spin_lock(&fuse_lock);
328 mount_count ++;

--- 148 unchanged lines hidden ---
402 .show_options = fuse_show_options,
403};
404
405static int inc_mount_count(void)
406{
407 int success = 0;
408 spin_lock(&fuse_lock);
409 mount_count ++;

--- 148 unchanged lines hidden ---