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