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