1
2
3
4
5
6
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
17#if BITS_PER_LONG >= 64
18static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
19{
20 entry->d_time = time;
21}
22
23static inline u64 fuse_dentry_time(struct dentry *entry)
24{
25 return entry->d_time;
26}
27#else
28
29
30
31static void fuse_dentry_settime(struct dentry *entry, u64 time)
32{
33 entry->d_time = time;
34 entry->d_fsdata = (void *) (unsigned long) (time >> 32);
35}
36
37static u64 fuse_dentry_time(struct dentry *entry)
38{
39 return (u64) entry->d_time +
40 ((u64) (unsigned long) entry->d_fsdata << 32);
41}
42#endif
43
44
45
46
47
48
49
50
51
52
53static u64 time_to_jiffies(unsigned long sec, unsigned long nsec)
54{
55 if (sec || nsec) {
56 struct timespec ts = {sec, nsec};
57 return get_jiffies_64() + timespec_to_jiffies(&ts);
58 } else
59 return 0;
60}
61
62
63
64
65
66static void fuse_change_entry_timeout(struct dentry *entry,
67 struct fuse_entry_out *o)
68{
69 fuse_dentry_settime(entry,
70 time_to_jiffies(o->entry_valid, o->entry_valid_nsec));
71}
72
73static u64 attr_timeout(struct fuse_attr_out *o)
74{
75 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
76}
77
78static u64 entry_attr_timeout(struct fuse_entry_out *o)
79{
80 return time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
81}
82
83
84
85
86
87void fuse_invalidate_attr(struct inode *inode)
88{
89 get_fuse_inode(inode)->i_time = 0;
90}
91
92
93
94
95
96
97
98
99
100void fuse_invalidate_entry_cache(struct dentry *entry)
101{
102 fuse_dentry_settime(entry, 0);
103}
104
105
106
107
108
109static void fuse_invalidate_entry(struct dentry *entry)
110{
111 d_invalidate(entry);
112 fuse_invalidate_entry_cache(entry);
113}
114
115static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_req *req,
116 u64 nodeid, struct qstr *name,
117 struct fuse_entry_out *outarg)
118{
119 memset(outarg, 0, sizeof(struct fuse_entry_out));
120 req->in.h.opcode = FUSE_LOOKUP;
121 req->in.h.nodeid = nodeid;
122 req->in.numargs = 1;
123 req->in.args[0].size = name->len + 1;
124 req->in.args[0].value = name->name;
125 req->out.numargs = 1;
126 if (fc->minor < 9)
127 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
128 else
129 req->out.args[0].size = sizeof(struct fuse_entry_out);
130 req->out.args[0].value = outarg;
131}
132
133u64 fuse_get_attr_version(struct fuse_conn *fc)
134{
135 u64 curr_version;
136
137
138
139
140
141 spin_lock(&fc->lock);
142 curr_version = fc->attr_version;
143 spin_unlock(&fc->lock);
144
145 return curr_version;
146}
147
148
149
150
151
152
153
154
155
156
157static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
158{
159 struct inode *inode = entry->d_inode;
160
161 if (inode && is_bad_inode(inode))
162 return 0;
163 else if (fuse_dentry_time(entry) < get_jiffies_64()) {
164 int err;
165 struct fuse_entry_out outarg;
166 struct fuse_conn *fc;
167 struct fuse_req *req;
168 struct fuse_req *forget_req;
169 struct dentry *parent;
170 u64 attr_version;
171
172
173 if (!inode)
174 return 0;
175
176 fc = get_fuse_conn(inode);
177 req = fuse_get_req(fc);
178 if (IS_ERR(req))
179 return 0;
180
181 forget_req = fuse_get_req(fc);
182 if (IS_ERR(forget_req)) {
183 fuse_put_request(fc, req);
184 return 0;
185 }
186
187 attr_version = fuse_get_attr_version(fc);
188
189 parent = dget_parent(entry);
190 fuse_lookup_init(fc, req, get_node_id(parent->d_inode),
191 &entry->d_name, &outarg);
192 fuse_request_send(fc, req);
193 dput(parent);
194 err = req->out.h.error;
195 fuse_put_request(fc, req);
196
197 if (!err && !outarg.nodeid)
198 err = -ENOENT;
199 if (!err) {
200 struct fuse_inode *fi = get_fuse_inode(inode);
201 if (outarg.nodeid != get_node_id(inode)) {
202 fuse_send_forget(fc, forget_req,
203 outarg.nodeid, 1);
204 return 0;
205 }
206 spin_lock(&fc->lock);
207 fi->nlookup++;
208 spin_unlock(&fc->lock);
209 }
210 fuse_put_request(fc, forget_req);
211 if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT)
212 return 0;
213
214 fuse_change_attributes(inode, &outarg.attr,
215 entry_attr_timeout(&outarg),
216 attr_version);
217 fuse_change_entry_timeout(entry, &outarg);
218 }
219 return 1;
220}
221
222static int invalid_nodeid(u64 nodeid)
223{
224 return !nodeid || nodeid == FUSE_ROOT_ID;
225}
226
227const struct dentry_operations fuse_dentry_operations = {
228 .d_revalidate = fuse_dentry_revalidate,
229};
230
231int fuse_valid_type(int m)
232{
233 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
234 S_ISBLK(m) || S_ISFIFO(m) || S_ISSOCK(m);
235}
236
237
238
239
240
241static struct dentry *fuse_d_add_directory(struct dentry *entry,
242 struct inode *inode)
243{
244 struct dentry *alias = d_find_alias(inode);
245 if (alias && !(alias->d_flags & DCACHE_DISCONNECTED)) {
246
247 fuse_invalidate_entry(alias);
248 dput(alias);
249 if (!list_empty(&inode->i_dentry))
250 return ERR_PTR(-EBUSY);
251 } else {
252 dput(alias);
253 }
254 return d_splice_alias(inode, entry);
255}
256
257int fuse_lookup_name(struct super_block *sb, u64 nodeid, struct qstr *name,
258 struct fuse_entry_out *outarg, struct inode **inode)
259{
260 struct fuse_conn *fc = get_fuse_conn_super(sb);
261 struct fuse_req *req;
262 struct fuse_req *forget_req;
263 u64 attr_version;
264 int err;
265
266 *inode = NULL;
267 err = -ENAMETOOLONG;
268 if (name->len > FUSE_NAME_MAX)
269 goto out;
270
271 req = fuse_get_req(fc);
272 err = PTR_ERR(req);
273 if (IS_ERR(req))
274 goto out;
275
276 forget_req = fuse_get_req(fc);
277 err = PTR_ERR(forget_req);
278 if (IS_ERR(forget_req)) {
279 fuse_put_request(fc, req);
280 goto out;
281 }
282
283 attr_version = fuse_get_attr_version(fc);
284
285 fuse_lookup_init(fc, req, nodeid, name, outarg);
286 fuse_request_send(fc, req);
287 err = req->out.h.error;
288 fuse_put_request(fc, req);
289
290 if (err || !outarg->nodeid)
291 goto out_put_forget;
292
293 err = -EIO;
294 if (!outarg->nodeid)
295 goto out_put_forget;
296 if (!fuse_valid_type(outarg->attr.mode))
297 goto out_put_forget;
298
299 *inode = fuse_iget(sb, outarg->nodeid, outarg->generation,
300 &outarg->attr, entry_attr_timeout(outarg),
301 attr_version);
302 err = -ENOMEM;
303 if (!*inode) {
304 fuse_send_forget(fc, forget_req, outarg->nodeid, 1);
305 goto out;
306 }
307 err = 0;
308
309 out_put_forget:
310 fuse_put_request(fc, forget_req);
311 out:
312 return err;
313}
314
315static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
316 struct nameidata *nd)
317{
318 int err;
319 struct fuse_entry_out outarg;
320 struct inode *inode;
321 struct dentry *newent;
322 struct fuse_conn *fc = get_fuse_conn(dir);
323 bool outarg_valid = true;
324
325 err = fuse_lookup_name(dir->i_sb, get_node_id(dir), &entry->d_name,
326 &outarg, &inode);
327 if (err == -ENOENT) {
328 outarg_valid = false;
329 err = 0;
330 }
331 if (err)
332 goto out_err;
333
334 err = -EIO;
335 if (inode && get_node_id(inode) == FUSE_ROOT_ID)
336 goto out_iput;
337
338 if (inode && S_ISDIR(inode->i_mode)) {
339 mutex_lock(&fc->inst_mutex);
340 newent = fuse_d_add_directory(entry, inode);
341 mutex_unlock(&fc->inst_mutex);
342 err = PTR_ERR(newent);
343 if (IS_ERR(newent))
344 goto out_iput;
345 } else {
346 newent = d_splice_alias(inode, entry);
347 }
348
349 entry = newent ? newent : entry;
350 entry->d_op = &fuse_dentry_operations;
351 if (outarg_valid)
352 fuse_change_entry_timeout(entry, &outarg);
353 else
354 fuse_invalidate_entry_cache(entry);
355
356 return newent;
357
358 out_iput:
359 iput(inode);
360 out_err:
361 return ERR_PTR(err);
362}
363
364
365
366
367
368
369
370static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
371 struct nameidata *nd)
372{
373 int err;
374 struct inode *inode;
375 struct fuse_conn *fc = get_fuse_conn(dir);
376 struct fuse_req *req;
377 struct fuse_req *forget_req;
378 struct fuse_create_in inarg;
379 struct fuse_open_out outopen;
380 struct fuse_entry_out outentry;
381 struct fuse_file *ff;
382 struct file *file;
383 int flags = nd->intent.open.flags - 1;
384
385 if (fc->no_create)
386 return -ENOSYS;
387
388 if (flags & O_DIRECT)
389 return -EINVAL;
390
391 forget_req = fuse_get_req(fc);
392 if (IS_ERR(forget_req))
393 return PTR_ERR(forget_req);
394
395 req = fuse_get_req(fc);
396 err = PTR_ERR(req);
397 if (IS_ERR(req))
398 goto out_put_forget_req;
399
400 err = -ENOMEM;
401 ff = fuse_file_alloc(fc);
402 if (!ff)
403 goto out_put_request;
404
405 if (!fc->dont_mask)
406 mode &= ~current_umask();
407
408 flags &= ~O_NOCTTY;
409 memset(&inarg, 0, sizeof(inarg));
410 memset(&outentry, 0, sizeof(outentry));
411 inarg.flags = flags;
412 inarg.mode = mode;
413 inarg.umask = current_umask();
414 req->in.h.opcode = FUSE_CREATE;
415 req->in.h.nodeid = get_node_id(dir);
416 req->in.numargs = 2;
417 req->in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) :
418 sizeof(inarg);
419 req->in.args[0].value = &inarg;
420 req->in.args[1].size = entry->d_name.len + 1;
421 req->in.args[1].value = entry->d_name.name;
422 req->out.numargs = 2;
423 if (fc->minor < 9)
424 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
425 else
426 req->out.args[0].size = sizeof(outentry);
427 req->out.args[0].value = &outentry;
428 req->out.args[1].size = sizeof(outopen);
429 req->out.args[1].value = &outopen;
430 fuse_request_send(fc, req);
431 err = req->out.h.error;
432 if (err) {
433 if (err == -ENOSYS)
434 fc->no_create = 1;
435 goto out_free_ff;
436 }
437
438 err = -EIO;
439 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
440 goto out_free_ff;
441
442 fuse_put_request(fc, req);
443 ff->fh = outopen.fh;
444 ff->nodeid = outentry.nodeid;
445 ff->open_flags = outopen.open_flags;
446 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
447 &outentry.attr, entry_attr_timeout(&outentry), 0);
448 if (!inode) {
449 flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
450 fuse_sync_release(ff, flags);
451 fuse_send_forget(fc, forget_req, outentry.nodeid, 1);
452 return -ENOMEM;
453 }
454 fuse_put_request(fc, forget_req);
455 d_instantiate(entry, inode);
456 fuse_change_entry_timeout(entry, &outentry);
457 fuse_invalidate_attr(dir);
458 file = lookup_instantiate_filp(nd, entry, generic_file_open);
459 if (IS_ERR(file)) {
460 fuse_sync_release(ff, flags);
461 return PTR_ERR(file);
462 }
463 file->private_data = fuse_file_get(ff);
464 fuse_finish_open(inode, file);
465 return 0;
466
467 out_free_ff:
468 fuse_file_free(ff);
469 out_put_request:
470 fuse_put_request(fc, req);
471 out_put_forget_req:
472 fuse_put_request(fc, forget_req);
473 return err;
474}
475
476
477
478
479static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
480 struct inode *dir, struct dentry *entry,
481 int mode)
482{
483 struct fuse_entry_out outarg;
484 struct inode *inode;
485 int err;
486 struct fuse_req *forget_req;
487
488 forget_req = fuse_get_req(fc);
489 if (IS_ERR(forget_req)) {
490 fuse_put_request(fc, req);
491 return PTR_ERR(forget_req);
492 }
493
494 memset(&outarg, 0, sizeof(outarg));
495 req->in.h.nodeid = get_node_id(dir);
496 req->out.numargs = 1;
497 if (fc->minor < 9)
498 req->out.args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
499 else
500 req->out.args[0].size = sizeof(outarg);
501 req->out.args[0].value = &outarg;
502 fuse_request_send(fc, req);
503 err = req->out.h.error;
504 fuse_put_request(fc, req);
505 if (err)
506 goto out_put_forget_req;
507
508 err = -EIO;
509 if (invalid_nodeid(outarg.nodeid))
510 goto out_put_forget_req;
511
512 if ((outarg.attr.mode ^ mode) & S_IFMT)
513 goto out_put_forget_req;
514
515 inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
516 &outarg.attr, entry_attr_timeout(&outarg), 0);
517 if (!inode) {
518 fuse_send_forget(fc, forget_req, outarg.nodeid, 1);
519 return -ENOMEM;
520 }
521 fuse_put_request(fc, forget_req);
522
523 if (S_ISDIR(inode->i_mode)) {
524 struct dentry *alias;
525 mutex_lock(&fc->inst_mutex);
526 alias = d_find_alias(inode);
527 if (alias) {
528
529 mutex_unlock(&fc->inst_mutex);
530 dput(alias);
531 iput(inode);
532 return -EBUSY;
533 }
534 d_instantiate(entry, inode);
535 mutex_unlock(&fc->inst_mutex);
536 } else
537 d_instantiate(entry, inode);
538
539 fuse_change_entry_timeout(entry, &outarg);
540 fuse_invalidate_attr(dir);
541 return 0;
542
543 out_put_forget_req:
544 fuse_put_request(fc, forget_req);
545 return err;
546}
547
548static int fuse_mknod(struct inode *dir, struct dentry *entry, int mode,
549 dev_t rdev)
550{
551 struct fuse_mknod_in inarg;
552 struct fuse_conn *fc = get_fuse_conn(dir);
553 struct fuse_req *req = fuse_get_req(fc);
554 if (IS_ERR(req))
555 return PTR_ERR(req);
556
557 if (!fc->dont_mask)
558 mode &= ~current_umask();
559
560 memset(&inarg, 0, sizeof(inarg));
561 inarg.mode = mode;
562 inarg.rdev = new_encode_dev(rdev);
563 inarg.umask = current_umask();
564 req->in.h.opcode = FUSE_MKNOD;
565 req->in.numargs = 2;
566 req->in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE :
567 sizeof(inarg);
568 req->in.args[0].value = &inarg;
569 req->in.args[1].size = entry->d_name.len + 1;
570 req->in.args[1].value = entry->d_name.name;
571 return create_new_entry(fc, req, dir, entry, mode);
572}
573
574static int fuse_create(struct inode *dir, struct dentry *entry, int mode,
575 struct nameidata *nd)
576{
577 if (nd && (nd->flags & LOOKUP_OPEN)) {
578 int err = fuse_create_open(dir, entry, mode, nd);
579 if (err != -ENOSYS)
580 return err;
581
582 }
583 return fuse_mknod(dir, entry, mode, 0);
584}
585
586static int fuse_mkdir(struct inode *dir, struct dentry *entry, int mode)
587{
588 struct fuse_mkdir_in inarg;
589 struct fuse_conn *fc = get_fuse_conn(dir);
590 struct fuse_req *req = fuse_get_req(fc);
591 if (IS_ERR(req))
592 return PTR_ERR(req);
593
594 if (!fc->dont_mask)
595 mode &= ~current_umask();
596
597 memset(&inarg, 0, sizeof(inarg));
598 inarg.mode = mode;
599 inarg.umask = current_umask();
600 req->in.h.opcode = FUSE_MKDIR;
601 req->in.numargs = 2;
602 req->in.args[0].size = sizeof(inarg);
603 req->in.args[0].value = &inarg;
604 req->in.args[1].size = entry->d_name.len + 1;
605 req->in.args[1].value = entry->d_name.name;
606 return create_new_entry(fc, req, dir, entry, S_IFDIR);
607}
608
609static int fuse_symlink(struct inode *dir, struct dentry *entry,
610 const char *link)
611{
612 struct fuse_conn *fc = get_fuse_conn(dir);
613 unsigned len = strlen(link) + 1;
614 struct fuse_req *req = fuse_get_req(fc);
615 if (IS_ERR(req))
616 return PTR_ERR(req);
617
618 req->in.h.opcode = FUSE_SYMLINK;
619 req->in.numargs = 2;
620 req->in.args[0].size = entry->d_name.len + 1;
621 req->in.args[0].value = entry->d_name.name;
622 req->in.args[1].size = len;
623 req->in.args[1].value = link;
624 return create_new_entry(fc, req, dir, entry, S_IFLNK);
625}
626
627static int fuse_unlink(struct inode *dir, struct dentry *entry)
628{
629 int err;
630 struct fuse_conn *fc = get_fuse_conn(dir);
631 struct fuse_req *req = fuse_get_req(fc);
632 if (IS_ERR(req))
633 return PTR_ERR(req);
634
635 req->in.h.opcode = FUSE_UNLINK;
636 req->in.h.nodeid = get_node_id(dir);
637 req->in.numargs = 1;
638 req->in.args[0].size = entry->d_name.len + 1;
639 req->in.args[0].value = entry->d_name.name;
640 fuse_request_send(fc, req);
641 err = req->out.h.error;
642 fuse_put_request(fc, req);
643 if (!err) {
644 struct inode *inode = entry->d_inode;
645
646
647
648
649
650
651 clear_nlink(inode);
652 fuse_invalidate_attr(inode);
653 fuse_invalidate_attr(dir);
654 fuse_invalidate_entry_cache(entry);
655 } else if (err == -EINTR)
656 fuse_invalidate_entry(entry);
657 return err;
658}
659
660static int fuse_rmdir(struct inode *dir, struct dentry *entry)
661{
662 int err;
663 struct fuse_conn *fc = get_fuse_conn(dir);
664 struct fuse_req *req = fuse_get_req(fc);
665 if (IS_ERR(req))
666 return PTR_ERR(req);
667
668 req->in.h.opcode = FUSE_RMDIR;
669 req->in.h.nodeid = get_node_id(dir);
670 req->in.numargs = 1;
671 req->in.args[0].size = entry->d_name.len + 1;
672 req->in.args[0].value = entry->d_name.name;
673 fuse_request_send(fc, req);
674 err = req->out.h.error;
675 fuse_put_request(fc, req);
676 if (!err) {
677 clear_nlink(entry->d_inode);
678 fuse_invalidate_attr(dir);
679 fuse_invalidate_entry_cache(entry);
680 } else if (err == -EINTR)
681 fuse_invalidate_entry(entry);
682 return err;
683}
684
685static int fuse_rename(struct inode *olddir, struct dentry *oldent,
686 struct inode *newdir, struct dentry *newent)
687{
688 int err;
689 struct fuse_rename_in inarg;
690 struct fuse_conn *fc = get_fuse_conn(olddir);
691 struct fuse_req *req = fuse_get_req(fc);
692 if (IS_ERR(req))
693 return PTR_ERR(req);
694
695 memset(&inarg, 0, sizeof(inarg));
696 inarg.newdir = get_node_id(newdir);
697 req->in.h.opcode = FUSE_RENAME;
698 req->in.h.nodeid = get_node_id(olddir);
699 req->in.numargs = 3;
700 req->in.args[0].size = sizeof(inarg);
701 req->in.args[0].value = &inarg;
702 req->in.args[1].size = oldent->d_name.len + 1;
703 req->in.args[1].value = oldent->d_name.name;
704 req->in.args[2].size = newent->d_name.len + 1;
705 req->in.args[2].value = newent->d_name.name;
706 fuse_request_send(fc, req);
707 err = req->out.h.error;
708 fuse_put_request(fc, req);
709 if (!err) {
710
711 fuse_invalidate_attr(oldent->d_inode);
712
713 fuse_invalidate_attr(olddir);
714 if (olddir != newdir)
715 fuse_invalidate_attr(newdir);
716
717
718 if (newent->d_inode) {
719 fuse_invalidate_attr(newent->d_inode);
720 fuse_invalidate_entry_cache(newent);
721 }
722 } else if (err == -EINTR) {
723
724
725
726
727
728 fuse_invalidate_entry(oldent);
729 if (newent->d_inode)
730 fuse_invalidate_entry(newent);
731 }
732
733 return err;
734}
735
736static int fuse_link(struct dentry *entry, struct inode *newdir,
737 struct dentry *newent)
738{
739 int err;
740 struct fuse_link_in inarg;
741 struct inode *inode = entry->d_inode;
742 struct fuse_conn *fc = get_fuse_conn(inode);
743 struct fuse_req *req = fuse_get_req(fc);
744 if (IS_ERR(req))
745 return PTR_ERR(req);
746
747 memset(&inarg, 0, sizeof(inarg));
748 inarg.oldnodeid = get_node_id(inode);
749 req->in.h.opcode = FUSE_LINK;
750 req->in.numargs = 2;
751 req->in.args[0].size = sizeof(inarg);
752 req->in.args[0].value = &inarg;
753 req->in.args[1].size = newent->d_name.len + 1;
754 req->in.args[1].value = newent->d_name.name;
755 err = create_new_entry(fc, req, newdir, newent, inode->i_mode);
756
757
758
759
760
761
762 if (!err || err == -EINTR)
763 fuse_invalidate_attr(inode);
764 return err;
765}
766
767static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
768 struct kstat *stat)
769{
770 stat->dev = inode->i_sb->s_dev;
771 stat->ino = attr->ino;
772 stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
773 stat->nlink = attr->nlink;
774 stat->uid = attr->uid;
775 stat->gid = attr->gid;
776 stat->rdev = inode->i_rdev;
777 stat->atime.tv_sec = attr->atime;
778 stat->atime.tv_nsec = attr->atimensec;
779 stat->mtime.tv_sec = attr->mtime;
780 stat->mtime.tv_nsec = attr->mtimensec;
781 stat->ctime.tv_sec = attr->ctime;
782 stat->ctime.tv_nsec = attr->ctimensec;
783 stat->size = attr->size;
784 stat->blocks = attr->blocks;
785 stat->blksize = (1 << inode->i_blkbits);
786}
787
788static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
789 struct file *file)
790{
791 int err;
792 struct fuse_getattr_in inarg;
793 struct fuse_attr_out outarg;
794 struct fuse_conn *fc = get_fuse_conn(inode);
795 struct fuse_req *req;
796 u64 attr_version;
797
798 req = fuse_get_req(fc);
799 if (IS_ERR(req))
800 return PTR_ERR(req);
801
802 attr_version = fuse_get_attr_version(fc);
803
804 memset(&inarg, 0, sizeof(inarg));
805 memset(&outarg, 0, sizeof(outarg));
806
807 if (file && S_ISREG(inode->i_mode)) {
808 struct fuse_file *ff = file->private_data;
809
810 inarg.getattr_flags |= FUSE_GETATTR_FH;
811 inarg.fh = ff->fh;
812 }
813 req->in.h.opcode = FUSE_GETATTR;
814 req->in.h.nodeid = get_node_id(inode);
815 req->in.numargs = 1;
816 req->in.args[0].size = sizeof(inarg);
817 req->in.args[0].value = &inarg;
818 req->out.numargs = 1;
819 if (fc->minor < 9)
820 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
821 else
822 req->out.args[0].size = sizeof(outarg);
823 req->out.args[0].value = &outarg;
824 fuse_request_send(fc, req);
825 err = req->out.h.error;
826 fuse_put_request(fc, req);
827 if (!err) {
828 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
829 make_bad_inode(inode);
830 err = -EIO;
831 } else {
832 fuse_change_attributes(inode, &outarg.attr,
833 attr_timeout(&outarg),
834 attr_version);
835 if (stat)
836 fuse_fillattr(inode, &outarg.attr, stat);
837 }
838 }
839 return err;
840}
841
842int fuse_update_attributes(struct inode *inode, struct kstat *stat,
843 struct file *file, bool *refreshed)
844{
845 struct fuse_inode *fi = get_fuse_inode(inode);
846 int err;
847 bool r;
848
849 if (fi->i_time < get_jiffies_64()) {
850 r = true;
851 err = fuse_do_getattr(inode, stat, file);
852 } else {
853 r = false;
854 err = 0;
855 if (stat) {
856 generic_fillattr(inode, stat);
857 stat->mode = fi->orig_i_mode;
858 }
859 }
860
861 if (refreshed != NULL)
862 *refreshed = r;
863
864 return err;
865}
866
867int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
868 struct qstr *name)
869{
870 int err = -ENOTDIR;
871 struct inode *parent;
872 struct dentry *dir;
873 struct dentry *entry;
874
875 parent = ilookup5(sb, parent_nodeid, fuse_inode_eq, &parent_nodeid);
876 if (!parent)
877 return -ENOENT;
878
879 mutex_lock(&parent->i_mutex);
880 if (!S_ISDIR(parent->i_mode))
881 goto unlock;
882
883 err = -ENOENT;
884 dir = d_find_alias(parent);
885 if (!dir)
886 goto unlock;
887
888 entry = d_lookup(dir, name);
889 dput(dir);
890 if (!entry)
891 goto unlock;
892
893 fuse_invalidate_attr(parent);
894 fuse_invalidate_entry(entry);
895 dput(entry);
896 err = 0;
897
898 unlock:
899 mutex_unlock(&parent->i_mutex);
900 iput(parent);
901 return err;
902}
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917int fuse_allow_task(struct fuse_conn *fc, struct task_struct *task)
918{
919 const struct cred *cred;
920 int ret;
921
922 if (fc->flags & FUSE_ALLOW_OTHER)
923 return 1;
924
925 rcu_read_lock();
926 ret = 0;
927 cred = __task_cred(task);
928 if (cred->euid == fc->user_id &&
929 cred->suid == fc->user_id &&
930 cred->uid == fc->user_id &&
931 cred->egid == fc->group_id &&
932 cred->sgid == fc->group_id &&
933 cred->gid == fc->group_id)
934 ret = 1;
935 rcu_read_unlock();
936
937 return ret;
938}
939
940static int fuse_access(struct inode *inode, int mask)
941{
942 struct fuse_conn *fc = get_fuse_conn(inode);
943 struct fuse_req *req;
944 struct fuse_access_in inarg;
945 int err;
946
947 if (fc->no_access)
948 return 0;
949
950 req = fuse_get_req(fc);
951 if (IS_ERR(req))
952 return PTR_ERR(req);
953
954 memset(&inarg, 0, sizeof(inarg));
955 inarg.mask = mask & (MAY_READ | MAY_WRITE | MAY_EXEC);
956 req->in.h.opcode = FUSE_ACCESS;
957 req->in.h.nodeid = get_node_id(inode);
958 req->in.numargs = 1;
959 req->in.args[0].size = sizeof(inarg);
960 req->in.args[0].value = &inarg;
961 fuse_request_send(fc, req);
962 err = req->out.h.error;
963 fuse_put_request(fc, req);
964 if (err == -ENOSYS) {
965 fc->no_access = 1;
966 err = 0;
967 }
968 return err;
969}
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984static int fuse_permission(struct inode *inode, int mask)
985{
986 struct fuse_conn *fc = get_fuse_conn(inode);
987 bool refreshed = false;
988 int err = 0;
989
990 if (!fuse_allow_task(fc, current))
991 return -EACCES;
992
993
994
995
996 if ((fc->flags & FUSE_DEFAULT_PERMISSIONS) ||
997 ((mask & MAY_EXEC) && S_ISREG(inode->i_mode))) {
998 err = fuse_update_attributes(inode, NULL, NULL, &refreshed);
999 if (err)
1000 return err;
1001 }
1002
1003 if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1004 err = generic_permission(inode, mask, NULL);
1005
1006
1007
1008
1009 if (err == -EACCES && !refreshed) {
1010 err = fuse_do_getattr(inode, NULL, NULL);
1011 if (!err)
1012 err = generic_permission(inode, mask, NULL);
1013 }
1014
1015
1016
1017
1018
1019 } else if (mask & MAY_ACCESS) {
1020 err = fuse_access(inode, mask);
1021 } else if ((mask & MAY_EXEC) && S_ISREG(inode->i_mode)) {
1022 if (!(inode->i_mode & S_IXUGO)) {
1023 if (refreshed)
1024 return -EACCES;
1025
1026 err = fuse_do_getattr(inode, NULL, NULL);
1027 if (!err && !(inode->i_mode & S_IXUGO))
1028 return -EACCES;
1029 }
1030 }
1031 return err;
1032}
1033
1034static int parse_dirfile(char *buf, size_t nbytes, struct file *file,
1035 void *dstbuf, filldir_t filldir)
1036{
1037 while (nbytes >= FUSE_NAME_OFFSET) {
1038 struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
1039 size_t reclen = FUSE_DIRENT_SIZE(dirent);
1040 int over;
1041 if (!dirent->namelen || dirent->namelen > FUSE_NAME_MAX)
1042 return -EIO;
1043 if (reclen > nbytes)
1044 break;
1045
1046 over = filldir(dstbuf, dirent->name, dirent->namelen,
1047 file->f_pos, dirent->ino, dirent->type);
1048 if (over)
1049 break;
1050
1051 buf += reclen;
1052 nbytes -= reclen;
1053 file->f_pos = dirent->off;
1054 }
1055
1056 return 0;
1057}
1058
1059static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
1060{
1061 int err;
1062 size_t nbytes;
1063 struct page *page;
1064 struct inode *inode = file->f_path.dentry->d_inode;
1065 struct fuse_conn *fc = get_fuse_conn(inode);
1066 struct fuse_req *req;
1067
1068 if (is_bad_inode(inode))
1069 return -EIO;
1070
1071 req = fuse_get_req(fc);
1072 if (IS_ERR(req))
1073 return PTR_ERR(req);
1074
1075 page = alloc_page(GFP_KERNEL);
1076 if (!page) {
1077 fuse_put_request(fc, req);
1078 return -ENOMEM;
1079 }
1080 req->out.argpages = 1;
1081 req->num_pages = 1;
1082 req->pages[0] = page;
1083 fuse_read_fill(req, file, file->f_pos, PAGE_SIZE, FUSE_READDIR);
1084 fuse_request_send(fc, req);
1085 nbytes = req->out.args[0].size;
1086 err = req->out.h.error;
1087 fuse_put_request(fc, req);
1088 if (!err)
1089 err = parse_dirfile(page_address(page), nbytes, file, dstbuf,
1090 filldir);
1091
1092 __free_page(page);
1093 fuse_invalidate_attr(inode);
1094 return err;
1095}
1096
1097static char *read_link(struct dentry *dentry)
1098{
1099 struct inode *inode = dentry->d_inode;
1100 struct fuse_conn *fc = get_fuse_conn(inode);
1101 struct fuse_req *req = fuse_get_req(fc);
1102 char *link;
1103
1104 if (IS_ERR(req))
1105 return ERR_CAST(req);
1106
1107 link = (char *) __get_free_page(GFP_KERNEL);
1108 if (!link) {
1109 link = ERR_PTR(-ENOMEM);
1110 goto out;
1111 }
1112 req->in.h.opcode = FUSE_READLINK;
1113 req->in.h.nodeid = get_node_id(inode);
1114 req->out.argvar = 1;
1115 req->out.numargs = 1;
1116 req->out.args[0].size = PAGE_SIZE - 1;
1117 req->out.args[0].value = link;
1118 fuse_request_send(fc, req);
1119 if (req->out.h.error) {
1120 free_page((unsigned long) link);
1121 link = ERR_PTR(req->out.h.error);
1122 } else
1123 link[req->out.args[0].size] = '\0';
1124 out:
1125 fuse_put_request(fc, req);
1126 fuse_invalidate_attr(inode);
1127 return link;
1128}
1129
1130static void free_link(char *link)
1131{
1132 if (!IS_ERR(link))
1133 free_page((unsigned long) link);
1134}
1135
1136static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd)
1137{
1138 nd_set_link(nd, read_link(dentry));
1139 return NULL;
1140}
1141
1142static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c)
1143{
1144 free_link(nd_get_link(nd));
1145}
1146
1147static int fuse_dir_open(struct inode *inode, struct file *file)
1148{
1149 return fuse_open_common(inode, file, true);
1150}
1151
1152static int fuse_dir_release(struct inode *inode, struct file *file)
1153{
1154 fuse_release_common(file, FUSE_RELEASEDIR);
1155
1156 return 0;
1157}
1158
1159static int fuse_dir_fsync(struct file *file, struct dentry *de, int datasync)
1160{
1161
1162 return file ? fuse_fsync_common(file, de, datasync, 1) : 0;
1163}
1164
1165static bool update_mtime(unsigned ivalid)
1166{
1167
1168 if (ivalid & ATTR_MTIME_SET)
1169 return true;
1170
1171
1172 if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
1173 return false;
1174
1175
1176 return true;
1177}
1178
1179static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
1180{
1181 unsigned ivalid = iattr->ia_valid;
1182
1183 if (ivalid & ATTR_MODE)
1184 arg->valid |= FATTR_MODE, arg->mode = iattr->ia_mode;
1185 if (ivalid & ATTR_UID)
1186 arg->valid |= FATTR_UID, arg->uid = iattr->ia_uid;
1187 if (ivalid & ATTR_GID)
1188 arg->valid |= FATTR_GID, arg->gid = iattr->ia_gid;
1189 if (ivalid & ATTR_SIZE)
1190 arg->valid |= FATTR_SIZE, arg->size = iattr->ia_size;
1191 if (ivalid & ATTR_ATIME) {
1192 arg->valid |= FATTR_ATIME;
1193 arg->atime = iattr->ia_atime.tv_sec;
1194 arg->atimensec = iattr->ia_atime.tv_nsec;
1195 if (!(ivalid & ATTR_ATIME_SET))
1196 arg->valid |= FATTR_ATIME_NOW;
1197 }
1198 if ((ivalid & ATTR_MTIME) && update_mtime(ivalid)) {
1199 arg->valid |= FATTR_MTIME;
1200 arg->mtime = iattr->ia_mtime.tv_sec;
1201 arg->mtimensec = iattr->ia_mtime.tv_nsec;
1202 if (!(ivalid & ATTR_MTIME_SET))
1203 arg->valid |= FATTR_MTIME_NOW;
1204 }
1205}
1206
1207
1208
1209
1210
1211
1212
1213void fuse_set_nowrite(struct inode *inode)
1214{
1215 struct fuse_conn *fc = get_fuse_conn(inode);
1216 struct fuse_inode *fi = get_fuse_inode(inode);
1217
1218 BUG_ON(!mutex_is_locked(&inode->i_mutex));
1219
1220 spin_lock(&fc->lock);
1221 BUG_ON(fi->writectr < 0);
1222 fi->writectr += FUSE_NOWRITE;
1223 spin_unlock(&fc->lock);
1224 wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
1225}
1226
1227
1228
1229
1230
1231
1232
1233static void __fuse_release_nowrite(struct inode *inode)
1234{
1235 struct fuse_inode *fi = get_fuse_inode(inode);
1236
1237 BUG_ON(fi->writectr != FUSE_NOWRITE);
1238 fi->writectr = 0;
1239 fuse_flush_writepages(inode);
1240}
1241
1242void fuse_release_nowrite(struct inode *inode)
1243{
1244 struct fuse_conn *fc = get_fuse_conn(inode);
1245
1246 spin_lock(&fc->lock);
1247 __fuse_release_nowrite(inode);
1248 spin_unlock(&fc->lock);
1249}
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259static int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
1260 struct file *file)
1261{
1262 struct inode *inode = entry->d_inode;
1263 struct fuse_conn *fc = get_fuse_conn(inode);
1264 struct fuse_req *req;
1265 struct fuse_setattr_in inarg;
1266 struct fuse_attr_out outarg;
1267 bool is_truncate = false;
1268 loff_t oldsize;
1269 int err;
1270
1271 if (!fuse_allow_task(fc, current))
1272 return -EACCES;
1273
1274 if (fc->flags & FUSE_DEFAULT_PERMISSIONS) {
1275 err = inode_change_ok(inode, attr);
1276 if (err)
1277 return err;
1278 }
1279
1280 if ((attr->ia_valid & ATTR_OPEN) && fc->atomic_o_trunc)
1281 return 0;
1282
1283 if (attr->ia_valid & ATTR_SIZE) {
1284 err = inode_newsize_ok(inode, attr->ia_size);
1285 if (err)
1286 return err;
1287 is_truncate = true;
1288 }
1289
1290 req = fuse_get_req(fc);
1291 if (IS_ERR(req))
1292 return PTR_ERR(req);
1293
1294 if (is_truncate)
1295 fuse_set_nowrite(inode);
1296
1297 memset(&inarg, 0, sizeof(inarg));
1298 memset(&outarg, 0, sizeof(outarg));
1299 iattr_to_fattr(attr, &inarg);
1300 if (file) {
1301 struct fuse_file *ff = file->private_data;
1302 inarg.valid |= FATTR_FH;
1303 inarg.fh = ff->fh;
1304 }
1305 if (attr->ia_valid & ATTR_SIZE) {
1306
1307 inarg.valid |= FATTR_LOCKOWNER;
1308 inarg.lock_owner = fuse_lock_owner_id(fc, current->files);
1309 }
1310 req->in.h.opcode = FUSE_SETATTR;
1311 req->in.h.nodeid = get_node_id(inode);
1312 req->in.numargs = 1;
1313 req->in.args[0].size = sizeof(inarg);
1314 req->in.args[0].value = &inarg;
1315 req->out.numargs = 1;
1316 if (fc->minor < 9)
1317 req->out.args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
1318 else
1319 req->out.args[0].size = sizeof(outarg);
1320 req->out.args[0].value = &outarg;
1321 fuse_request_send(fc, req);
1322 err = req->out.h.error;
1323 fuse_put_request(fc, req);
1324 if (err) {
1325 if (err == -EINTR)
1326 fuse_invalidate_attr(inode);
1327 goto error;
1328 }
1329
1330 if ((inode->i_mode ^ outarg.attr.mode) & S_IFMT) {
1331 make_bad_inode(inode);
1332 err = -EIO;
1333 goto error;
1334 }
1335
1336 spin_lock(&fc->lock);
1337 fuse_change_attributes_common(inode, &outarg.attr,
1338 attr_timeout(&outarg));
1339 oldsize = inode->i_size;
1340 i_size_write(inode, outarg.attr.size);
1341
1342 if (is_truncate) {
1343
1344 __fuse_release_nowrite(inode);
1345 }
1346 spin_unlock(&fc->lock);
1347
1348
1349
1350
1351
1352 if (S_ISREG(inode->i_mode) && oldsize != outarg.attr.size) {
1353 truncate_pagecache(inode, oldsize, outarg.attr.size);
1354 invalidate_inode_pages2(inode->i_mapping);
1355 }
1356
1357 return 0;
1358
1359error:
1360 if (is_truncate)
1361 fuse_release_nowrite(inode);
1362
1363 return err;
1364}
1365
1366static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1367{
1368 if (attr->ia_valid & ATTR_FILE)
1369 return fuse_do_setattr(entry, attr, attr->ia_file);
1370 else
1371 return fuse_do_setattr(entry, attr, NULL);
1372}
1373
1374static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
1375 struct kstat *stat)
1376{
1377 struct inode *inode = entry->d_inode;
1378 struct fuse_conn *fc = get_fuse_conn(inode);
1379
1380 if (!fuse_allow_task(fc, current))
1381 return -EACCES;
1382
1383 return fuse_update_attributes(inode, stat, NULL, NULL);
1384}
1385
1386static int fuse_setxattr(struct dentry *entry, const char *name,
1387 const void *value, size_t size, int flags)
1388{
1389 struct inode *inode = entry->d_inode;
1390 struct fuse_conn *fc = get_fuse_conn(inode);
1391 struct fuse_req *req;
1392 struct fuse_setxattr_in inarg;
1393 int err;
1394
1395 if (fc->no_setxattr)
1396 return -EOPNOTSUPP;
1397
1398 req = fuse_get_req(fc);
1399 if (IS_ERR(req))
1400 return PTR_ERR(req);
1401
1402 memset(&inarg, 0, sizeof(inarg));
1403 inarg.size = size;
1404 inarg.flags = flags;
1405 req->in.h.opcode = FUSE_SETXATTR;
1406 req->in.h.nodeid = get_node_id(inode);
1407 req->in.numargs = 3;
1408 req->in.args[0].size = sizeof(inarg);
1409 req->in.args[0].value = &inarg;
1410 req->in.args[1].size = strlen(name) + 1;
1411 req->in.args[1].value = name;
1412 req->in.args[2].size = size;
1413 req->in.args[2].value = value;
1414 fuse_request_send(fc, req);
1415 err = req->out.h.error;
1416 fuse_put_request(fc, req);
1417 if (err == -ENOSYS) {
1418 fc->no_setxattr = 1;
1419 err = -EOPNOTSUPP;
1420 }
1421 return err;
1422}
1423
1424static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
1425 void *value, size_t size)
1426{
1427 struct inode *inode = entry->d_inode;
1428 struct fuse_conn *fc = get_fuse_conn(inode);
1429 struct fuse_req *req;
1430 struct fuse_getxattr_in inarg;
1431 struct fuse_getxattr_out outarg;
1432 ssize_t ret;
1433
1434 if (fc->no_getxattr)
1435 return -EOPNOTSUPP;
1436
1437 req = fuse_get_req(fc);
1438 if (IS_ERR(req))
1439 return PTR_ERR(req);
1440
1441 memset(&inarg, 0, sizeof(inarg));
1442 inarg.size = size;
1443 req->in.h.opcode = FUSE_GETXATTR;
1444 req->in.h.nodeid = get_node_id(inode);
1445 req->in.numargs = 2;
1446 req->in.args[0].size = sizeof(inarg);
1447 req->in.args[0].value = &inarg;
1448 req->in.args[1].size = strlen(name) + 1;
1449 req->in.args[1].value = name;
1450
1451 req->out.numargs = 1;
1452 if (size) {
1453 req->out.argvar = 1;
1454 req->out.args[0].size = size;
1455 req->out.args[0].value = value;
1456 } else {
1457 req->out.args[0].size = sizeof(outarg);
1458 req->out.args[0].value = &outarg;
1459 }
1460 fuse_request_send(fc, req);
1461 ret = req->out.h.error;
1462 if (!ret)
1463 ret = size ? req->out.args[0].size : outarg.size;
1464 else {
1465 if (ret == -ENOSYS) {
1466 fc->no_getxattr = 1;
1467 ret = -EOPNOTSUPP;
1468 }
1469 }
1470 fuse_put_request(fc, req);
1471 return ret;
1472}
1473
1474static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
1475{
1476 struct inode *inode = entry->d_inode;
1477 struct fuse_conn *fc = get_fuse_conn(inode);
1478 struct fuse_req *req;
1479 struct fuse_getxattr_in inarg;
1480 struct fuse_getxattr_out outarg;
1481 ssize_t ret;
1482
1483 if (!fuse_allow_task(fc, current))
1484 return -EACCES;
1485
1486 if (fc->no_listxattr)
1487 return -EOPNOTSUPP;
1488
1489 req = fuse_get_req(fc);
1490 if (IS_ERR(req))
1491 return PTR_ERR(req);
1492
1493 memset(&inarg, 0, sizeof(inarg));
1494 inarg.size = size;
1495 req->in.h.opcode = FUSE_LISTXATTR;
1496 req->in.h.nodeid = get_node_id(inode);
1497 req->in.numargs = 1;
1498 req->in.args[0].size = sizeof(inarg);
1499 req->in.args[0].value = &inarg;
1500
1501 req->out.numargs = 1;
1502 if (size) {
1503 req->out.argvar = 1;
1504 req->out.args[0].size = size;
1505 req->out.args[0].value = list;
1506 } else {
1507 req->out.args[0].size = sizeof(outarg);
1508 req->out.args[0].value = &outarg;
1509 }
1510 fuse_request_send(fc, req);
1511 ret = req->out.h.error;
1512 if (!ret)
1513 ret = size ? req->out.args[0].size : outarg.size;
1514 else {
1515 if (ret == -ENOSYS) {
1516 fc->no_listxattr = 1;
1517 ret = -EOPNOTSUPP;
1518 }
1519 }
1520 fuse_put_request(fc, req);
1521 return ret;
1522}
1523
1524static int fuse_removexattr(struct dentry *entry, const char *name)
1525{
1526 struct inode *inode = entry->d_inode;
1527 struct fuse_conn *fc = get_fuse_conn(inode);
1528 struct fuse_req *req;
1529 int err;
1530
1531 if (fc->no_removexattr)
1532 return -EOPNOTSUPP;
1533
1534 req = fuse_get_req(fc);
1535 if (IS_ERR(req))
1536 return PTR_ERR(req);
1537
1538 req->in.h.opcode = FUSE_REMOVEXATTR;
1539 req->in.h.nodeid = get_node_id(inode);
1540 req->in.numargs = 1;
1541 req->in.args[0].size = strlen(name) + 1;
1542 req->in.args[0].value = name;
1543 fuse_request_send(fc, req);
1544 err = req->out.h.error;
1545 fuse_put_request(fc, req);
1546 if (err == -ENOSYS) {
1547 fc->no_removexattr = 1;
1548 err = -EOPNOTSUPP;
1549 }
1550 return err;
1551}
1552
1553static const struct inode_operations fuse_dir_inode_operations = {
1554 .lookup = fuse_lookup,
1555 .mkdir = fuse_mkdir,
1556 .symlink = fuse_symlink,
1557 .unlink = fuse_unlink,
1558 .rmdir = fuse_rmdir,
1559 .rename = fuse_rename,
1560 .link = fuse_link,
1561 .setattr = fuse_setattr,
1562 .create = fuse_create,
1563 .mknod = fuse_mknod,
1564 .permission = fuse_permission,
1565 .getattr = fuse_getattr,
1566 .setxattr = fuse_setxattr,
1567 .getxattr = fuse_getxattr,
1568 .listxattr = fuse_listxattr,
1569 .removexattr = fuse_removexattr,
1570};
1571
1572static const struct file_operations fuse_dir_operations = {
1573 .llseek = generic_file_llseek,
1574 .read = generic_read_dir,
1575 .readdir = fuse_readdir,
1576 .open = fuse_dir_open,
1577 .release = fuse_dir_release,
1578 .fsync = fuse_dir_fsync,
1579};
1580
1581static const struct inode_operations fuse_common_inode_operations = {
1582 .setattr = fuse_setattr,
1583 .permission = fuse_permission,
1584 .getattr = fuse_getattr,
1585 .setxattr = fuse_setxattr,
1586 .getxattr = fuse_getxattr,
1587 .listxattr = fuse_listxattr,
1588 .removexattr = fuse_removexattr,
1589};
1590
1591static const struct inode_operations fuse_symlink_inode_operations = {
1592 .setattr = fuse_setattr,
1593 .follow_link = fuse_follow_link,
1594 .put_link = fuse_put_link,
1595 .readlink = generic_readlink,
1596 .getattr = fuse_getattr,
1597 .setxattr = fuse_setxattr,
1598 .getxattr = fuse_getxattr,
1599 .listxattr = fuse_listxattr,
1600 .removexattr = fuse_removexattr,
1601};
1602
1603void fuse_init_common(struct inode *inode)
1604{
1605 inode->i_op = &fuse_common_inode_operations;
1606}
1607
1608void fuse_init_dir(struct inode *inode)
1609{
1610 inode->i_op = &fuse_dir_inode_operations;
1611 inode->i_fop = &fuse_dir_operations;
1612}
1613
1614void fuse_init_symlink(struct inode *inode)
1615{
1616 inode->i_op = &fuse_symlink_inode_operations;
1617}
1618