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