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