Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v5.18-rc2 1013 lines 22 kB view raw
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_readpage(struct file *file, struct page *page) 438{ 439 char *buffer; 440 loff_t start = page_offset(page); 441 int bytes_read, ret = 0; 442 443 buffer = kmap(page); 444 bytes_read = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer, 445 PAGE_SIZE); 446 if (bytes_read < 0) { 447 ClearPageUptodate(page); 448 SetPageError(page); 449 ret = bytes_read; 450 goto out; 451 } 452 453 memset(buffer + bytes_read, 0, PAGE_SIZE - bytes_read); 454 455 ClearPageError(page); 456 SetPageUptodate(page); 457 458 out: 459 flush_dcache_page(page); 460 kunmap(page); 461 unlock_page(page); 462 return ret; 463} 464 465static int hostfs_write_begin(struct file *file, struct address_space *mapping, 466 loff_t pos, unsigned len, unsigned flags, 467 struct page **pagep, void **fsdata) 468{ 469 pgoff_t index = pos >> PAGE_SHIFT; 470 471 *pagep = grab_cache_page_write_begin(mapping, index, flags); 472 if (!*pagep) 473 return -ENOMEM; 474 return 0; 475} 476 477static int hostfs_write_end(struct file *file, struct address_space *mapping, 478 loff_t pos, unsigned len, unsigned copied, 479 struct page *page, void *fsdata) 480{ 481 struct inode *inode = mapping->host; 482 void *buffer; 483 unsigned from = pos & (PAGE_SIZE - 1); 484 int err; 485 486 buffer = kmap(page); 487 err = write_file(FILE_HOSTFS_I(file)->fd, &pos, buffer + from, copied); 488 kunmap(page); 489 490 if (!PageUptodate(page) && err == PAGE_SIZE) 491 SetPageUptodate(page); 492 493 /* 494 * If err > 0, write_file has added err to pos, so we are comparing 495 * i_size against the last byte written. 496 */ 497 if (err > 0 && (pos > inode->i_size)) 498 inode->i_size = pos; 499 unlock_page(page); 500 put_page(page); 501 502 return err; 503} 504 505static const struct address_space_operations hostfs_aops = { 506 .writepage = hostfs_writepage, 507 .readpage = hostfs_readpage, 508 .dirty_folio = filemap_dirty_folio, 509 .write_begin = hostfs_write_begin, 510 .write_end = hostfs_write_end, 511}; 512 513static int read_name(struct inode *ino, char *name) 514{ 515 dev_t rdev; 516 struct hostfs_stat st; 517 int err = stat_file(name, &st, -1); 518 if (err) 519 return err; 520 521 /* Reencode maj and min with the kernel encoding.*/ 522 rdev = MKDEV(st.maj, st.min); 523 524 switch (st.mode & S_IFMT) { 525 case S_IFLNK: 526 ino->i_op = &hostfs_link_iops; 527 break; 528 case S_IFDIR: 529 ino->i_op = &hostfs_dir_iops; 530 ino->i_fop = &hostfs_dir_fops; 531 break; 532 case S_IFCHR: 533 case S_IFBLK: 534 case S_IFIFO: 535 case S_IFSOCK: 536 init_special_inode(ino, st.mode & S_IFMT, rdev); 537 ino->i_op = &hostfs_iops; 538 break; 539 case S_IFREG: 540 ino->i_op = &hostfs_iops; 541 ino->i_fop = &hostfs_file_fops; 542 ino->i_mapping->a_ops = &hostfs_aops; 543 break; 544 default: 545 return -EIO; 546 } 547 548 ino->i_ino = st.ino; 549 ino->i_mode = st.mode; 550 set_nlink(ino, st.nlink); 551 i_uid_write(ino, st.uid); 552 i_gid_write(ino, st.gid); 553 ino->i_atime = (struct timespec64){ st.atime.tv_sec, st.atime.tv_nsec }; 554 ino->i_mtime = (struct timespec64){ st.mtime.tv_sec, st.mtime.tv_nsec }; 555 ino->i_ctime = (struct timespec64){ st.ctime.tv_sec, st.ctime.tv_nsec }; 556 ino->i_size = st.size; 557 ino->i_blocks = st.blocks; 558 return 0; 559} 560 561static int hostfs_create(struct user_namespace *mnt_userns, struct inode *dir, 562 struct dentry *dentry, umode_t mode, bool excl) 563{ 564 struct inode *inode; 565 char *name; 566 int error, fd; 567 568 inode = hostfs_iget(dir->i_sb); 569 if (IS_ERR(inode)) { 570 error = PTR_ERR(inode); 571 goto out; 572 } 573 574 error = -ENOMEM; 575 name = dentry_name(dentry); 576 if (name == NULL) 577 goto out_put; 578 579 fd = file_create(name, mode & 0777); 580 if (fd < 0) 581 error = fd; 582 else 583 error = read_name(inode, name); 584 585 __putname(name); 586 if (error) 587 goto out_put; 588 589 HOSTFS_I(inode)->fd = fd; 590 HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE; 591 d_instantiate(dentry, inode); 592 return 0; 593 594 out_put: 595 iput(inode); 596 out: 597 return error; 598} 599 600static struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry, 601 unsigned int flags) 602{ 603 struct inode *inode; 604 char *name; 605 int err; 606 607 inode = hostfs_iget(ino->i_sb); 608 if (IS_ERR(inode)) 609 goto out; 610 611 err = -ENOMEM; 612 name = dentry_name(dentry); 613 if (name) { 614 err = read_name(inode, name); 615 __putname(name); 616 } 617 if (err) { 618 iput(inode); 619 inode = (err == -ENOENT) ? NULL : ERR_PTR(err); 620 } 621 out: 622 return d_splice_alias(inode, dentry); 623} 624 625static int hostfs_link(struct dentry *to, struct inode *ino, 626 struct dentry *from) 627{ 628 char *from_name, *to_name; 629 int err; 630 631 if ((from_name = dentry_name(from)) == NULL) 632 return -ENOMEM; 633 to_name = dentry_name(to); 634 if (to_name == NULL) { 635 __putname(from_name); 636 return -ENOMEM; 637 } 638 err = link_file(to_name, from_name); 639 __putname(from_name); 640 __putname(to_name); 641 return err; 642} 643 644static int hostfs_unlink(struct inode *ino, struct dentry *dentry) 645{ 646 char *file; 647 int err; 648 649 if (append) 650 return -EPERM; 651 652 if ((file = dentry_name(dentry)) == NULL) 653 return -ENOMEM; 654 655 err = unlink_file(file); 656 __putname(file); 657 return err; 658} 659 660static int hostfs_symlink(struct user_namespace *mnt_userns, struct inode *ino, 661 struct dentry *dentry, const char *to) 662{ 663 char *file; 664 int err; 665 666 if ((file = dentry_name(dentry)) == NULL) 667 return -ENOMEM; 668 err = make_symlink(file, to); 669 __putname(file); 670 return err; 671} 672 673static int hostfs_mkdir(struct user_namespace *mnt_userns, struct inode *ino, 674 struct dentry *dentry, umode_t mode) 675{ 676 char *file; 677 int err; 678 679 if ((file = dentry_name(dentry)) == NULL) 680 return -ENOMEM; 681 err = do_mkdir(file, mode); 682 __putname(file); 683 return err; 684} 685 686static int hostfs_rmdir(struct inode *ino, struct dentry *dentry) 687{ 688 char *file; 689 int err; 690 691 if ((file = dentry_name(dentry)) == NULL) 692 return -ENOMEM; 693 err = hostfs_do_rmdir(file); 694 __putname(file); 695 return err; 696} 697 698static int hostfs_mknod(struct user_namespace *mnt_userns, struct inode *dir, 699 struct dentry *dentry, umode_t mode, dev_t dev) 700{ 701 struct inode *inode; 702 char *name; 703 int err; 704 705 inode = hostfs_iget(dir->i_sb); 706 if (IS_ERR(inode)) { 707 err = PTR_ERR(inode); 708 goto out; 709 } 710 711 err = -ENOMEM; 712 name = dentry_name(dentry); 713 if (name == NULL) 714 goto out_put; 715 716 err = do_mknod(name, mode, MAJOR(dev), MINOR(dev)); 717 if (err) 718 goto out_free; 719 720 err = read_name(inode, name); 721 __putname(name); 722 if (err) 723 goto out_put; 724 725 d_instantiate(dentry, inode); 726 return 0; 727 728 out_free: 729 __putname(name); 730 out_put: 731 iput(inode); 732 out: 733 return err; 734} 735 736static int hostfs_rename2(struct user_namespace *mnt_userns, 737 struct inode *old_dir, struct dentry *old_dentry, 738 struct inode *new_dir, struct dentry *new_dentry, 739 unsigned int flags) 740{ 741 char *old_name, *new_name; 742 int err; 743 744 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) 745 return -EINVAL; 746 747 old_name = dentry_name(old_dentry); 748 if (old_name == NULL) 749 return -ENOMEM; 750 new_name = dentry_name(new_dentry); 751 if (new_name == NULL) { 752 __putname(old_name); 753 return -ENOMEM; 754 } 755 if (!flags) 756 err = rename_file(old_name, new_name); 757 else 758 err = rename2_file(old_name, new_name, flags); 759 760 __putname(old_name); 761 __putname(new_name); 762 return err; 763} 764 765static int hostfs_permission(struct user_namespace *mnt_userns, 766 struct inode *ino, int desired) 767{ 768 char *name; 769 int r = 0, w = 0, x = 0, err; 770 771 if (desired & MAY_NOT_BLOCK) 772 return -ECHILD; 773 774 if (desired & MAY_READ) r = 1; 775 if (desired & MAY_WRITE) w = 1; 776 if (desired & MAY_EXEC) x = 1; 777 name = inode_name(ino); 778 if (name == NULL) 779 return -ENOMEM; 780 781 if (S_ISCHR(ino->i_mode) || S_ISBLK(ino->i_mode) || 782 S_ISFIFO(ino->i_mode) || S_ISSOCK(ino->i_mode)) 783 err = 0; 784 else 785 err = access_file(name, r, w, x); 786 __putname(name); 787 if (!err) 788 err = generic_permission(&init_user_ns, ino, desired); 789 return err; 790} 791 792static int hostfs_setattr(struct user_namespace *mnt_userns, 793 struct dentry *dentry, struct iattr *attr) 794{ 795 struct inode *inode = d_inode(dentry); 796 struct hostfs_iattr attrs; 797 char *name; 798 int err; 799 800 int fd = HOSTFS_I(inode)->fd; 801 802 err = setattr_prepare(&init_user_ns, dentry, attr); 803 if (err) 804 return err; 805 806 if (append) 807 attr->ia_valid &= ~ATTR_SIZE; 808 809 attrs.ia_valid = 0; 810 if (attr->ia_valid & ATTR_MODE) { 811 attrs.ia_valid |= HOSTFS_ATTR_MODE; 812 attrs.ia_mode = attr->ia_mode; 813 } 814 if (attr->ia_valid & ATTR_UID) { 815 attrs.ia_valid |= HOSTFS_ATTR_UID; 816 attrs.ia_uid = from_kuid(&init_user_ns, attr->ia_uid); 817 } 818 if (attr->ia_valid & ATTR_GID) { 819 attrs.ia_valid |= HOSTFS_ATTR_GID; 820 attrs.ia_gid = from_kgid(&init_user_ns, attr->ia_gid); 821 } 822 if (attr->ia_valid & ATTR_SIZE) { 823 attrs.ia_valid |= HOSTFS_ATTR_SIZE; 824 attrs.ia_size = attr->ia_size; 825 } 826 if (attr->ia_valid & ATTR_ATIME) { 827 attrs.ia_valid |= HOSTFS_ATTR_ATIME; 828 attrs.ia_atime = (struct hostfs_timespec) 829 { attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec }; 830 } 831 if (attr->ia_valid & ATTR_MTIME) { 832 attrs.ia_valid |= HOSTFS_ATTR_MTIME; 833 attrs.ia_mtime = (struct hostfs_timespec) 834 { attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec }; 835 } 836 if (attr->ia_valid & ATTR_CTIME) { 837 attrs.ia_valid |= HOSTFS_ATTR_CTIME; 838 attrs.ia_ctime = (struct hostfs_timespec) 839 { attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec }; 840 } 841 if (attr->ia_valid & ATTR_ATIME_SET) { 842 attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET; 843 } 844 if (attr->ia_valid & ATTR_MTIME_SET) { 845 attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET; 846 } 847 name = dentry_name(dentry); 848 if (name == NULL) 849 return -ENOMEM; 850 err = set_attr(name, &attrs, fd); 851 __putname(name); 852 if (err) 853 return err; 854 855 if ((attr->ia_valid & ATTR_SIZE) && 856 attr->ia_size != i_size_read(inode)) 857 truncate_setsize(inode, attr->ia_size); 858 859 setattr_copy(&init_user_ns, inode, attr); 860 mark_inode_dirty(inode); 861 return 0; 862} 863 864static const struct inode_operations hostfs_iops = { 865 .permission = hostfs_permission, 866 .setattr = hostfs_setattr, 867}; 868 869static const struct inode_operations hostfs_dir_iops = { 870 .create = hostfs_create, 871 .lookup = hostfs_lookup, 872 .link = hostfs_link, 873 .unlink = hostfs_unlink, 874 .symlink = hostfs_symlink, 875 .mkdir = hostfs_mkdir, 876 .rmdir = hostfs_rmdir, 877 .mknod = hostfs_mknod, 878 .rename = hostfs_rename2, 879 .permission = hostfs_permission, 880 .setattr = hostfs_setattr, 881}; 882 883static const char *hostfs_get_link(struct dentry *dentry, 884 struct inode *inode, 885 struct delayed_call *done) 886{ 887 char *link; 888 if (!dentry) 889 return ERR_PTR(-ECHILD); 890 link = kmalloc(PATH_MAX, GFP_KERNEL); 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 kfree(link); 902 return ERR_PTR(err); 903 } 904 } else { 905 return ERR_PTR(-ENOMEM); 906 } 907 908 set_delayed_call(done, kfree_link, link); 909 return link; 910} 911 912static const struct inode_operations hostfs_link_iops = { 913 .get_link = hostfs_get_link, 914}; 915 916static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) 917{ 918 struct inode *root_inode; 919 char *host_root_path, *req_root = d; 920 int err; 921 922 sb->s_blocksize = 1024; 923 sb->s_blocksize_bits = 10; 924 sb->s_magic = HOSTFS_SUPER_MAGIC; 925 sb->s_op = &hostfs_sbops; 926 sb->s_d_op = &simple_dentry_operations; 927 sb->s_maxbytes = MAX_LFS_FILESIZE; 928 err = super_setup_bdi(sb); 929 if (err) 930 goto out; 931 932 /* NULL is printed as '(null)' by printf(): avoid that. */ 933 if (req_root == NULL) 934 req_root = ""; 935 936 err = -ENOMEM; 937 sb->s_fs_info = host_root_path = 938 kasprintf(GFP_KERNEL, "%s/%s", root_ino, req_root); 939 if (host_root_path == NULL) 940 goto out; 941 942 root_inode = new_inode(sb); 943 if (!root_inode) 944 goto out; 945 946 err = read_name(root_inode, host_root_path); 947 if (err) 948 goto out_put; 949 950 if (S_ISLNK(root_inode->i_mode)) { 951 char *name = follow_link(host_root_path); 952 if (IS_ERR(name)) { 953 err = PTR_ERR(name); 954 goto out_put; 955 } 956 err = read_name(root_inode, name); 957 kfree(name); 958 if (err) 959 goto out_put; 960 } 961 962 err = -ENOMEM; 963 sb->s_root = d_make_root(root_inode); 964 if (sb->s_root == NULL) 965 goto out; 966 967 return 0; 968 969out_put: 970 iput(root_inode); 971out: 972 return err; 973} 974 975static struct dentry *hostfs_read_sb(struct file_system_type *type, 976 int flags, const char *dev_name, 977 void *data) 978{ 979 return mount_nodev(type, flags, data, hostfs_fill_sb_common); 980} 981 982static void hostfs_kill_sb(struct super_block *s) 983{ 984 kill_anon_super(s); 985 kfree(s->s_fs_info); 986} 987 988static struct file_system_type hostfs_type = { 989 .owner = THIS_MODULE, 990 .name = "hostfs", 991 .mount = hostfs_read_sb, 992 .kill_sb = hostfs_kill_sb, 993 .fs_flags = 0, 994}; 995MODULE_ALIAS_FS("hostfs"); 996 997static int __init init_hostfs(void) 998{ 999 hostfs_inode_cache = KMEM_CACHE(hostfs_inode_info, 0); 1000 if (!hostfs_inode_cache) 1001 return -ENOMEM; 1002 return register_filesystem(&hostfs_type); 1003} 1004 1005static void __exit exit_hostfs(void) 1006{ 1007 unregister_filesystem(&hostfs_type); 1008 kmem_cache_destroy(hostfs_inode_cache); 1009} 1010 1011module_init(init_hostfs) 1012module_exit(exit_hostfs) 1013MODULE_LICENSE("GPL");