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