hostfs_kern.c (21727B)
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/writeback.h> 18#include <linux/mount.h> 19#include <linux/namei.h> 20#include "hostfs.h" 21#include <init.h> 22#include <kern.h> 23 24struct hostfs_inode_info { 25 int fd; 26 fmode_t mode; 27 struct inode vfs_inode; 28 struct mutex open_mutex; 29}; 30 31static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode) 32{ 33 return list_entry(inode, struct hostfs_inode_info, vfs_inode); 34} 35 36#define FILE_HOSTFS_I(file) HOSTFS_I(file_inode(file)) 37 38static struct kmem_cache *hostfs_inode_cache; 39 40/* Changed in hostfs_args before the kernel starts running */ 41static char *root_ino = ""; 42static int append = 0; 43 44static const struct inode_operations hostfs_iops; 45static const struct inode_operations hostfs_dir_iops; 46static const struct inode_operations hostfs_link_iops; 47 48#ifndef MODULE 49static int __init hostfs_args(char *options, int *add) 50{ 51 char *ptr; 52 53 ptr = strchr(options, ','); 54 if (ptr != NULL) 55 *ptr++ = '\0'; 56 if (*options != '\0') 57 root_ino = options; 58 59 options = ptr; 60 while (options) { 61 ptr = strchr(options, ','); 62 if (ptr != NULL) 63 *ptr++ = '\0'; 64 if (*options != '\0') { 65 if (!strcmp(options, "append")) 66 append = 1; 67 else printf("hostfs_args - unsupported option - %s\n", 68 options); 69 } 70 options = ptr; 71 } 72 return 0; 73} 74 75__uml_setup("hostfs=", hostfs_args, 76"hostfs=<root dir>,<flags>,...\n" 77" This is used to set hostfs parameters. The root directory argument\n" 78" is used to confine all hostfs mounts to within the specified directory\n" 79" tree on the host. If this isn't specified, then a user inside UML can\n" 80" mount anything on the host that's accessible to the user that's running\n" 81" it.\n" 82" The only flag currently supported is 'append', which specifies that all\n" 83" files opened by hostfs will be opened in append mode.\n\n" 84); 85#endif 86 87static char *__dentry_name(struct dentry *dentry, char *name) 88{ 89 char *p = dentry_path_raw(dentry, name, PATH_MAX); 90 char *root; 91 size_t len; 92 93 root = dentry->d_sb->s_fs_info; 94 len = strlen(root); 95 if (IS_ERR(p)) { 96 __putname(name); 97 return NULL; 98 } 99 100 /* 101 * This function relies on the fact that dentry_path_raw() will place 102 * the path name at the end of the provided buffer. 103 */ 104 BUG_ON(p + strlen(p) + 1 != name + PATH_MAX); 105 106 strlcpy(name, root, PATH_MAX); 107 if (len > p - name) { 108 __putname(name); 109 return NULL; 110 } 111 112 if (p > name + len) 113 strcpy(name + len, p); 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); 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 char *name, *resolved, *end; 146 int n; 147 148 name = kmalloc(PATH_MAX, GFP_KERNEL); 149 if (!name) { 150 n = -ENOMEM; 151 goto out_free; 152 } 153 154 n = hostfs_do_readlink(link, name, PATH_MAX); 155 if (n < 0) 156 goto out_free; 157 else if (n == PATH_MAX) { 158 n = -E2BIG; 159 goto out_free; 160 } 161 162 if (*name == '/') 163 return name; 164 165 end = strrchr(link, '/'); 166 if (end == NULL) 167 return name; 168 169 *(end + 1) = '\0'; 170 171 resolved = kasprintf(GFP_KERNEL, "%s%s", link, name); 172 if (resolved == NULL) { 173 n = -ENOMEM; 174 goto out_free; 175 } 176 177 kfree(name); 178 return resolved; 179 180 out_free: 181 kfree(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 = alloc_inode_sb(sb, hostfs_inode_cache, 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 kmem_cache_free(hostfs_inode_cache, 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_dentry(file)); 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 .splice_write = iter_file_splice_write, 386 .read_iter = generic_file_read_iter, 387 .write_iter = generic_file_write_iter, 388 .mmap = generic_file_mmap, 389 .open = hostfs_open, 390 .release = hostfs_file_release, 391 .fsync = hostfs_fsync, 392}; 393 394static const struct file_operations hostfs_dir_fops = { 395 .llseek = generic_file_llseek, 396 .iterate_shared = hostfs_readdir, 397 .read = generic_read_dir, 398 .open = hostfs_open, 399 .fsync = hostfs_fsync, 400}; 401 402static int hostfs_writepage(struct page *page, struct writeback_control *wbc) 403{ 404 struct address_space *mapping = page->mapping; 405 struct inode *inode = mapping->host; 406 char *buffer; 407 loff_t base = page_offset(page); 408 int count = PAGE_SIZE; 409 int end_index = inode->i_size >> PAGE_SHIFT; 410 int err; 411 412 if (page->index >= end_index) 413 count = inode->i_size & (PAGE_SIZE-1); 414 415 buffer = kmap(page); 416 417 err = write_file(HOSTFS_I(inode)->fd, &base, buffer, count); 418 if (err != count) { 419 ClearPageUptodate(page); 420 goto out; 421 } 422 423 if (base > inode->i_size) 424 inode->i_size = base; 425 426 if (PageError(page)) 427 ClearPageError(page); 428 err = 0; 429 430 out: 431 kunmap(page); 432 433 unlock_page(page); 434 return err; 435} 436 437static int hostfs_read_folio(struct file *file, struct folio *folio) 438{ 439 struct page *page = &folio->page; 440 char *buffer; 441 loff_t start = page_offset(page); 442 int bytes_read, ret = 0; 443 444 buffer = kmap(page); 445 bytes_read = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer, 446 PAGE_SIZE); 447 if (bytes_read < 0) { 448 ClearPageUptodate(page); 449 SetPageError(page); 450 ret = bytes_read; 451 goto out; 452 } 453 454 memset(buffer + bytes_read, 0, PAGE_SIZE - bytes_read); 455 456 ClearPageError(page); 457 SetPageUptodate(page); 458 459 out: 460 flush_dcache_page(page); 461 kunmap(page); 462 unlock_page(page); 463 return ret; 464} 465 466static int hostfs_write_begin(struct file *file, struct address_space *mapping, 467 loff_t pos, unsigned len, 468 struct page **pagep, void **fsdata) 469{ 470 pgoff_t index = pos >> PAGE_SHIFT; 471 472 *pagep = grab_cache_page_write_begin(mapping, index); 473 if (!*pagep) 474 return -ENOMEM; 475 return 0; 476} 477 478static int hostfs_write_end(struct file *file, struct address_space *mapping, 479 loff_t pos, unsigned len, unsigned copied, 480 struct page *page, void *fsdata) 481{ 482 struct inode *inode = mapping->host; 483 void *buffer; 484 unsigned from = pos & (PAGE_SIZE - 1); 485 int err; 486 487 buffer = kmap(page); 488 err = write_file(FILE_HOSTFS_I(file)->fd, &pos, buffer + from, copied); 489 kunmap(page); 490 491 if (!PageUptodate(page) && err == PAGE_SIZE) 492 SetPageUptodate(page); 493 494 /* 495 * If err > 0, write_file has added err to pos, so we are comparing 496 * i_size against the last byte written. 497 */ 498 if (err > 0 && (pos > inode->i_size)) 499 inode->i_size = pos; 500 unlock_page(page); 501 put_page(page); 502 503 return err; 504} 505 506static const struct address_space_operations hostfs_aops = { 507 .writepage = hostfs_writepage, 508 .read_folio = hostfs_read_folio, 509 .dirty_folio = filemap_dirty_folio, 510 .write_begin = hostfs_write_begin, 511 .write_end = hostfs_write_end, 512}; 513 514static int read_name(struct inode *ino, char *name) 515{ 516 dev_t rdev; 517 struct hostfs_stat st; 518 int err = stat_file(name, &st, -1); 519 if (err) 520 return err; 521 522 /* Reencode maj and min with the kernel encoding.*/ 523 rdev = MKDEV(st.maj, st.min); 524 525 switch (st.mode & S_IFMT) { 526 case S_IFLNK: 527 ino->i_op = &hostfs_link_iops; 528 break; 529 case S_IFDIR: 530 ino->i_op = &hostfs_dir_iops; 531 ino->i_fop = &hostfs_dir_fops; 532 break; 533 case S_IFCHR: 534 case S_IFBLK: 535 case S_IFIFO: 536 case S_IFSOCK: 537 init_special_inode(ino, st.mode & S_IFMT, rdev); 538 ino->i_op = &hostfs_iops; 539 break; 540 case S_IFREG: 541 ino->i_op = &hostfs_iops; 542 ino->i_fop = &hostfs_file_fops; 543 ino->i_mapping->a_ops = &hostfs_aops; 544 break; 545 default: 546 return -EIO; 547 } 548 549 ino->i_ino = st.ino; 550 ino->i_mode = st.mode; 551 set_nlink(ino, st.nlink); 552 i_uid_write(ino, st.uid); 553 i_gid_write(ino, st.gid); 554 ino->i_atime = (struct timespec64){ st.atime.tv_sec, st.atime.tv_nsec }; 555 ino->i_mtime = (struct timespec64){ st.mtime.tv_sec, st.mtime.tv_nsec }; 556 ino->i_ctime = (struct timespec64){ st.ctime.tv_sec, st.ctime.tv_nsec }; 557 ino->i_size = st.size; 558 ino->i_blocks = st.blocks; 559 return 0; 560} 561 562static int hostfs_create(struct user_namespace *mnt_userns, struct inode *dir, 563 struct dentry *dentry, umode_t mode, bool excl) 564{ 565 struct inode *inode; 566 char *name; 567 int error, fd; 568 569 inode = hostfs_iget(dir->i_sb); 570 if (IS_ERR(inode)) { 571 error = PTR_ERR(inode); 572 goto out; 573 } 574 575 error = -ENOMEM; 576 name = dentry_name(dentry); 577 if (name == NULL) 578 goto out_put; 579 580 fd = file_create(name, mode & 0777); 581 if (fd < 0) 582 error = fd; 583 else 584 error = read_name(inode, name); 585 586 __putname(name); 587 if (error) 588 goto out_put; 589 590 HOSTFS_I(inode)->fd = fd; 591 HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE; 592 d_instantiate(dentry, inode); 593 return 0; 594 595 out_put: 596 iput(inode); 597 out: 598 return error; 599} 600 601static struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry, 602 unsigned int flags) 603{ 604 struct inode *inode; 605 char *name; 606 int err; 607 608 inode = hostfs_iget(ino->i_sb); 609 if (IS_ERR(inode)) 610 goto out; 611 612 err = -ENOMEM; 613 name = dentry_name(dentry); 614 if (name) { 615 err = read_name(inode, name); 616 __putname(name); 617 } 618 if (err) { 619 iput(inode); 620 inode = (err == -ENOENT) ? NULL : ERR_PTR(err); 621 } 622 out: 623 return d_splice_alias(inode, dentry); 624} 625 626static int hostfs_link(struct dentry *to, struct inode *ino, 627 struct dentry *from) 628{ 629 char *from_name, *to_name; 630 int err; 631 632 if ((from_name = dentry_name(from)) == NULL) 633 return -ENOMEM; 634 to_name = dentry_name(to); 635 if (to_name == NULL) { 636 __putname(from_name); 637 return -ENOMEM; 638 } 639 err = link_file(to_name, from_name); 640 __putname(from_name); 641 __putname(to_name); 642 return err; 643} 644 645static int hostfs_unlink(struct inode *ino, struct dentry *dentry) 646{ 647 char *file; 648 int err; 649 650 if (append) 651 return -EPERM; 652 653 if ((file = dentry_name(dentry)) == NULL) 654 return -ENOMEM; 655 656 err = unlink_file(file); 657 __putname(file); 658 return err; 659} 660 661static int hostfs_symlink(struct user_namespace *mnt_userns, struct inode *ino, 662 struct dentry *dentry, const char *to) 663{ 664 char *file; 665 int err; 666 667 if ((file = dentry_name(dentry)) == NULL) 668 return -ENOMEM; 669 err = make_symlink(file, to); 670 __putname(file); 671 return err; 672} 673 674static int hostfs_mkdir(struct user_namespace *mnt_userns, struct inode *ino, 675 struct dentry *dentry, umode_t mode) 676{ 677 char *file; 678 int err; 679 680 if ((file = dentry_name(dentry)) == NULL) 681 return -ENOMEM; 682 err = do_mkdir(file, mode); 683 __putname(file); 684 return err; 685} 686 687static int hostfs_rmdir(struct inode *ino, struct dentry *dentry) 688{ 689 char *file; 690 int err; 691 692 if ((file = dentry_name(dentry)) == NULL) 693 return -ENOMEM; 694 err = hostfs_do_rmdir(file); 695 __putname(file); 696 return err; 697} 698 699static int hostfs_mknod(struct user_namespace *mnt_userns, struct inode *dir, 700 struct dentry *dentry, umode_t mode, dev_t dev) 701{ 702 struct inode *inode; 703 char *name; 704 int err; 705 706 inode = hostfs_iget(dir->i_sb); 707 if (IS_ERR(inode)) { 708 err = PTR_ERR(inode); 709 goto out; 710 } 711 712 err = -ENOMEM; 713 name = dentry_name(dentry); 714 if (name == NULL) 715 goto out_put; 716 717 err = do_mknod(name, mode, MAJOR(dev), MINOR(dev)); 718 if (err) 719 goto out_free; 720 721 err = read_name(inode, name); 722 __putname(name); 723 if (err) 724 goto out_put; 725 726 d_instantiate(dentry, inode); 727 return 0; 728 729 out_free: 730 __putname(name); 731 out_put: 732 iput(inode); 733 out: 734 return err; 735} 736 737static int hostfs_rename2(struct user_namespace *mnt_userns, 738 struct inode *old_dir, struct dentry *old_dentry, 739 struct inode *new_dir, struct dentry *new_dentry, 740 unsigned int flags) 741{ 742 char *old_name, *new_name; 743 int err; 744 745 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) 746 return -EINVAL; 747 748 old_name = dentry_name(old_dentry); 749 if (old_name == NULL) 750 return -ENOMEM; 751 new_name = dentry_name(new_dentry); 752 if (new_name == NULL) { 753 __putname(old_name); 754 return -ENOMEM; 755 } 756 if (!flags) 757 err = rename_file(old_name, new_name); 758 else 759 err = rename2_file(old_name, new_name, flags); 760 761 __putname(old_name); 762 __putname(new_name); 763 return err; 764} 765 766static int hostfs_permission(struct user_namespace *mnt_userns, 767 struct inode *ino, int desired) 768{ 769 char *name; 770 int r = 0, w = 0, x = 0, err; 771 772 if (desired & MAY_NOT_BLOCK) 773 return -ECHILD; 774 775 if (desired & MAY_READ) r = 1; 776 if (desired & MAY_WRITE) w = 1; 777 if (desired & MAY_EXEC) x = 1; 778 name = inode_name(ino); 779 if (name == NULL) 780 return -ENOMEM; 781 782 if (S_ISCHR(ino->i_mode) || S_ISBLK(ino->i_mode) || 783 S_ISFIFO(ino->i_mode) || S_ISSOCK(ino->i_mode)) 784 err = 0; 785 else 786 err = access_file(name, r, w, x); 787 __putname(name); 788 if (!err) 789 err = generic_permission(&init_user_ns, ino, desired); 790 return err; 791} 792 793static int hostfs_setattr(struct user_namespace *mnt_userns, 794 struct dentry *dentry, struct iattr *attr) 795{ 796 struct inode *inode = d_inode(dentry); 797 struct hostfs_iattr attrs; 798 char *name; 799 int err; 800 801 int fd = HOSTFS_I(inode)->fd; 802 803 err = setattr_prepare(&init_user_ns, dentry, attr); 804 if (err) 805 return err; 806 807 if (append) 808 attr->ia_valid &= ~ATTR_SIZE; 809 810 attrs.ia_valid = 0; 811 if (attr->ia_valid & ATTR_MODE) { 812 attrs.ia_valid |= HOSTFS_ATTR_MODE; 813 attrs.ia_mode = attr->ia_mode; 814 } 815 if (attr->ia_valid & ATTR_UID) { 816 attrs.ia_valid |= HOSTFS_ATTR_UID; 817 attrs.ia_uid = from_kuid(&init_user_ns, attr->ia_uid); 818 } 819 if (attr->ia_valid & ATTR_GID) { 820 attrs.ia_valid |= HOSTFS_ATTR_GID; 821 attrs.ia_gid = from_kgid(&init_user_ns, attr->ia_gid); 822 } 823 if (attr->ia_valid & ATTR_SIZE) { 824 attrs.ia_valid |= HOSTFS_ATTR_SIZE; 825 attrs.ia_size = attr->ia_size; 826 } 827 if (attr->ia_valid & ATTR_ATIME) { 828 attrs.ia_valid |= HOSTFS_ATTR_ATIME; 829 attrs.ia_atime = (struct hostfs_timespec) 830 { attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec }; 831 } 832 if (attr->ia_valid & ATTR_MTIME) { 833 attrs.ia_valid |= HOSTFS_ATTR_MTIME; 834 attrs.ia_mtime = (struct hostfs_timespec) 835 { attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec }; 836 } 837 if (attr->ia_valid & ATTR_CTIME) { 838 attrs.ia_valid |= HOSTFS_ATTR_CTIME; 839 attrs.ia_ctime = (struct hostfs_timespec) 840 { attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec }; 841 } 842 if (attr->ia_valid & ATTR_ATIME_SET) { 843 attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET; 844 } 845 if (attr->ia_valid & ATTR_MTIME_SET) { 846 attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET; 847 } 848 name = dentry_name(dentry); 849 if (name == NULL) 850 return -ENOMEM; 851 err = set_attr(name, &attrs, fd); 852 __putname(name); 853 if (err) 854 return err; 855 856 if ((attr->ia_valid & ATTR_SIZE) && 857 attr->ia_size != i_size_read(inode)) 858 truncate_setsize(inode, attr->ia_size); 859 860 setattr_copy(&init_user_ns, inode, attr); 861 mark_inode_dirty(inode); 862 return 0; 863} 864 865static const struct inode_operations hostfs_iops = { 866 .permission = hostfs_permission, 867 .setattr = hostfs_setattr, 868}; 869 870static const struct inode_operations hostfs_dir_iops = { 871 .create = hostfs_create, 872 .lookup = hostfs_lookup, 873 .link = hostfs_link, 874 .unlink = hostfs_unlink, 875 .symlink = hostfs_symlink, 876 .mkdir = hostfs_mkdir, 877 .rmdir = hostfs_rmdir, 878 .mknod = hostfs_mknod, 879 .rename = hostfs_rename2, 880 .permission = hostfs_permission, 881 .setattr = hostfs_setattr, 882}; 883 884static const char *hostfs_get_link(struct dentry *dentry, 885 struct inode *inode, 886 struct delayed_call *done) 887{ 888 char *link; 889 if (!dentry) 890 return ERR_PTR(-ECHILD); 891 link = kmalloc(PATH_MAX, GFP_KERNEL); 892 if (link) { 893 char *path = dentry_name(dentry); 894 int err = -ENOMEM; 895 if (path) { 896 err = hostfs_do_readlink(path, link, PATH_MAX); 897 if (err == PATH_MAX) 898 err = -E2BIG; 899 __putname(path); 900 } 901 if (err < 0) { 902 kfree(link); 903 return ERR_PTR(err); 904 } 905 } else { 906 return ERR_PTR(-ENOMEM); 907 } 908 909 set_delayed_call(done, kfree_link, link); 910 return link; 911} 912 913static const struct inode_operations hostfs_link_iops = { 914 .get_link = hostfs_get_link, 915}; 916 917static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) 918{ 919 struct inode *root_inode; 920 char *host_root_path, *req_root = d; 921 int err; 922 923 sb->s_blocksize = 1024; 924 sb->s_blocksize_bits = 10; 925 sb->s_magic = HOSTFS_SUPER_MAGIC; 926 sb->s_op = &hostfs_sbops; 927 sb->s_d_op = &simple_dentry_operations; 928 sb->s_maxbytes = MAX_LFS_FILESIZE; 929 err = super_setup_bdi(sb); 930 if (err) 931 goto out; 932 933 /* NULL is printed as '(null)' by printf(): avoid that. */ 934 if (req_root == NULL) 935 req_root = ""; 936 937 err = -ENOMEM; 938 sb->s_fs_info = host_root_path = 939 kasprintf(GFP_KERNEL, "%s/%s", root_ino, req_root); 940 if (host_root_path == NULL) 941 goto out; 942 943 root_inode = new_inode(sb); 944 if (!root_inode) 945 goto out; 946 947 err = read_name(root_inode, host_root_path); 948 if (err) 949 goto out_put; 950 951 if (S_ISLNK(root_inode->i_mode)) { 952 char *name = follow_link(host_root_path); 953 if (IS_ERR(name)) { 954 err = PTR_ERR(name); 955 goto out_put; 956 } 957 err = read_name(root_inode, name); 958 kfree(name); 959 if (err) 960 goto out_put; 961 } 962 963 err = -ENOMEM; 964 sb->s_root = d_make_root(root_inode); 965 if (sb->s_root == NULL) 966 goto out; 967 968 return 0; 969 970out_put: 971 iput(root_inode); 972out: 973 return err; 974} 975 976static struct dentry *hostfs_read_sb(struct file_system_type *type, 977 int flags, const char *dev_name, 978 void *data) 979{ 980 return mount_nodev(type, flags, data, hostfs_fill_sb_common); 981} 982 983static void hostfs_kill_sb(struct super_block *s) 984{ 985 kill_anon_super(s); 986 kfree(s->s_fs_info); 987} 988 989static struct file_system_type hostfs_type = { 990 .owner = THIS_MODULE, 991 .name = "hostfs", 992 .mount = hostfs_read_sb, 993 .kill_sb = hostfs_kill_sb, 994 .fs_flags = 0, 995}; 996MODULE_ALIAS_FS("hostfs"); 997 998static int __init init_hostfs(void) 999{ 1000 hostfs_inode_cache = KMEM_CACHE(hostfs_inode_info, 0); 1001 if (!hostfs_inode_cache) 1002 return -ENOMEM; 1003 return register_filesystem(&hostfs_type); 1004} 1005 1006static void __exit exit_hostfs(void) 1007{ 1008 unregister_filesystem(&hostfs_type); 1009 kmem_cache_destroy(hostfs_inode_cache); 1010} 1011 1012module_init(init_hostfs) 1013module_exit(exit_hostfs) 1014MODULE_LICENSE("GPL");