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