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