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