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