xref: /openbmc/linux/fs/hostfs/hostfs_kern.c (revision baa7eb025ab14f3cba2e35c0a8648f9c9f01d24f)
1 /*
2  * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3  * Licensed under the GPL
4  *
5  * Ported the filesystem routines to 2.5.
6  * 2003-02-10 Petr Baudis <pasky@ucw.cz>
7  */
8 
9 #include <linux/fs.h>
10 #include <linux/module.h>
11 #include <linux/mm.h>
12 #include <linux/pagemap.h>
13 #include <linux/statfs.h>
14 #include <linux/slab.h>
15 #include <linux/seq_file.h>
16 #include <linux/mount.h>
17 #include <linux/namei.h>
18 #include "hostfs.h"
19 #include "init.h"
20 #include "kern.h"
21 
22 struct hostfs_inode_info {
23 	int fd;
24 	fmode_t mode;
25 	struct inode vfs_inode;
26 };
27 
28 static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode)
29 {
30 	return list_entry(inode, struct hostfs_inode_info, vfs_inode);
31 }
32 
33 #define FILE_HOSTFS_I(file) HOSTFS_I((file)->f_path.dentry->d_inode)
34 
35 static int hostfs_d_delete(struct dentry *dentry)
36 {
37 	return 1;
38 }
39 
40 static const struct dentry_operations hostfs_dentry_ops = {
41 	.d_delete		= hostfs_d_delete,
42 };
43 
44 /* Changed in hostfs_args before the kernel starts running */
45 static char *root_ino = "";
46 static int append = 0;
47 
48 #define HOSTFS_SUPER_MAGIC 0x00c0ffee
49 
50 static const struct inode_operations hostfs_iops;
51 static const struct inode_operations hostfs_dir_iops;
52 static const struct inode_operations hostfs_link_iops;
53 
54 #ifndef MODULE
55 static int __init hostfs_args(char *options, int *add)
56 {
57 	char *ptr;
58 
59 	ptr = strchr(options, ',');
60 	if (ptr != NULL)
61 		*ptr++ = '\0';
62 	if (*options != '\0')
63 		root_ino = options;
64 
65 	options = ptr;
66 	while (options) {
67 		ptr = strchr(options, ',');
68 		if (ptr != NULL)
69 			*ptr++ = '\0';
70 		if (*options != '\0') {
71 			if (!strcmp(options, "append"))
72 				append = 1;
73 			else printf("hostfs_args - unsupported option - %s\n",
74 				    options);
75 		}
76 		options = ptr;
77 	}
78 	return 0;
79 }
80 
81 __uml_setup("hostfs=", hostfs_args,
82 "hostfs=<root dir>,<flags>,...\n"
83 "    This is used to set hostfs parameters.  The root directory argument\n"
84 "    is used to confine all hostfs mounts to within the specified directory\n"
85 "    tree on the host.  If this isn't specified, then a user inside UML can\n"
86 "    mount anything on the host that's accessible to the user that's running\n"
87 "    it.\n"
88 "    The only flag currently supported is 'append', which specifies that all\n"
89 "    files opened by hostfs will be opened in append mode.\n\n"
90 );
91 #endif
92 
93 static char *__dentry_name(struct dentry *dentry, char *name)
94 {
95 	char *p = __dentry_path(dentry, name, PATH_MAX);
96 	char *root;
97 	size_t len;
98 
99 	spin_unlock(&dcache_lock);
100 
101 	root = dentry->d_sb->s_fs_info;
102 	len = strlen(root);
103 	if (IS_ERR(p)) {
104 		__putname(name);
105 		return NULL;
106 	}
107 	strlcpy(name, root, PATH_MAX);
108 	if (len > p - name) {
109 		__putname(name);
110 		return NULL;
111 	}
112 	if (p > name + len) {
113 		char *s = name + len;
114 		while ((*s++ = *p++) != '\0')
115 			;
116 	}
117 	return name;
118 }
119 
120 static char *dentry_name(struct dentry *dentry)
121 {
122 	char *name = __getname();
123 	if (!name)
124 		return NULL;
125 
126 	spin_lock(&dcache_lock);
127 	return __dentry_name(dentry, name); /* will unlock */
128 }
129 
130 static char *inode_name(struct inode *ino)
131 {
132 	struct dentry *dentry;
133 	char *name = __getname();
134 	if (!name)
135 		return NULL;
136 
137 	spin_lock(&dcache_lock);
138 	if (list_empty(&ino->i_dentry)) {
139 		spin_unlock(&dcache_lock);
140 		__putname(name);
141 		return NULL;
142 	}
143 	dentry = list_first_entry(&ino->i_dentry, struct dentry, d_alias);
144 	return __dentry_name(dentry, name); /* will unlock */
145 }
146 
147 static char *follow_link(char *link)
148 {
149 	int len, n;
150 	char *name, *resolved, *end;
151 
152 	len = 64;
153 	while (1) {
154 		n = -ENOMEM;
155 		name = kmalloc(len, GFP_KERNEL);
156 		if (name == NULL)
157 			goto out;
158 
159 		n = hostfs_do_readlink(link, name, len);
160 		if (n < len)
161 			break;
162 		len *= 2;
163 		kfree(name);
164 	}
165 	if (n < 0)
166 		goto out_free;
167 
168 	if (*name == '/')
169 		return name;
170 
171 	end = strrchr(link, '/');
172 	if (end == NULL)
173 		return name;
174 
175 	*(end + 1) = '\0';
176 	len = strlen(link) + strlen(name) + 1;
177 
178 	resolved = kmalloc(len, GFP_KERNEL);
179 	if (resolved == NULL) {
180 		n = -ENOMEM;
181 		goto out_free;
182 	}
183 
184 	sprintf(resolved, "%s%s", link, name);
185 	kfree(name);
186 	kfree(link);
187 	return resolved;
188 
189  out_free:
190 	kfree(name);
191  out:
192 	return ERR_PTR(n);
193 }
194 
195 static struct inode *hostfs_iget(struct super_block *sb)
196 {
197 	struct inode *inode = new_inode(sb);
198 	if (!inode)
199 		return ERR_PTR(-ENOMEM);
200 	return inode;
201 }
202 
203 int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)
204 {
205 	/*
206 	 * do_statfs uses struct statfs64 internally, but the linux kernel
207 	 * struct statfs still has 32-bit versions for most of these fields,
208 	 * so we convert them here
209 	 */
210 	int err;
211 	long long f_blocks;
212 	long long f_bfree;
213 	long long f_bavail;
214 	long long f_files;
215 	long long f_ffree;
216 
217 	err = do_statfs(dentry->d_sb->s_fs_info,
218 			&sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
219 			&f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
220 			&sf->f_namelen);
221 	if (err)
222 		return err;
223 	sf->f_blocks = f_blocks;
224 	sf->f_bfree = f_bfree;
225 	sf->f_bavail = f_bavail;
226 	sf->f_files = f_files;
227 	sf->f_ffree = f_ffree;
228 	sf->f_type = HOSTFS_SUPER_MAGIC;
229 	return 0;
230 }
231 
232 static struct inode *hostfs_alloc_inode(struct super_block *sb)
233 {
234 	struct hostfs_inode_info *hi;
235 
236 	hi = kzalloc(sizeof(*hi), GFP_KERNEL);
237 	if (hi == NULL)
238 		return NULL;
239 	hi->fd = -1;
240 	inode_init_once(&hi->vfs_inode);
241 	return &hi->vfs_inode;
242 }
243 
244 static void hostfs_evict_inode(struct inode *inode)
245 {
246 	truncate_inode_pages(&inode->i_data, 0);
247 	end_writeback(inode);
248 	if (HOSTFS_I(inode)->fd != -1) {
249 		close_file(&HOSTFS_I(inode)->fd);
250 		HOSTFS_I(inode)->fd = -1;
251 	}
252 }
253 
254 static void hostfs_destroy_inode(struct inode *inode)
255 {
256 	kfree(HOSTFS_I(inode));
257 }
258 
259 static int hostfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
260 {
261 	const char *root_path = vfs->mnt_sb->s_fs_info;
262 	size_t offset = strlen(root_ino) + 1;
263 
264 	if (strlen(root_path) > offset)
265 		seq_printf(seq, ",%s", root_path + offset);
266 
267 	return 0;
268 }
269 
270 static const struct super_operations hostfs_sbops = {
271 	.alloc_inode	= hostfs_alloc_inode,
272 	.destroy_inode	= hostfs_destroy_inode,
273 	.evict_inode	= hostfs_evict_inode,
274 	.statfs		= hostfs_statfs,
275 	.show_options	= hostfs_show_options,
276 };
277 
278 int hostfs_readdir(struct file *file, void *ent, filldir_t filldir)
279 {
280 	void *dir;
281 	char *name;
282 	unsigned long long next, ino;
283 	int error, len;
284 
285 	name = dentry_name(file->f_path.dentry);
286 	if (name == NULL)
287 		return -ENOMEM;
288 	dir = open_dir(name, &error);
289 	__putname(name);
290 	if (dir == NULL)
291 		return -error;
292 	next = file->f_pos;
293 	while ((name = read_dir(dir, &next, &ino, &len)) != NULL) {
294 		error = (*filldir)(ent, name, len, file->f_pos,
295 				   ino, DT_UNKNOWN);
296 		if (error) break;
297 		file->f_pos = next;
298 	}
299 	close_dir(dir);
300 	return 0;
301 }
302 
303 int hostfs_file_open(struct inode *ino, struct file *file)
304 {
305 	static DEFINE_MUTEX(open_mutex);
306 	char *name;
307 	fmode_t mode = 0;
308 	int err;
309 	int r = 0, w = 0, fd;
310 
311 	mode = file->f_mode & (FMODE_READ | FMODE_WRITE);
312 	if ((mode & HOSTFS_I(ino)->mode) == mode)
313 		return 0;
314 
315 	mode |= HOSTFS_I(ino)->mode;
316 
317 retry:
318 	if (mode & FMODE_READ)
319 		r = 1;
320 	if (mode & FMODE_WRITE)
321 		w = 1;
322 	if (w)
323 		r = 1;
324 
325 	name = dentry_name(file->f_path.dentry);
326 	if (name == NULL)
327 		return -ENOMEM;
328 
329 	fd = open_file(name, r, w, append);
330 	__putname(name);
331 	if (fd < 0)
332 		return fd;
333 
334 	mutex_lock(&open_mutex);
335 	/* somebody else had handled it first? */
336 	if ((mode & HOSTFS_I(ino)->mode) == mode) {
337 		mutex_unlock(&open_mutex);
338 		return 0;
339 	}
340 	if ((mode | HOSTFS_I(ino)->mode) != mode) {
341 		mode |= HOSTFS_I(ino)->mode;
342 		mutex_unlock(&open_mutex);
343 		close_file(&fd);
344 		goto retry;
345 	}
346 	if (HOSTFS_I(ino)->fd == -1) {
347 		HOSTFS_I(ino)->fd = fd;
348 	} else {
349 		err = replace_file(fd, HOSTFS_I(ino)->fd);
350 		close_file(&fd);
351 		if (err < 0) {
352 			mutex_unlock(&open_mutex);
353 			return err;
354 		}
355 	}
356 	HOSTFS_I(ino)->mode = mode;
357 	mutex_unlock(&open_mutex);
358 
359 	return 0;
360 }
361 
362 int hostfs_fsync(struct file *file, int datasync)
363 {
364 	return fsync_file(HOSTFS_I(file->f_mapping->host)->fd, datasync);
365 }
366 
367 static const struct file_operations hostfs_file_fops = {
368 	.llseek		= generic_file_llseek,
369 	.read		= do_sync_read,
370 	.splice_read	= generic_file_splice_read,
371 	.aio_read	= generic_file_aio_read,
372 	.aio_write	= generic_file_aio_write,
373 	.write		= do_sync_write,
374 	.mmap		= generic_file_mmap,
375 	.open		= hostfs_file_open,
376 	.release	= NULL,
377 	.fsync		= hostfs_fsync,
378 };
379 
380 static const struct file_operations hostfs_dir_fops = {
381 	.llseek		= generic_file_llseek,
382 	.readdir	= hostfs_readdir,
383 	.read		= generic_read_dir,
384 };
385 
386 int hostfs_writepage(struct page *page, struct writeback_control *wbc)
387 {
388 	struct address_space *mapping = page->mapping;
389 	struct inode *inode = mapping->host;
390 	char *buffer;
391 	unsigned long long base;
392 	int count = PAGE_CACHE_SIZE;
393 	int end_index = inode->i_size >> PAGE_CACHE_SHIFT;
394 	int err;
395 
396 	if (page->index >= end_index)
397 		count = inode->i_size & (PAGE_CACHE_SIZE-1);
398 
399 	buffer = kmap(page);
400 	base = ((unsigned long long) page->index) << PAGE_CACHE_SHIFT;
401 
402 	err = write_file(HOSTFS_I(inode)->fd, &base, buffer, count);
403 	if (err != count) {
404 		ClearPageUptodate(page);
405 		goto out;
406 	}
407 
408 	if (base > inode->i_size)
409 		inode->i_size = base;
410 
411 	if (PageError(page))
412 		ClearPageError(page);
413 	err = 0;
414 
415  out:
416 	kunmap(page);
417 
418 	unlock_page(page);
419 	return err;
420 }
421 
422 int hostfs_readpage(struct file *file, struct page *page)
423 {
424 	char *buffer;
425 	long long start;
426 	int err = 0;
427 
428 	start = (long long) page->index << PAGE_CACHE_SHIFT;
429 	buffer = kmap(page);
430 	err = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer,
431 			PAGE_CACHE_SIZE);
432 	if (err < 0)
433 		goto out;
434 
435 	memset(&buffer[err], 0, PAGE_CACHE_SIZE - err);
436 
437 	flush_dcache_page(page);
438 	SetPageUptodate(page);
439 	if (PageError(page)) ClearPageError(page);
440 	err = 0;
441  out:
442 	kunmap(page);
443 	unlock_page(page);
444 	return err;
445 }
446 
447 int hostfs_write_begin(struct file *file, struct address_space *mapping,
448 			loff_t pos, unsigned len, unsigned flags,
449 			struct page **pagep, void **fsdata)
450 {
451 	pgoff_t index = pos >> PAGE_CACHE_SHIFT;
452 
453 	*pagep = grab_cache_page_write_begin(mapping, index, flags);
454 	if (!*pagep)
455 		return -ENOMEM;
456 	return 0;
457 }
458 
459 int hostfs_write_end(struct file *file, struct address_space *mapping,
460 			loff_t pos, unsigned len, unsigned copied,
461 			struct page *page, void *fsdata)
462 {
463 	struct inode *inode = mapping->host;
464 	void *buffer;
465 	unsigned from = pos & (PAGE_CACHE_SIZE - 1);
466 	int err;
467 
468 	buffer = kmap(page);
469 	err = write_file(FILE_HOSTFS_I(file)->fd, &pos, buffer + from, copied);
470 	kunmap(page);
471 
472 	if (!PageUptodate(page) && err == PAGE_CACHE_SIZE)
473 		SetPageUptodate(page);
474 
475 	/*
476 	 * If err > 0, write_file has added err to pos, so we are comparing
477 	 * i_size against the last byte written.
478 	 */
479 	if (err > 0 && (pos > inode->i_size))
480 		inode->i_size = pos;
481 	unlock_page(page);
482 	page_cache_release(page);
483 
484 	return err;
485 }
486 
487 static const struct address_space_operations hostfs_aops = {
488 	.writepage 	= hostfs_writepage,
489 	.readpage	= hostfs_readpage,
490 	.set_page_dirty = __set_page_dirty_nobuffers,
491 	.write_begin	= hostfs_write_begin,
492 	.write_end	= hostfs_write_end,
493 };
494 
495 static int read_name(struct inode *ino, char *name)
496 {
497 	dev_t rdev;
498 	struct hostfs_stat st;
499 	int err = stat_file(name, &st, -1);
500 	if (err)
501 		return err;
502 
503 	/* Reencode maj and min with the kernel encoding.*/
504 	rdev = MKDEV(st.maj, st.min);
505 
506 	switch (st.mode & S_IFMT) {
507 	case S_IFLNK:
508 		ino->i_op = &hostfs_link_iops;
509 		break;
510 	case S_IFDIR:
511 		ino->i_op = &hostfs_dir_iops;
512 		ino->i_fop = &hostfs_dir_fops;
513 		break;
514 	case S_IFCHR:
515 	case S_IFBLK:
516 	case S_IFIFO:
517 	case S_IFSOCK:
518 		init_special_inode(ino, st.mode & S_IFMT, rdev);
519 		ino->i_op = &hostfs_iops;
520 		break;
521 
522 	default:
523 		ino->i_op = &hostfs_iops;
524 		ino->i_fop = &hostfs_file_fops;
525 		ino->i_mapping->a_ops = &hostfs_aops;
526 	}
527 
528 	ino->i_ino = st.ino;
529 	ino->i_mode = st.mode;
530 	ino->i_nlink = st.nlink;
531 	ino->i_uid = st.uid;
532 	ino->i_gid = st.gid;
533 	ino->i_atime = st.atime;
534 	ino->i_mtime = st.mtime;
535 	ino->i_ctime = st.ctime;
536 	ino->i_size = st.size;
537 	ino->i_blocks = st.blocks;
538 	return 0;
539 }
540 
541 int hostfs_create(struct inode *dir, struct dentry *dentry, int mode,
542 		  struct nameidata *nd)
543 {
544 	struct inode *inode;
545 	char *name;
546 	int error, fd;
547 
548 	inode = hostfs_iget(dir->i_sb);
549 	if (IS_ERR(inode)) {
550 		error = PTR_ERR(inode);
551 		goto out;
552 	}
553 
554 	error = -ENOMEM;
555 	name = dentry_name(dentry);
556 	if (name == NULL)
557 		goto out_put;
558 
559 	fd = file_create(name,
560 			 mode & S_IRUSR, mode & S_IWUSR, mode & S_IXUSR,
561 			 mode & S_IRGRP, mode & S_IWGRP, mode & S_IXGRP,
562 			 mode & S_IROTH, mode & S_IWOTH, mode & S_IXOTH);
563 	if (fd < 0)
564 		error = fd;
565 	else
566 		error = read_name(inode, name);
567 
568 	__putname(name);
569 	if (error)
570 		goto out_put;
571 
572 	HOSTFS_I(inode)->fd = fd;
573 	HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE;
574 	d_instantiate(dentry, inode);
575 	return 0;
576 
577  out_put:
578 	iput(inode);
579  out:
580 	return error;
581 }
582 
583 struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry,
584 			     struct nameidata *nd)
585 {
586 	struct inode *inode;
587 	char *name;
588 	int err;
589 
590 	inode = hostfs_iget(ino->i_sb);
591 	if (IS_ERR(inode)) {
592 		err = PTR_ERR(inode);
593 		goto out;
594 	}
595 
596 	err = -ENOMEM;
597 	name = dentry_name(dentry);
598 	if (name == NULL)
599 		goto out_put;
600 
601 	err = read_name(inode, name);
602 
603 	__putname(name);
604 	if (err == -ENOENT) {
605 		iput(inode);
606 		inode = NULL;
607 	}
608 	else if (err)
609 		goto out_put;
610 
611 	d_add(dentry, inode);
612 	dentry->d_op = &hostfs_dentry_ops;
613 	return NULL;
614 
615  out_put:
616 	iput(inode);
617  out:
618 	return ERR_PTR(err);
619 }
620 
621 int hostfs_link(struct dentry *to, struct inode *ino, struct dentry *from)
622 {
623 	char *from_name, *to_name;
624 	int err;
625 
626 	if ((from_name = dentry_name(from)) == NULL)
627 		return -ENOMEM;
628 	to_name = dentry_name(to);
629 	if (to_name == NULL) {
630 		__putname(from_name);
631 		return -ENOMEM;
632 	}
633 	err = link_file(to_name, from_name);
634 	__putname(from_name);
635 	__putname(to_name);
636 	return err;
637 }
638 
639 int hostfs_unlink(struct inode *ino, struct dentry *dentry)
640 {
641 	char *file;
642 	int err;
643 
644 	if (append)
645 		return -EPERM;
646 
647 	if ((file = dentry_name(dentry)) == NULL)
648 		return -ENOMEM;
649 
650 	err = unlink_file(file);
651 	__putname(file);
652 	return err;
653 }
654 
655 int hostfs_symlink(struct inode *ino, struct dentry *dentry, const char *to)
656 {
657 	char *file;
658 	int err;
659 
660 	if ((file = dentry_name(dentry)) == NULL)
661 		return -ENOMEM;
662 	err = make_symlink(file, to);
663 	__putname(file);
664 	return err;
665 }
666 
667 int hostfs_mkdir(struct inode *ino, struct dentry *dentry, int mode)
668 {
669 	char *file;
670 	int err;
671 
672 	if ((file = dentry_name(dentry)) == NULL)
673 		return -ENOMEM;
674 	err = do_mkdir(file, mode);
675 	__putname(file);
676 	return err;
677 }
678 
679 int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
680 {
681 	char *file;
682 	int err;
683 
684 	if ((file = dentry_name(dentry)) == NULL)
685 		return -ENOMEM;
686 	err = do_rmdir(file);
687 	__putname(file);
688 	return err;
689 }
690 
691 int hostfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
692 {
693 	struct inode *inode;
694 	char *name;
695 	int err;
696 
697 	inode = hostfs_iget(dir->i_sb);
698 	if (IS_ERR(inode)) {
699 		err = PTR_ERR(inode);
700 		goto out;
701 	}
702 
703 	err = -ENOMEM;
704 	name = dentry_name(dentry);
705 	if (name == NULL)
706 		goto out_put;
707 
708 	init_special_inode(inode, mode, dev);
709 	err = do_mknod(name, mode, MAJOR(dev), MINOR(dev));
710 	if (!err)
711 		goto out_free;
712 
713 	err = read_name(inode, name);
714 	__putname(name);
715 	if (err)
716 		goto out_put;
717 	if (err)
718 		goto out_put;
719 
720 	d_instantiate(dentry, inode);
721 	return 0;
722 
723  out_free:
724 	__putname(name);
725  out_put:
726 	iput(inode);
727  out:
728 	return err;
729 }
730 
731 int hostfs_rename(struct inode *from_ino, struct dentry *from,
732 		  struct inode *to_ino, struct dentry *to)
733 {
734 	char *from_name, *to_name;
735 	int err;
736 
737 	if ((from_name = dentry_name(from)) == NULL)
738 		return -ENOMEM;
739 	if ((to_name = dentry_name(to)) == NULL) {
740 		__putname(from_name);
741 		return -ENOMEM;
742 	}
743 	err = rename_file(from_name, to_name);
744 	__putname(from_name);
745 	__putname(to_name);
746 	return err;
747 }
748 
749 int hostfs_permission(struct inode *ino, int desired)
750 {
751 	char *name;
752 	int r = 0, w = 0, x = 0, err;
753 
754 	if (desired & MAY_READ) r = 1;
755 	if (desired & MAY_WRITE) w = 1;
756 	if (desired & MAY_EXEC) x = 1;
757 	name = inode_name(ino);
758 	if (name == NULL)
759 		return -ENOMEM;
760 
761 	if (S_ISCHR(ino->i_mode) || S_ISBLK(ino->i_mode) ||
762 	    S_ISFIFO(ino->i_mode) || S_ISSOCK(ino->i_mode))
763 		err = 0;
764 	else
765 		err = access_file(name, r, w, x);
766 	__putname(name);
767 	if (!err)
768 		err = generic_permission(ino, desired, NULL);
769 	return err;
770 }
771 
772 int hostfs_setattr(struct dentry *dentry, struct iattr *attr)
773 {
774 	struct inode *inode = dentry->d_inode;
775 	struct hostfs_iattr attrs;
776 	char *name;
777 	int err;
778 
779 	int fd = HOSTFS_I(inode)->fd;
780 
781 	err = inode_change_ok(inode, attr);
782 	if (err)
783 		return err;
784 
785 	if (append)
786 		attr->ia_valid &= ~ATTR_SIZE;
787 
788 	attrs.ia_valid = 0;
789 	if (attr->ia_valid & ATTR_MODE) {
790 		attrs.ia_valid |= HOSTFS_ATTR_MODE;
791 		attrs.ia_mode = attr->ia_mode;
792 	}
793 	if (attr->ia_valid & ATTR_UID) {
794 		attrs.ia_valid |= HOSTFS_ATTR_UID;
795 		attrs.ia_uid = attr->ia_uid;
796 	}
797 	if (attr->ia_valid & ATTR_GID) {
798 		attrs.ia_valid |= HOSTFS_ATTR_GID;
799 		attrs.ia_gid = attr->ia_gid;
800 	}
801 	if (attr->ia_valid & ATTR_SIZE) {
802 		attrs.ia_valid |= HOSTFS_ATTR_SIZE;
803 		attrs.ia_size = attr->ia_size;
804 	}
805 	if (attr->ia_valid & ATTR_ATIME) {
806 		attrs.ia_valid |= HOSTFS_ATTR_ATIME;
807 		attrs.ia_atime = attr->ia_atime;
808 	}
809 	if (attr->ia_valid & ATTR_MTIME) {
810 		attrs.ia_valid |= HOSTFS_ATTR_MTIME;
811 		attrs.ia_mtime = attr->ia_mtime;
812 	}
813 	if (attr->ia_valid & ATTR_CTIME) {
814 		attrs.ia_valid |= HOSTFS_ATTR_CTIME;
815 		attrs.ia_ctime = attr->ia_ctime;
816 	}
817 	if (attr->ia_valid & ATTR_ATIME_SET) {
818 		attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET;
819 	}
820 	if (attr->ia_valid & ATTR_MTIME_SET) {
821 		attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET;
822 	}
823 	name = dentry_name(dentry);
824 	if (name == NULL)
825 		return -ENOMEM;
826 	err = set_attr(name, &attrs, fd);
827 	__putname(name);
828 	if (err)
829 		return err;
830 
831 	if ((attr->ia_valid & ATTR_SIZE) &&
832 	    attr->ia_size != i_size_read(inode)) {
833 		int error;
834 
835 		error = vmtruncate(inode, attr->ia_size);
836 		if (err)
837 			return err;
838 	}
839 
840 	setattr_copy(inode, attr);
841 	mark_inode_dirty(inode);
842 	return 0;
843 }
844 
845 static const struct inode_operations hostfs_iops = {
846 	.create		= hostfs_create,
847 	.link		= hostfs_link,
848 	.unlink		= hostfs_unlink,
849 	.symlink	= hostfs_symlink,
850 	.mkdir		= hostfs_mkdir,
851 	.rmdir		= hostfs_rmdir,
852 	.mknod		= hostfs_mknod,
853 	.rename		= hostfs_rename,
854 	.permission	= hostfs_permission,
855 	.setattr	= hostfs_setattr,
856 };
857 
858 static const struct inode_operations hostfs_dir_iops = {
859 	.create		= hostfs_create,
860 	.lookup		= hostfs_lookup,
861 	.link		= hostfs_link,
862 	.unlink		= hostfs_unlink,
863 	.symlink	= hostfs_symlink,
864 	.mkdir		= hostfs_mkdir,
865 	.rmdir		= hostfs_rmdir,
866 	.mknod		= hostfs_mknod,
867 	.rename		= hostfs_rename,
868 	.permission	= hostfs_permission,
869 	.setattr	= hostfs_setattr,
870 };
871 
872 static void *hostfs_follow_link(struct dentry *dentry, struct nameidata *nd)
873 {
874 	char *link = __getname();
875 	if (link) {
876 		char *path = dentry_name(dentry);
877 		int err = -ENOMEM;
878 		if (path) {
879 			err = hostfs_do_readlink(path, link, PATH_MAX);
880 			if (err == PATH_MAX)
881 				err = -E2BIG;
882 			__putname(path);
883 		}
884 		if (err < 0) {
885 			__putname(link);
886 			link = ERR_PTR(err);
887 		}
888 	} else {
889 		link = ERR_PTR(-ENOMEM);
890 	}
891 
892 	nd_set_link(nd, link);
893 	return NULL;
894 }
895 
896 static void hostfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
897 {
898 	char *s = nd_get_link(nd);
899 	if (!IS_ERR(s))
900 		__putname(s);
901 }
902 
903 static const struct inode_operations hostfs_link_iops = {
904 	.readlink	= generic_readlink,
905 	.follow_link	= hostfs_follow_link,
906 	.put_link	= hostfs_put_link,
907 };
908 
909 static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent)
910 {
911 	struct inode *root_inode;
912 	char *host_root_path, *req_root = d;
913 	int err;
914 
915 	sb->s_blocksize = 1024;
916 	sb->s_blocksize_bits = 10;
917 	sb->s_magic = HOSTFS_SUPER_MAGIC;
918 	sb->s_op = &hostfs_sbops;
919 	sb->s_maxbytes = MAX_LFS_FILESIZE;
920 
921 	/* NULL is printed as <NULL> by sprintf: avoid that. */
922 	if (req_root == NULL)
923 		req_root = "";
924 
925 	err = -ENOMEM;
926 	sb->s_fs_info = host_root_path =
927 		kmalloc(strlen(root_ino) + strlen(req_root) + 2, GFP_KERNEL);
928 	if (host_root_path == NULL)
929 		goto out;
930 
931 	sprintf(host_root_path, "%s/%s", root_ino, req_root);
932 
933 	root_inode = new_inode(sb);
934 	if (!root_inode)
935 		goto out;
936 
937 	err = read_name(root_inode, host_root_path);
938 	if (err)
939 		goto out_put;
940 
941 	if (S_ISLNK(root_inode->i_mode)) {
942 		char *name = follow_link(host_root_path);
943 		if (IS_ERR(name))
944 			err = PTR_ERR(name);
945 		else
946 			err = read_name(root_inode, name);
947 		kfree(name);
948 		if (err)
949 			goto out_put;
950 	}
951 
952 	err = -ENOMEM;
953 	sb->s_root = d_alloc_root(root_inode);
954 	if (sb->s_root == NULL)
955 		goto out_put;
956 
957 	return 0;
958 
959 out_put:
960 	iput(root_inode);
961 out:
962 	return err;
963 }
964 
965 static struct dentry *hostfs_read_sb(struct file_system_type *type,
966 			  int flags, const char *dev_name,
967 			  void *data)
968 {
969 	return mount_nodev(type, flags, data, hostfs_fill_sb_common);
970 }
971 
972 static void hostfs_kill_sb(struct super_block *s)
973 {
974 	kill_anon_super(s);
975 	kfree(s->s_fs_info);
976 }
977 
978 static struct file_system_type hostfs_type = {
979 	.owner 		= THIS_MODULE,
980 	.name 		= "hostfs",
981 	.mount	 	= hostfs_read_sb,
982 	.kill_sb	= hostfs_kill_sb,
983 	.fs_flags 	= 0,
984 };
985 
986 static int __init init_hostfs(void)
987 {
988 	return register_filesystem(&hostfs_type);
989 }
990 
991 static void __exit exit_hostfs(void)
992 {
993 	unregister_filesystem(&hostfs_type);
994 }
995 
996 module_init(init_hostfs)
997 module_exit(exit_hostfs)
998 MODULE_LICENSE("GPL");
999