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