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