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