[PATCH] fuse: move INIT handling to inode.c
[deliverable/linux.git] / fs / fuse / dir.c
CommitLineData
e5e5558e
MS
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
9#include "fuse_i.h"
10
11#include <linux/pagemap.h>
12#include <linux/file.h>
13#include <linux/gfp.h>
14#include <linux/sched.h>
15#include <linux/namei.h>
16
6f9f1180
MS
17/*
18 * FUSE caches dentries and attributes with separate timeout. The
19 * time in jiffies until the dentry/attributes are valid is stored in
20 * dentry->d_time and fuse_inode->i_time respectively.
21 */
22
23/*
24 * Calculate the time in jiffies until a dentry/attributes are valid
25 */
8bfc016d 26static unsigned long time_to_jiffies(unsigned long sec, unsigned long nsec)
e5e5558e
MS
27{
28 struct timespec ts = {sec, nsec};
29 return jiffies + timespec_to_jiffies(&ts);
30}
31
6f9f1180
MS
32/*
33 * Set dentry and possibly attribute timeouts from the lookup/mk*
34 * replies
35 */
0aa7c699
MS
36static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o)
37{
0aa7c699 38 entry->d_time = time_to_jiffies(o->entry_valid, o->entry_valid_nsec);
8cbdf1e6
MS
39 if (entry->d_inode)
40 get_fuse_inode(entry->d_inode)->i_time =
41 time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
42}
43
6f9f1180
MS
44/*
45 * Mark the attributes as stale, so that at the next call to
46 * ->getattr() they will be fetched from userspace
47 */
8cbdf1e6
MS
48void fuse_invalidate_attr(struct inode *inode)
49{
50 get_fuse_inode(inode)->i_time = jiffies - 1;
51}
52
6f9f1180
MS
53/*
54 * Just mark the entry as stale, so that a next attempt to look it up
55 * will result in a new lookup call to userspace
56 *
57 * This is called when a dentry is about to become negative and the
58 * timeout is unknown (unlink, rmdir, rename and in some cases
59 * lookup)
60 */
8cbdf1e6
MS
61static void fuse_invalidate_entry_cache(struct dentry *entry)
62{
63 entry->d_time = jiffies - 1;
64}
65
6f9f1180
MS
66/*
67 * Same as fuse_invalidate_entry_cache(), but also try to remove the
68 * dentry from the hash
69 */
8cbdf1e6
MS
70static void fuse_invalidate_entry(struct dentry *entry)
71{
72 d_invalidate(entry);
73 fuse_invalidate_entry_cache(entry);
0aa7c699
MS
74}
75
e5e5558e
MS
76static void fuse_lookup_init(struct fuse_req *req, struct inode *dir,
77 struct dentry *entry,
78 struct fuse_entry_out *outarg)
79{
80 req->in.h.opcode = FUSE_LOOKUP;
81 req->in.h.nodeid = get_node_id(dir);
82 req->inode = dir;
83 req->in.numargs = 1;
84 req->in.args[0].size = entry->d_name.len + 1;
85 req->in.args[0].value = entry->d_name.name;
86 req->out.numargs = 1;
87 req->out.args[0].size = sizeof(struct fuse_entry_out);
88 req->out.args[0].value = outarg;
89}
90
6f9f1180
MS
91/*
92 * Check whether the dentry is still valid
93 *
94 * If the entry validity timeout has expired and the dentry is
95 * positive, try to redo the lookup. If the lookup results in a
96 * different inode, then let the VFS invalidate the dentry and redo
97 * the lookup once more. If the lookup results in the same inode,
98 * then refresh the attributes, timeouts and mark the dentry valid.
99 */
e5e5558e
MS
100static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
101{
8cbdf1e6
MS
102 struct inode *inode = entry->d_inode;
103
104 if (inode && is_bad_inode(inode))
e5e5558e
MS
105 return 0;
106 else if (time_after(jiffies, entry->d_time)) {
107 int err;
e5e5558e 108 struct fuse_entry_out outarg;
8cbdf1e6
MS
109 struct fuse_conn *fc;
110 struct fuse_req *req;
111
6f9f1180 112 /* Doesn't hurt to "reset" the validity timeout */
8cbdf1e6
MS
113 fuse_invalidate_entry_cache(entry);
114 if (!inode)
115 return 0;
116
117 fc = get_fuse_conn(inode);
118 req = fuse_get_request(fc);
e5e5558e
MS
119 if (!req)
120 return 0;
121
122 fuse_lookup_init(req, entry->d_parent->d_inode, entry, &outarg);
7c352bdf 123 request_send(fc, req);
e5e5558e 124 err = req->out.h.error;
9e6268db 125 if (!err) {
8cbdf1e6 126 struct fuse_inode *fi = get_fuse_inode(inode);
9e6268db
MS
127 if (outarg.nodeid != get_node_id(inode)) {
128 fuse_send_forget(fc, req, outarg.nodeid, 1);
129 return 0;
130 }
131 fi->nlookup ++;
132 }
e5e5558e 133 fuse_put_request(fc, req);
9e6268db 134 if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
e5e5558e
MS
135 return 0;
136
137 fuse_change_attributes(inode, &outarg.attr);
0aa7c699 138 fuse_change_timeout(entry, &outarg);
e5e5558e
MS
139 }
140 return 1;
141}
142
6f9f1180
MS
143/*
144 * Check if there's already a hashed alias of this directory inode.
145 * If yes, then lookup and mkdir must not create a new alias.
146 */
f007d5c9
MS
147static int dir_alias(struct inode *inode)
148{
149 if (S_ISDIR(inode->i_mode)) {
f007d5c9
MS
150 struct dentry *alias = d_find_alias(inode);
151 if (alias) {
152 dput(alias);
153 return 1;
154 }
155 }
156 return 0;
157}
158
8bfc016d 159static int invalid_nodeid(u64 nodeid)
2827d0b2
MS
160{
161 return !nodeid || nodeid == FUSE_ROOT_ID;
162}
163
e5e5558e
MS
164static struct dentry_operations fuse_dentry_operations = {
165 .d_revalidate = fuse_dentry_revalidate,
166};
167
8bfc016d 168static int valid_mode(int m)
39ee059a
MS
169{
170 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
171 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
172}
173
0aa7c699
MS
174static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
175 struct nameidata *nd)
e5e5558e
MS
176{
177 int err;
e5e5558e
MS
178 struct fuse_entry_out outarg;
179 struct inode *inode = NULL;
180 struct fuse_conn *fc = get_fuse_conn(dir);
181 struct fuse_req *req;
182
183 if (entry->d_name.len > FUSE_NAME_MAX)
0aa7c699 184 return ERR_PTR(-ENAMETOOLONG);
e5e5558e
MS
185
186 req = fuse_get_request(fc);
187 if (!req)
0aa7c699 188 return ERR_PTR(-EINTR);
e5e5558e
MS
189
190 fuse_lookup_init(req, dir, entry, &outarg);
191 request_send(fc, req);
e5e5558e 192 err = req->out.h.error;
39ee059a
MS
193 if (!err && ((outarg.nodeid && invalid_nodeid(outarg.nodeid)) ||
194 !valid_mode(outarg.attr.mode)))
ee4e5271 195 err = -EIO;
8cbdf1e6 196 if (!err && outarg.nodeid) {
e5e5558e 197 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
9e6268db 198 &outarg.attr);
e5e5558e 199 if (!inode) {
9e6268db 200 fuse_send_forget(fc, req, outarg.nodeid, 1);
0aa7c699 201 return ERR_PTR(-ENOMEM);
e5e5558e
MS
202 }
203 }
204 fuse_put_request(fc, req);
205 if (err && err != -ENOENT)
0aa7c699 206 return ERR_PTR(err);
e5e5558e 207
0aa7c699
MS
208 if (inode && dir_alias(inode)) {
209 iput(inode);
210 return ERR_PTR(-EIO);
e5e5558e 211 }
0aa7c699 212 d_add(entry, inode);
e5e5558e 213 entry->d_op = &fuse_dentry_operations;
8cbdf1e6 214 if (!err)
0aa7c699 215 fuse_change_timeout(entry, &outarg);
8cbdf1e6
MS
216 else
217 fuse_invalidate_entry_cache(entry);
0aa7c699 218 return NULL;
e5e5558e
MS
219}
220
6f9f1180
MS
221/*
222 * Atomic create+open operation
223 *
224 * If the filesystem doesn't support this, then fall back to separate
225 * 'mknod' + 'open' requests.
226 */
fd72faac
MS
227static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
228 struct nameidata *nd)
229{
230 int err;
231 struct inode *inode;
232 struct fuse_conn *fc = get_fuse_conn(dir);
233 struct fuse_req *req;
234 struct fuse_open_in inarg;
235 struct fuse_open_out outopen;
236 struct fuse_entry_out outentry;
fd72faac
MS
237 struct fuse_file *ff;
238 struct file *file;
239 int flags = nd->intent.open.flags - 1;
240
241 err = -ENOSYS;
242 if (fc->no_create)
243 goto out;
244
fd72faac
MS
245 err = -EINTR;
246 req = fuse_get_request(fc);
247 if (!req)
248 goto out;
249
250 ff = fuse_file_alloc();
251 if (!ff)
252 goto out_put_request;
253
254 flags &= ~O_NOCTTY;
255 memset(&inarg, 0, sizeof(inarg));
256 inarg.flags = flags;
257 inarg.mode = mode;
258 req->in.h.opcode = FUSE_CREATE;
259 req->in.h.nodeid = get_node_id(dir);
260 req->inode = dir;
261 req->in.numargs = 2;
262 req->in.args[0].size = sizeof(inarg);
263 req->in.args[0].value = &inarg;
264 req->in.args[1].size = entry->d_name.len + 1;
265 req->in.args[1].value = entry->d_name.name;
266 req->out.numargs = 2;
267 req->out.args[0].size = sizeof(outentry);
268 req->out.args[0].value = &outentry;
269 req->out.args[1].size = sizeof(outopen);
270 req->out.args[1].value = &outopen;
271 request_send(fc, req);
272 err = req->out.h.error;
273 if (err) {
274 if (err == -ENOSYS)
275 fc->no_create = 1;
276 goto out_free_ff;
277 }
278
279 err = -EIO;
2827d0b2 280 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
fd72faac
MS
281 goto out_free_ff;
282
283 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
284 &outentry.attr);
285 err = -ENOMEM;
286 if (!inode) {
287 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
288 ff->fh = outopen.fh;
6f9f1180
MS
289 /* Special release, with inode = NULL, this will
290 trigger a 'forget' request when the release is
291 complete */
fd72faac
MS
292 fuse_send_release(fc, ff, outentry.nodeid, NULL, flags, 0);
293 goto out_put_request;
294 }
295 fuse_put_request(fc, req);
fd72faac 296 d_instantiate(entry, inode);
0aa7c699 297 fuse_change_timeout(entry, &outentry);
fd72faac
MS
298 file = lookup_instantiate_filp(nd, entry, generic_file_open);
299 if (IS_ERR(file)) {
300 ff->fh = outopen.fh;
301 fuse_send_release(fc, ff, outentry.nodeid, inode, flags, 0);
302 return PTR_ERR(file);
303 }
304 fuse_finish_open(inode, file, ff, &outopen);
305 return 0;
306
307 out_free_ff:
308 fuse_file_free(ff);
309 out_put_request:
310 fuse_put_request(fc, req);
311 out:
312 return err;
313}
314
6f9f1180
MS
315/*
316 * Code shared between mknod, mkdir, symlink and link
317 */
9e6268db
MS
318static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
319 struct inode *dir, struct dentry *entry,
320 int mode)
321{
322 struct fuse_entry_out outarg;
323 struct inode *inode;
9e6268db
MS
324 int err;
325
326 req->in.h.nodeid = get_node_id(dir);
327 req->inode = dir;
328 req->out.numargs = 1;
329 req->out.args[0].size = sizeof(outarg);
330 req->out.args[0].value = &outarg;
331 request_send(fc, req);
332 err = req->out.h.error;
333 if (err) {
334 fuse_put_request(fc, req);
335 return err;
336 }
39ee059a
MS
337 err = -EIO;
338 if (invalid_nodeid(outarg.nodeid))
339 goto out_put_request;
340
341 if ((outarg.attr.mode ^ mode) & S_IFMT)
342 goto out_put_request;
343
9e6268db
MS
344 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
345 &outarg.attr);
346 if (!inode) {
347 fuse_send_forget(fc, req, outarg.nodeid, 1);
348 return -ENOMEM;
349 }
350 fuse_put_request(fc, req);
351
39ee059a 352 if (dir_alias(inode)) {
9e6268db
MS
353 iput(inode);
354 return -EIO;
355 }
356
9e6268db 357 d_instantiate(entry, inode);
0aa7c699 358 fuse_change_timeout(entry, &outarg);
9e6268db
MS
359 fuse_invalidate_attr(dir);
360 return 0;
39ee059a
MS
361
362 out_put_request:
363 fuse_put_request(fc, req);
364 return err;
9e6268db
MS
365}
366
367static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode,
368 dev_t rdev)
369{
370 struct fuse_mknod_in inarg;
371 struct fuse_conn *fc = get_fuse_conn(dir);
372 struct fuse_req *req = fuse_get_request(fc);
373 if (!req)
7c352bdf 374 return -EINTR;
9e6268db
MS
375
376 memset(&inarg, 0, sizeof(inarg));
377 inarg.mode = mode;
378 inarg.rdev = new_encode_dev(rdev);
379 req->in.h.opcode = FUSE_MKNOD;
380 req->in.numargs = 2;
381 req->in.args[0].size = sizeof(inarg);
382 req->in.args[0].value = &inarg;
383 req->in.args[1].size = entry->d_name.len + 1;
384 req->in.args[1].value = entry->d_name.name;
385 return create_new_entry(fc, req, dir, entry, mode);
386}
387
388static int fuse_create(struct inode *dir, struct dentry *entry, int mode,
389 struct nameidata *nd)
390{
fd72faac
MS
391 if (nd && (nd->flags & LOOKUP_CREATE)) {
392 int err = fuse_create_open(dir, entry, mode, nd);
393 if (err != -ENOSYS)
394 return err;
395 /* Fall back on mknod */
396 }
9e6268db
MS
397 return fuse_mknod(dir, entry, mode, 0);
398}
399
400static int fuse_mkdir(struct inode *dir, struct dentry *entry, int mode)
401{
402 struct fuse_mkdir_in inarg;
403 struct fuse_conn *fc = get_fuse_conn(dir);
404 struct fuse_req *req = fuse_get_request(fc);
405 if (!req)
7c352bdf 406 return -EINTR;
9e6268db
MS
407
408 memset(&inarg, 0, sizeof(inarg));
409 inarg.mode = mode;
410 req->in.h.opcode = FUSE_MKDIR;
411 req->in.numargs = 2;
412 req->in.args[0].size = sizeof(inarg);
413 req->in.args[0].value = &inarg;
414 req->in.args[1].size = entry->d_name.len + 1;
415 req->in.args[1].value = entry->d_name.name;
416 return create_new_entry(fc, req, dir, entry, S_IFDIR);
417}
418
419static int fuse_symlink(struct inode *dir, struct dentry *entry,
420 const char *link)
421{
422 struct fuse_conn *fc = get_fuse_conn(dir);
423 unsigned len = strlen(link) + 1;
1d3d752b 424 struct fuse_req *req = fuse_get_request(fc);
9e6268db 425 if (!req)
7c352bdf 426 return -EINTR;
9e6268db
MS
427
428 req->in.h.opcode = FUSE_SYMLINK;
429 req->in.numargs = 2;
430 req->in.args[0].size = entry->d_name.len + 1;
431 req->in.args[0].value = entry->d_name.name;
432 req->in.args[1].size = len;
433 req->in.args[1].value = link;
434 return create_new_entry(fc, req, dir, entry, S_IFLNK);
435}
436
437static int fuse_unlink(struct inode *dir, struct dentry *entry)
438{
439 int err;
440 struct fuse_conn *fc = get_fuse_conn(dir);
441 struct fuse_req *req = fuse_get_request(fc);
442 if (!req)
7c352bdf 443 return -EINTR;
9e6268db
MS
444
445 req->in.h.opcode = FUSE_UNLINK;
446 req->in.h.nodeid = get_node_id(dir);
447 req->inode = dir;
448 req->in.numargs = 1;
449 req->in.args[0].size = entry->d_name.len + 1;
450 req->in.args[0].value = entry->d_name.name;
451 request_send(fc, req);
452 err = req->out.h.error;
453 fuse_put_request(fc, req);
454 if (!err) {
455 struct inode *inode = entry->d_inode;
456
457 /* Set nlink to zero so the inode can be cleared, if
458 the inode does have more links this will be
459 discovered at the next lookup/getattr */
460 inode->i_nlink = 0;
461 fuse_invalidate_attr(inode);
462 fuse_invalidate_attr(dir);
8cbdf1e6 463 fuse_invalidate_entry_cache(entry);
9e6268db
MS
464 } else if (err == -EINTR)
465 fuse_invalidate_entry(entry);
466 return err;
467}
468
469static int fuse_rmdir(struct inode *dir, struct dentry *entry)
470{
471 int err;
472 struct fuse_conn *fc = get_fuse_conn(dir);
473 struct fuse_req *req = fuse_get_request(fc);
474 if (!req)
7c352bdf 475 return -EINTR;
9e6268db
MS
476
477 req->in.h.opcode = FUSE_RMDIR;
478 req->in.h.nodeid = get_node_id(dir);
479 req->inode = dir;
480 req->in.numargs = 1;
481 req->in.args[0].size = entry->d_name.len + 1;
482 req->in.args[0].value = entry->d_name.name;
483 request_send(fc, req);
484 err = req->out.h.error;
485 fuse_put_request(fc, req);
486 if (!err) {
487 entry->d_inode->i_nlink = 0;
488 fuse_invalidate_attr(dir);
8cbdf1e6 489 fuse_invalidate_entry_cache(entry);
9e6268db
MS
490 } else if (err == -EINTR)
491 fuse_invalidate_entry(entry);
492 return err;
493}
494
495static int fuse_rename(struct inode *olddir, struct dentry *oldent,
496 struct inode *newdir, struct dentry *newent)
497{
498 int err;
499 struct fuse_rename_in inarg;
500 struct fuse_conn *fc = get_fuse_conn(olddir);
501 struct fuse_req *req = fuse_get_request(fc);
502 if (!req)
7c352bdf 503 return -EINTR;
9e6268db
MS
504
505 memset(&inarg, 0, sizeof(inarg));
506 inarg.newdir = get_node_id(newdir);
507 req->in.h.opcode = FUSE_RENAME;
508 req->in.h.nodeid = get_node_id(olddir);
509 req->inode = olddir;
510 req->inode2 = newdir;
511 req->in.numargs = 3;
512 req->in.args[0].size = sizeof(inarg);
513 req->in.args[0].value = &inarg;
514 req->in.args[1].size = oldent->d_name.len + 1;
515 req->in.args[1].value = oldent->d_name.name;
516 req->in.args[2].size = newent->d_name.len + 1;
517 req->in.args[2].value = newent->d_name.name;
518 request_send(fc, req);
519 err = req->out.h.error;
520 fuse_put_request(fc, req);
521 if (!err) {
522 fuse_invalidate_attr(olddir);
523 if (olddir != newdir)
524 fuse_invalidate_attr(newdir);
8cbdf1e6
MS
525
526 /* newent will end up negative */
527 if (newent->d_inode)
528 fuse_invalidate_entry_cache(newent);
9e6268db
MS
529 } else if (err == -EINTR) {
530 /* If request was interrupted, DEITY only knows if the
531 rename actually took place. If the invalidation
532 fails (e.g. some process has CWD under the renamed
533 directory), then there can be inconsistency between
534 the dcache and the real filesystem. Tough luck. */
535 fuse_invalidate_entry(oldent);
536 if (newent->d_inode)
537 fuse_invalidate_entry(newent);
538 }
539
540 return err;
541}
542
543static int fuse_link(struct dentry *entry, struct inode *newdir,
544 struct dentry *newent)
545{
546 int err;
547 struct fuse_link_in inarg;
548 struct inode *inode = entry->d_inode;
549 struct fuse_conn *fc = get_fuse_conn(inode);
550 struct fuse_req *req = fuse_get_request(fc);
551 if (!req)
7c352bdf 552 return -EINTR;
9e6268db
MS
553
554 memset(&inarg, 0, sizeof(inarg));
555 inarg.oldnodeid = get_node_id(inode);
556 req->in.h.opcode = FUSE_LINK;
557 req->inode2 = inode;
558 req->in.numargs = 2;
559 req->in.args[0].size = sizeof(inarg);
560 req->in.args[0].value = &inarg;
561 req->in.args[1].size = newent->d_name.len + 1;
562 req->in.args[1].value = newent->d_name.name;
563 err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
564 /* Contrary to "normal" filesystems it can happen that link
565 makes two "logical" inodes point to the same "physical"
566 inode. We invalidate the attributes of the old one, so it
567 will reflect changes in the backing inode (link count,
568 etc.)
569 */
570 if (!err || err == -EINTR)
571 fuse_invalidate_attr(inode);
572 return err;
573}
574
e5e5558e
MS
575int fuse_do_getattr(struct inode *inode)
576{
577 int err;
578 struct fuse_attr_out arg;
579 struct fuse_conn *fc = get_fuse_conn(inode);
580 struct fuse_req *req = fuse_get_request(fc);
581 if (!req)
7c352bdf 582 return -EINTR;
e5e5558e
MS
583
584 req->in.h.opcode = FUSE_GETATTR;
585 req->in.h.nodeid = get_node_id(inode);
586 req->inode = inode;
587 req->out.numargs = 1;
588 req->out.args[0].size = sizeof(arg);
589 req->out.args[0].value = &arg;
590 request_send(fc, req);
591 err = req->out.h.error;
592 fuse_put_request(fc, req);
593 if (!err) {
594 if ((inode->i_mode ^ arg.attr.mode) & S_IFMT) {
595 make_bad_inode(inode);
596 err = -EIO;
597 } else {
598 struct fuse_inode *fi = get_fuse_inode(inode);
599 fuse_change_attributes(inode, &arg.attr);
600 fi->i_time = time_to_jiffies(arg.attr_valid,
601 arg.attr_valid_nsec);
602 }
603 }
604 return err;
605}
606
87729a55
MS
607/*
608 * Calling into a user-controlled filesystem gives the filesystem
609 * daemon ptrace-like capabilities over the requester process. This
610 * means, that the filesystem daemon is able to record the exact
611 * filesystem operations performed, and can also control the behavior
612 * of the requester process in otherwise impossible ways. For example
613 * it can delay the operation for arbitrary length of time allowing
614 * DoS against the requester.
615 *
616 * For this reason only those processes can call into the filesystem,
617 * for which the owner of the mount has ptrace privilege. This
618 * excludes processes started by other users, suid or sgid processes.
619 */
620static int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
621{
622 if (fc->flags & FUSE_ALLOW_OTHER)
623 return 1;
624
625 if (task->euid == fc->user_id &&
626 task->suid == fc->user_id &&
627 task->uid == fc->user_id &&
628 task->egid == fc->group_id &&
629 task->sgid == fc->group_id &&
630 task->gid == fc->group_id)
631 return 1;
632
633 return 0;
634}
635
6f9f1180
MS
636/*
637 * Check whether the inode attributes are still valid
638 *
639 * If the attribute validity timeout has expired, then fetch the fresh
640 * attributes with a 'getattr' request
641 *
642 * I'm not sure why cached attributes are never returned for the root
643 * inode, this is probably being too cautious.
644 */
e5e5558e
MS
645static int fuse_revalidate(struct dentry *entry)
646{
647 struct inode *inode = entry->d_inode;
648 struct fuse_inode *fi = get_fuse_inode(inode);
649 struct fuse_conn *fc = get_fuse_conn(inode);
650
87729a55
MS
651 if (!fuse_allow_task(fc, current))
652 return -EACCES;
653 if (get_node_id(inode) != FUSE_ROOT_ID &&
654 time_before_eq(jiffies, fi->i_time))
e5e5558e
MS
655 return 0;
656
657 return fuse_do_getattr(inode);
658}
659
31d40d74
MS
660static int fuse_access(struct inode *inode, int mask)
661{
662 struct fuse_conn *fc = get_fuse_conn(inode);
663 struct fuse_req *req;
664 struct fuse_access_in inarg;
665 int err;
666
667 if (fc->no_access)
668 return 0;
669
670 req = fuse_get_request(fc);
671 if (!req)
672 return -EINTR;
673
674 memset(&inarg, 0, sizeof(inarg));
675 inarg.mask = mask;
676 req->in.h.opcode = FUSE_ACCESS;
677 req->in.h.nodeid = get_node_id(inode);
678 req->inode = inode;
679 req->in.numargs = 1;
680 req->in.args[0].size = sizeof(inarg);
681 req->in.args[0].value = &inarg;
682 request_send(fc, req);
683 err = req->out.h.error;
684 fuse_put_request(fc, req);
685 if (err == -ENOSYS) {
686 fc->no_access = 1;
687 err = 0;
688 }
689 return err;
690}
691
6f9f1180
MS
692/*
693 * Check permission. The two basic access models of FUSE are:
694 *
695 * 1) Local access checking ('default_permissions' mount option) based
696 * on file mode. This is the plain old disk filesystem permission
697 * modell.
698 *
699 * 2) "Remote" access checking, where server is responsible for
700 * checking permission in each inode operation. An exception to this
701 * is if ->permission() was invoked from sys_access() in which case an
702 * access request is sent. Execute permission is still checked
703 * locally based on file mode.
704 */
e5e5558e
MS
705static int fuse_permission(struct inode *inode, int mask, struct nameidata *nd)
706{
707 struct fuse_conn *fc = get_fuse_conn(inode);
708
87729a55 709 if (!fuse_allow_task(fc, current))
e5e5558e 710 return -EACCES;
1e9a4ed9
MS
711 else if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
712 int err = generic_permission(inode, mask, NULL);
713
714 /* If permission is denied, try to refresh file
715 attributes. This is also needed, because the root
716 node will at first have no permissions */
717 if (err == -EACCES) {
718 err = fuse_do_getattr(inode);
719 if (!err)
720 err = generic_permission(inode, mask, NULL);
721 }
722
6f9f1180
MS
723 /* Note: the opposite of the above test does not
724 exist. So if permissions are revoked this won't be
725 noticed immediately, only after the attribute
726 timeout has expired */
1e9a4ed9
MS
727
728 return err;
729 } else {
e5e5558e 730 int mode = inode->i_mode;
e5e5558e
MS
731 if ((mask & MAY_EXEC) && !S_ISDIR(mode) && !(mode & S_IXUGO))
732 return -EACCES;
31d40d74
MS
733
734 if (nd && (nd->flags & LOOKUP_ACCESS))
735 return fuse_access(inode, mask);
e5e5558e
MS
736 return 0;
737 }
738}
739
740static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
741 void *dstbuf, filldir_t filldir)
742{
743 while (nbytes >= FUSE_NAME_OFFSET) {
744 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
745 size_t reclen = FUSE_DIRENT_SIZE(dirent);
746 int over;
747 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
748 return -EIO;
749 if (reclen > nbytes)
750 break;
751
752 over = filldir(dstbuf, dirent->name, dirent->namelen,
753 file->f_pos, dirent->ino, dirent->type);
754 if (over)
755 break;
756
757 buf += reclen;
758 nbytes -= reclen;
759 file->f_pos = dirent->off;
760 }
761
762 return 0;
763}
764
8bfc016d
MS
765static size_t fuse_send_readdir(struct fuse_req *req, struct file *file,
766 struct inode *inode, loff_t pos, size_t count)
e5e5558e 767{
04730fef 768 return fuse_send_read_common(req, file, inode, pos, count, 1);
e5e5558e
MS
769}
770
04730fef 771static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
e5e5558e 772{
04730fef
MS
773 int err;
774 size_t nbytes;
775 struct page *page;
e5e5558e
MS
776 struct inode *inode = file->f_dentry->d_inode;
777 struct fuse_conn *fc = get_fuse_conn(inode);
248d86e8
MS
778 struct fuse_req *req;
779
780 if (is_bad_inode(inode))
781 return -EIO;
782
783 req = fuse_get_request(fc);
e5e5558e 784 if (!req)
04730fef 785 return -EINTR;
e5e5558e 786
04730fef
MS
787 page = alloc_page(GFP_KERNEL);
788 if (!page) {
789 fuse_put_request(fc, req);
790 return -ENOMEM;
791 }
792 req->num_pages = 1;
793 req->pages[0] = page;
794 nbytes = fuse_send_readdir(req, file, inode, file->f_pos, PAGE_SIZE);
e5e5558e
MS
795 err = req->out.h.error;
796 fuse_put_request(fc, req);
797 if (!err)
04730fef
MS
798 err = parse_dirfile(page_address(page), nbytes, file, dstbuf,
799 filldir);
e5e5558e 800
04730fef 801 __free_page(page);
b36c31ba 802 fuse_invalidate_attr(inode); /* atime changed */
04730fef 803 return err;
e5e5558e
MS
804}
805
806static char *read_link(struct dentry *dentry)
807{
808 struct inode *inode = dentry->d_inode;
809 struct fuse_conn *fc = get_fuse_conn(inode);
810 struct fuse_req *req = fuse_get_request(fc);
811 char *link;
812
813 if (!req)
7c352bdf 814 return ERR_PTR(-EINTR);
e5e5558e
MS
815
816 link = (char *) __get_free_page(GFP_KERNEL);
817 if (!link) {
818 link = ERR_PTR(-ENOMEM);
819 goto out;
820 }
821 req->in.h.opcode = FUSE_READLINK;
822 req->in.h.nodeid = get_node_id(inode);
823 req->inode = inode;
824 req->out.argvar = 1;
825 req->out.numargs = 1;
826 req->out.args[0].size = PAGE_SIZE - 1;
827 req->out.args[0].value = link;
828 request_send(fc, req);
829 if (req->out.h.error) {
830 free_page((unsigned long) link);
831 link = ERR_PTR(req->out.h.error);
832 } else
833 link[req->out.args[0].size] = '\0';
834 out:
835 fuse_put_request(fc, req);
b36c31ba 836 fuse_invalidate_attr(inode); /* atime changed */
e5e5558e
MS
837 return link;
838}
839
840static void free_link(char *link)
841{
842 if (!IS_ERR(link))
843 free_page((unsigned long) link);
844}
845
846static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
847{
848 nd_set_link(nd, read_link(dentry));
849 return NULL;
850}
851
852static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
853{
854 free_link(nd_get_link(nd));
855}
856
857static int fuse_dir_open(struct inode *inode, struct file *file)
858{
04730fef 859 return fuse_open_common(inode, file, 1);
e5e5558e
MS
860}
861
862static int fuse_dir_release(struct inode *inode, struct file *file)
863{
04730fef 864 return fuse_release_common(inode, file, 1);
e5e5558e
MS
865}
866
82547981
MS
867static int fuse_dir_fsync(struct file *file, struct dentry *de, int datasync)
868{
869 /* nfsd can call this with no file */
870 return file ? fuse_fsync_common(file, de, datasync, 1) : 0;
871}
872
befc649c 873static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
9e6268db
MS
874{
875 unsigned ivalid = iattr->ia_valid;
9e6268db
MS
876
877 if (ivalid & ATTR_MODE)
befc649c 878 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
9e6268db 879 if (ivalid & ATTR_UID)
befc649c 880 arg->valid |= FATTR_UID, arg->uid = iattr->ia_uid;
9e6268db 881 if (ivalid & ATTR_GID)
befc649c 882 arg->valid |= FATTR_GID, arg->gid = iattr->ia_gid;
9e6268db 883 if (ivalid & ATTR_SIZE)
befc649c 884 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
9e6268db
MS
885 /* You can only _set_ these together (they may change by themselves) */
886 if ((ivalid & (ATTR_ATIME | ATTR_MTIME)) == (ATTR_ATIME | ATTR_MTIME)) {
befc649c
MS
887 arg->valid |= FATTR_ATIME | FATTR_MTIME;
888 arg->atime = iattr->ia_atime.tv_sec;
889 arg->mtime = iattr->ia_mtime.tv_sec;
890 }
891 if (ivalid & ATTR_FILE) {
892 struct fuse_file *ff = iattr->ia_file->private_data;
893 arg->valid |= FATTR_FH;
894 arg->fh = ff->fh;
9e6268db 895 }
9e6268db
MS
896}
897
6f9f1180
MS
898/*
899 * Set attributes, and at the same time refresh them.
900 *
901 * Truncation is slightly complicated, because the 'truncate' request
902 * may fail, in which case we don't want to touch the mapping.
903 * vmtruncate() doesn't allow for this case. So do the rlimit
904 * checking by hand and call vmtruncate() only after the file has
905 * actually been truncated.
906 */
9e6268db
MS
907static int fuse_setattr(struct dentry *entry, struct iattr *attr)
908{
909 struct inode *inode = entry->d_inode;
910 struct fuse_conn *fc = get_fuse_conn(inode);
911 struct fuse_inode *fi = get_fuse_inode(inode);
912 struct fuse_req *req;
913 struct fuse_setattr_in inarg;
914 struct fuse_attr_out outarg;
915 int err;
916 int is_truncate = 0;
917
1e9a4ed9
MS
918 if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
919 err = inode_change_ok(inode, attr);
920 if (err)
921 return err;
922 }
923
9e6268db
MS
924 if (attr->ia_valid & ATTR_SIZE) {
925 unsigned long limit;
926 is_truncate = 1;
927 limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
928 if (limit != RLIM_INFINITY && attr->ia_size > (loff_t) limit) {
929 send_sig(SIGXFSZ, current, 0);
930 return -EFBIG;
931 }
932 }
933
934 req = fuse_get_request(fc);
935 if (!req)
7c352bdf 936 return -EINTR;
9e6268db
MS
937
938 memset(&inarg, 0, sizeof(inarg));
befc649c 939 iattr_to_fattr(attr, &inarg);
9e6268db
MS
940 req->in.h.opcode = FUSE_SETATTR;
941 req->in.h.nodeid = get_node_id(inode);
942 req->inode = inode;
943 req->in.numargs = 1;
944 req->in.args[0].size = sizeof(inarg);
945 req->in.args[0].value = &inarg;
946 req->out.numargs = 1;
947 req->out.args[0].size = sizeof(outarg);
948 req->out.args[0].value = &outarg;
949 request_send(fc, req);
950 err = req->out.h.error;
951 fuse_put_request(fc, req);
952 if (!err) {
953 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
954 make_bad_inode(inode);
955 err = -EIO;
956 } else {
957 if (is_truncate) {
958 loff_t origsize = i_size_read(inode);
959 i_size_write(inode, outarg.attr.size);
960 if (origsize > outarg.attr.size)
961 vmtruncate(inode, outarg.attr.size);
962 }
963 fuse_change_attributes(inode, &outarg.attr);
964 fi->i_time = time_to_jiffies(outarg.attr_valid,
965 outarg.attr_valid_nsec);
966 }
967 } else if (err == -EINTR)
968 fuse_invalidate_attr(inode);
969
970 return err;
971}
972
e5e5558e
MS
973static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
974 struct kstat *stat)
975{
976 struct inode *inode = entry->d_inode;
977 int err = fuse_revalidate(entry);
978 if (!err)
979 generic_fillattr(inode, stat);
980
981 return err;
982}
983
92a8780e
MS
984static int fuse_setxattr(struct dentry *entry, const char *name,
985 const void *value, size_t size, int flags)
986{
987 struct inode *inode = entry->d_inode;
988 struct fuse_conn *fc = get_fuse_conn(inode);
989 struct fuse_req *req;
990 struct fuse_setxattr_in inarg;
991 int err;
992
92a8780e
MS
993 if (fc->no_setxattr)
994 return -EOPNOTSUPP;
995
996 req = fuse_get_request(fc);
997 if (!req)
7c352bdf 998 return -EINTR;
92a8780e
MS
999
1000 memset(&inarg, 0, sizeof(inarg));
1001 inarg.size = size;
1002 inarg.flags = flags;
1003 req->in.h.opcode = FUSE_SETXATTR;
1004 req->in.h.nodeid = get_node_id(inode);
1005 req->inode = inode;
1006 req->in.numargs = 3;
1007 req->in.args[0].size = sizeof(inarg);
1008 req->in.args[0].value = &inarg;
1009 req->in.args[1].size = strlen(name) + 1;
1010 req->in.args[1].value = name;
1011 req->in.args[2].size = size;
1012 req->in.args[2].value = value;
1013 request_send(fc, req);
1014 err = req->out.h.error;
1015 fuse_put_request(fc, req);
1016 if (err == -ENOSYS) {
1017 fc->no_setxattr = 1;
1018 err = -EOPNOTSUPP;
1019 }
1020 return err;
1021}
1022
1023static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1024 void *value, size_t size)
1025{
1026 struct inode *inode = entry->d_inode;
1027 struct fuse_conn *fc = get_fuse_conn(inode);
1028 struct fuse_req *req;
1029 struct fuse_getxattr_in inarg;
1030 struct fuse_getxattr_out outarg;
1031 ssize_t ret;
1032
1033 if (fc->no_getxattr)
1034 return -EOPNOTSUPP;
1035
1036 req = fuse_get_request(fc);
1037 if (!req)
7c352bdf 1038 return -EINTR;
92a8780e
MS
1039
1040 memset(&inarg, 0, sizeof(inarg));
1041 inarg.size = size;
1042 req->in.h.opcode = FUSE_GETXATTR;
1043 req->in.h.nodeid = get_node_id(inode);
1044 req->inode = inode;
1045 req->in.numargs = 2;
1046 req->in.args[0].size = sizeof(inarg);
1047 req->in.args[0].value = &inarg;
1048 req->in.args[1].size = strlen(name) + 1;
1049 req->in.args[1].value = name;
1050 /* This is really two different operations rolled into one */
1051 req->out.numargs = 1;
1052 if (size) {
1053 req->out.argvar = 1;
1054 req->out.args[0].size = size;
1055 req->out.args[0].value = value;
1056 } else {
1057 req->out.args[0].size = sizeof(outarg);
1058 req->out.args[0].value = &outarg;
1059 }
1060 request_send(fc, req);
1061 ret = req->out.h.error;
1062 if (!ret)
1063 ret = size ? req->out.args[0].size : outarg.size;
1064 else {
1065 if (ret == -ENOSYS) {
1066 fc->no_getxattr = 1;
1067 ret = -EOPNOTSUPP;
1068 }
1069 }
1070 fuse_put_request(fc, req);
1071 return ret;
1072}
1073
1074static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1075{
1076 struct inode *inode = entry->d_inode;
1077 struct fuse_conn *fc = get_fuse_conn(inode);
1078 struct fuse_req *req;
1079 struct fuse_getxattr_in inarg;
1080 struct fuse_getxattr_out outarg;
1081 ssize_t ret;
1082
1083 if (fc->no_listxattr)
1084 return -EOPNOTSUPP;
1085
1086 req = fuse_get_request(fc);
1087 if (!req)
7c352bdf 1088 return -EINTR;
92a8780e
MS
1089
1090 memset(&inarg, 0, sizeof(inarg));
1091 inarg.size = size;
1092 req->in.h.opcode = FUSE_LISTXATTR;
1093 req->in.h.nodeid = get_node_id(inode);
1094 req->inode = inode;
1095 req->in.numargs = 1;
1096 req->in.args[0].size = sizeof(inarg);
1097 req->in.args[0].value = &inarg;
1098 /* This is really two different operations rolled into one */
1099 req->out.numargs = 1;
1100 if (size) {
1101 req->out.argvar = 1;
1102 req->out.args[0].size = size;
1103 req->out.args[0].value = list;
1104 } else {
1105 req->out.args[0].size = sizeof(outarg);
1106 req->out.args[0].value = &outarg;
1107 }
1108 request_send(fc, req);
1109 ret = req->out.h.error;
1110 if (!ret)
1111 ret = size ? req->out.args[0].size : outarg.size;
1112 else {
1113 if (ret == -ENOSYS) {
1114 fc->no_listxattr = 1;
1115 ret = -EOPNOTSUPP;
1116 }
1117 }
1118 fuse_put_request(fc, req);
1119 return ret;
1120}
1121
1122static int fuse_removexattr(struct dentry *entry, const char *name)
1123{
1124 struct inode *inode = entry->d_inode;
1125 struct fuse_conn *fc = get_fuse_conn(inode);
1126 struct fuse_req *req;
1127 int err;
1128
1129 if (fc->no_removexattr)
1130 return -EOPNOTSUPP;
1131
1132 req = fuse_get_request(fc);
1133 if (!req)
7c352bdf 1134 return -EINTR;
92a8780e
MS
1135
1136 req->in.h.opcode = FUSE_REMOVEXATTR;
1137 req->in.h.nodeid = get_node_id(inode);
1138 req->inode = inode;
1139 req->in.numargs = 1;
1140 req->in.args[0].size = strlen(name) + 1;
1141 req->in.args[0].value = name;
1142 request_send(fc, req);
1143 err = req->out.h.error;
1144 fuse_put_request(fc, req);
1145 if (err == -ENOSYS) {
1146 fc->no_removexattr = 1;
1147 err = -EOPNOTSUPP;
1148 }
1149 return err;
1150}
1151
e5e5558e
MS
1152static struct inode_operations fuse_dir_inode_operations = {
1153 .lookup = fuse_lookup,
9e6268db
MS
1154 .mkdir = fuse_mkdir,
1155 .symlink = fuse_symlink,
1156 .unlink = fuse_unlink,
1157 .rmdir = fuse_rmdir,
1158 .rename = fuse_rename,
1159 .link = fuse_link,
1160 .setattr = fuse_setattr,
1161 .create = fuse_create,
1162 .mknod = fuse_mknod,
e5e5558e
MS
1163 .permission = fuse_permission,
1164 .getattr = fuse_getattr,
92a8780e
MS
1165 .setxattr = fuse_setxattr,
1166 .getxattr = fuse_getxattr,
1167 .listxattr = fuse_listxattr,
1168 .removexattr = fuse_removexattr,
e5e5558e
MS
1169};
1170
1171static struct file_operations fuse_dir_operations = {
b6aeaded 1172 .llseek = generic_file_llseek,
e5e5558e
MS
1173 .read = generic_read_dir,
1174 .readdir = fuse_readdir,
1175 .open = fuse_dir_open,
1176 .release = fuse_dir_release,
82547981 1177 .fsync = fuse_dir_fsync,
e5e5558e
MS
1178};
1179
1180static struct inode_operations fuse_common_inode_operations = {
9e6268db 1181 .setattr = fuse_setattr,
e5e5558e
MS
1182 .permission = fuse_permission,
1183 .getattr = fuse_getattr,
92a8780e
MS
1184 .setxattr = fuse_setxattr,
1185 .getxattr = fuse_getxattr,
1186 .listxattr = fuse_listxattr,
1187 .removexattr = fuse_removexattr,
e5e5558e
MS
1188};
1189
1190static struct inode_operations fuse_symlink_inode_operations = {
9e6268db 1191 .setattr = fuse_setattr,
e5e5558e
MS
1192 .follow_link = fuse_follow_link,
1193 .put_link = fuse_put_link,
1194 .readlink = generic_readlink,
1195 .getattr = fuse_getattr,
92a8780e
MS
1196 .setxattr = fuse_setxattr,
1197 .getxattr = fuse_getxattr,
1198 .listxattr = fuse_listxattr,
1199 .removexattr = fuse_removexattr,
e5e5558e
MS
1200};
1201
1202void fuse_init_common(struct inode *inode)
1203{
1204 inode->i_op = &fuse_common_inode_operations;
1205}
1206
1207void fuse_init_dir(struct inode *inode)
1208{
1209 inode->i_op = &fuse_dir_inode_operations;
1210 inode->i_fop = &fuse_dir_operations;
1211}
1212
1213void fuse_init_symlink(struct inode *inode)
1214{
1215 inode->i_op = &fuse_symlink_inode_operations;
1216}
This page took 0.116915 seconds and 5 git commands to generate.