Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.30-rc2 1055 lines 23 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/seq_file.h> 15#include <linux/mount.h> 16#include "hostfs.h" 17#include "init.h" 18#include "kern.h" 19 20struct hostfs_inode_info { 21 char *host_filename; 22 int fd; 23 fmode_t mode; 24 struct inode vfs_inode; 25}; 26 27static 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 34static int hostfs_d_delete(struct dentry *dentry) 35{ 36 return 1; 37} 38 39static 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 */ 44static char *root_ino = ""; 45static int append = 0; 46 47#define HOSTFS_SUPER_MAGIC 0x00c0ffee 48 49static const struct inode_operations hostfs_iops; 50static const struct inode_operations hostfs_dir_iops; 51static const struct address_space_operations hostfs_link_aops; 52 53#ifndef MODULE 54static 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 92static 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 124static 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 132static 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 159static 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 207static 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 238static 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 257int 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 286static 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 301static 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 311static 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 327static 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 339static 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 348int 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 373int 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 413int hostfs_fsync(struct file *file, struct dentry *dentry, int datasync) 414{ 415 return fsync_file(HOSTFS_I(dentry->d_inode)->fd, datasync); 416} 417 418static 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 431static const struct file_operations hostfs_dir_fops = { 432 .llseek = generic_file_llseek, 433 .readdir = hostfs_readdir, 434 .read = generic_read_dir, 435}; 436 437int 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 473int 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 498int 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 510int 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 538static 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 546static 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 596int 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 641struct 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 682static 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 697int 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 715int 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 730int 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 742int 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 754int 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 766int 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 808int 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 826int 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 849int 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 910static 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 923static 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 937int 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 961static const struct address_space_operations hostfs_link_aops = { 962 .readpage = hostfs_link_readpage, 963}; 964 965static 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 976 /* NULL is printed as <NULL> by sprintf: avoid that. */ 977 if (req_root == NULL) 978 req_root = ""; 979 980 err = -ENOMEM; 981 host_root_path = kmalloc(strlen(root_ino) + 1 982 + strlen(req_root) + 1, GFP_KERNEL); 983 if (host_root_path == NULL) 984 goto out; 985 986 sprintf(host_root_path, "%s/%s", root_ino, req_root); 987 988 root_inode = hostfs_iget(sb); 989 if (IS_ERR(root_inode)) { 990 err = PTR_ERR(root_inode); 991 goto out_free; 992 } 993 994 err = init_inode(root_inode, NULL); 995 if (err) 996 goto out_put; 997 998 HOSTFS_I(root_inode)->host_filename = host_root_path; 999 /* 1000 * Avoid that in the error path, iput(root_inode) frees again 1001 * host_root_path through hostfs_destroy_inode! 1002 */ 1003 host_root_path = NULL; 1004 1005 err = -ENOMEM; 1006 sb->s_root = d_alloc_root(root_inode); 1007 if (sb->s_root == NULL) 1008 goto out_put; 1009 1010 err = hostfs_read_inode(root_inode); 1011 if (err) { 1012 /* No iput in this case because the dput does that for us */ 1013 dput(sb->s_root); 1014 sb->s_root = NULL; 1015 goto out; 1016 } 1017 1018 return 0; 1019 1020out_put: 1021 iput(root_inode); 1022out_free: 1023 kfree(host_root_path); 1024out: 1025 return err; 1026} 1027 1028static int hostfs_read_sb(struct file_system_type *type, 1029 int flags, const char *dev_name, 1030 void *data, struct vfsmount *mnt) 1031{ 1032 return get_sb_nodev(type, flags, data, hostfs_fill_sb_common, mnt); 1033} 1034 1035static struct file_system_type hostfs_type = { 1036 .owner = THIS_MODULE, 1037 .name = "hostfs", 1038 .get_sb = hostfs_read_sb, 1039 .kill_sb = kill_anon_super, 1040 .fs_flags = 0, 1041}; 1042 1043static int __init init_hostfs(void) 1044{ 1045 return register_filesystem(&hostfs_type); 1046} 1047 1048static void __exit exit_hostfs(void) 1049{ 1050 unregister_filesystem(&hostfs_type); 1051} 1052 1053module_init(init_hostfs) 1054module_exit(exit_hostfs) 1055MODULE_LICENSE("GPL");