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