diff options
| -rw-r--r-- | fs/hostfs/hostfs_kern.c | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index b29a2b878f46..3841fb1ca5a2 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c | |||
| @@ -89,7 +89,7 @@ __uml_setup("hostfs=", hostfs_args, | |||
| 89 | ); | 89 | ); |
| 90 | #endif | 90 | #endif |
| 91 | 91 | ||
| 92 | static char *dentry_name(struct dentry *dentry, int extra) | 92 | static char *dentry_name(struct dentry *dentry) |
| 93 | { | 93 | { |
| 94 | struct dentry *parent; | 94 | struct dentry *parent; |
| 95 | char *root, *name; | 95 | char *root, *name; |
| @@ -104,7 +104,7 @@ static char *dentry_name(struct dentry *dentry, int extra) | |||
| 104 | 104 | ||
| 105 | root = parent->d_sb->s_fs_info; | 105 | root = parent->d_sb->s_fs_info; |
| 106 | len += strlen(root); | 106 | len += strlen(root); |
| 107 | name = kmalloc(len + extra + 1, GFP_KERNEL); | 107 | name = kmalloc(len + 1, GFP_KERNEL); |
| 108 | if (name == NULL) | 108 | if (name == NULL) |
| 109 | return NULL; | 109 | return NULL; |
| 110 | 110 | ||
| @@ -121,12 +121,12 @@ static char *dentry_name(struct dentry *dentry, int extra) | |||
| 121 | return name; | 121 | return name; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static char *inode_name(struct inode *ino, int extra) | 124 | static char *inode_name(struct inode *ino) |
| 125 | { | 125 | { |
| 126 | struct dentry *dentry; | 126 | struct dentry *dentry; |
| 127 | 127 | ||
| 128 | dentry = list_entry(ino->i_dentry.next, struct dentry, d_alias); | 128 | dentry = list_entry(ino->i_dentry.next, struct dentry, d_alias); |
| 129 | return dentry_name(dentry, extra); | 129 | return dentry_name(dentry); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | static char *follow_link(char *link) | 132 | static char *follow_link(char *link) |
| @@ -267,7 +267,7 @@ int hostfs_readdir(struct file *file, void *ent, filldir_t filldir) | |||
| 267 | unsigned long long next, ino; | 267 | unsigned long long next, ino; |
| 268 | int error, len; | 268 | int error, len; |
| 269 | 269 | ||
| 270 | name = dentry_name(file->f_path.dentry, 0); | 270 | name = dentry_name(file->f_path.dentry); |
| 271 | if (name == NULL) | 271 | if (name == NULL) |
| 272 | return -ENOMEM; | 272 | return -ENOMEM; |
| 273 | dir = open_dir(name, &error); | 273 | dir = open_dir(name, &error); |
| @@ -312,7 +312,7 @@ int hostfs_file_open(struct inode *ino, struct file *file) | |||
| 312 | if (w) | 312 | if (w) |
| 313 | r = 1; | 313 | r = 1; |
| 314 | 314 | ||
| 315 | name = dentry_name(file->f_path.dentry, 0); | 315 | name = dentry_name(file->f_path.dentry); |
| 316 | if (name == NULL) | 316 | if (name == NULL) |
| 317 | return -ENOMEM; | 317 | return -ENOMEM; |
| 318 | 318 | ||
| @@ -519,7 +519,7 @@ int hostfs_create(struct inode *dir, struct dentry *dentry, int mode, | |||
| 519 | } | 519 | } |
| 520 | 520 | ||
| 521 | error = -ENOMEM; | 521 | error = -ENOMEM; |
| 522 | name = dentry_name(dentry, 0); | 522 | name = dentry_name(dentry); |
| 523 | if (name == NULL) | 523 | if (name == NULL) |
| 524 | goto out_put; | 524 | goto out_put; |
| 525 | 525 | ||
| @@ -561,7 +561,7 @@ struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry, | |||
| 561 | } | 561 | } |
| 562 | 562 | ||
| 563 | err = -ENOMEM; | 563 | err = -ENOMEM; |
| 564 | name = dentry_name(dentry, 0); | 564 | name = dentry_name(dentry); |
| 565 | if (name == NULL) | 565 | if (name == NULL) |
| 566 | goto out_put; | 566 | goto out_put; |
| 567 | 567 | ||
| @@ -585,29 +585,14 @@ struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry, | |||
| 585 | return ERR_PTR(err); | 585 | return ERR_PTR(err); |
| 586 | } | 586 | } |
| 587 | 587 | ||
| 588 | static char *inode_dentry_name(struct inode *ino, struct dentry *dentry) | ||
| 589 | { | ||
| 590 | char *file; | ||
| 591 | int len; | ||
| 592 | |||
| 593 | file = inode_name(ino, dentry->d_name.len + 1); | ||
| 594 | if (file == NULL) | ||
| 595 | return NULL; | ||
| 596 | strcat(file, "/"); | ||
| 597 | len = strlen(file); | ||
| 598 | strncat(file, dentry->d_name.name, dentry->d_name.len); | ||
| 599 | file[len + dentry->d_name.len] = '\0'; | ||
| 600 | return file; | ||
| 601 | } | ||
| 602 | |||
| 603 | int hostfs_link(struct dentry *to, struct inode *ino, struct dentry *from) | 588 | int hostfs_link(struct dentry *to, struct inode *ino, struct dentry *from) |
| 604 | { | 589 | { |
| 605 | char *from_name, *to_name; | 590 | char *from_name, *to_name; |
| 606 | int err; | 591 | int err; |
| 607 | 592 | ||
| 608 | if ((from_name = inode_dentry_name(ino, from)) == NULL) | 593 | if ((from_name = dentry_name(from)) == NULL) |
| 609 | return -ENOMEM; | 594 | return -ENOMEM; |
| 610 | to_name = dentry_name(to, 0); | 595 | to_name = dentry_name(to); |
| 611 | if (to_name == NULL) { | 596 | if (to_name == NULL) { |
| 612 | kfree(from_name); | 597 | kfree(from_name); |
| 613 | return -ENOMEM; | 598 | return -ENOMEM; |
| @@ -623,7 +608,7 @@ int hostfs_unlink(struct inode *ino, struct dentry *dentry) | |||
| 623 | char *file; | 608 | char *file; |
| 624 | int err; | 609 | int err; |
| 625 | 610 | ||
| 626 | if ((file = inode_dentry_name(ino, dentry)) == NULL) | 611 | if ((file = dentry_name(dentry)) == NULL) |
| 627 | return -ENOMEM; | 612 | return -ENOMEM; |
| 628 | if (append) | 613 | if (append) |
| 629 | return -EPERM; | 614 | return -EPERM; |
| @@ -638,7 +623,7 @@ int hostfs_symlink(struct inode *ino, struct dentry *dentry, const char *to) | |||
| 638 | char *file; | 623 | char *file; |
| 639 | int err; | 624 | int err; |
| 640 | 625 | ||
| 641 | if ((file = inode_dentry_name(ino, dentry)) == NULL) | 626 | if ((file = dentry_name(dentry)) == NULL) |
| 642 | return -ENOMEM; | 627 | return -ENOMEM; |
| 643 | err = make_symlink(file, to); | 628 | err = make_symlink(file, to); |
| 644 | kfree(file); | 629 | kfree(file); |
| @@ -650,7 +635,7 @@ int hostfs_mkdir(struct inode *ino, struct dentry *dentry, int mode) | |||
| 650 | char *file; | 635 | char *file; |
| 651 | int err; | 636 | int err; |
| 652 | 637 | ||
| 653 | if ((file = inode_dentry_name(ino, dentry)) == NULL) | 638 | if ((file = dentry_name(dentry)) == NULL) |
| 654 | return -ENOMEM; | 639 | return -ENOMEM; |
| 655 | err = do_mkdir(file, mode); | 640 | err = do_mkdir(file, mode); |
| 656 | kfree(file); | 641 | kfree(file); |
| @@ -662,7 +647,7 @@ int hostfs_rmdir(struct inode *ino, struct dentry *dentry) | |||
| 662 | char *file; | 647 | char *file; |
| 663 | int err; | 648 | int err; |
| 664 | 649 | ||
| 665 | if ((file = inode_dentry_name(ino, dentry)) == NULL) | 650 | if ((file = dentry_name(dentry)) == NULL) |
| 666 | return -ENOMEM; | 651 | return -ENOMEM; |
| 667 | err = do_rmdir(file); | 652 | err = do_rmdir(file); |
| 668 | kfree(file); | 653 | kfree(file); |
| @@ -682,7 +667,7 @@ int hostfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) | |||
| 682 | } | 667 | } |
| 683 | 668 | ||
| 684 | err = -ENOMEM; | 669 | err = -ENOMEM; |
| 685 | name = dentry_name(dentry, 0); | 670 | name = dentry_name(dentry); |
| 686 | if (name == NULL) | 671 | if (name == NULL) |
| 687 | goto out_put; | 672 | goto out_put; |
| 688 | 673 | ||
| @@ -715,9 +700,9 @@ int hostfs_rename(struct inode *from_ino, struct dentry *from, | |||
| 715 | char *from_name, *to_name; | 700 | char *from_name, *to_name; |
| 716 | int err; | 701 | int err; |
| 717 | 702 | ||
| 718 | if ((from_name = inode_dentry_name(from_ino, from)) == NULL) | 703 | if ((from_name = dentry_name(from)) == NULL) |
| 719 | return -ENOMEM; | 704 | return -ENOMEM; |
| 720 | if ((to_name = inode_dentry_name(to_ino, to)) == NULL) { | 705 | if ((to_name = dentry_name(to)) == NULL) { |
| 721 | kfree(from_name); | 706 | kfree(from_name); |
| 722 | return -ENOMEM; | 707 | return -ENOMEM; |
| 723 | } | 708 | } |
| @@ -735,7 +720,7 @@ int hostfs_permission(struct inode *ino, int desired) | |||
| 735 | if (desired & MAY_READ) r = 1; | 720 | if (desired & MAY_READ) r = 1; |
| 736 | if (desired & MAY_WRITE) w = 1; | 721 | if (desired & MAY_WRITE) w = 1; |
| 737 | if (desired & MAY_EXEC) x = 1; | 722 | if (desired & MAY_EXEC) x = 1; |
| 738 | name = inode_name(ino, 0); | 723 | name = inode_name(ino); |
| 739 | if (name == NULL) | 724 | if (name == NULL) |
| 740 | return -ENOMEM; | 725 | return -ENOMEM; |
| 741 | 726 | ||
| @@ -801,7 +786,7 @@ int hostfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 801 | if (attr->ia_valid & ATTR_MTIME_SET) { | 786 | if (attr->ia_valid & ATTR_MTIME_SET) { |
| 802 | attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET; | 787 | attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET; |
| 803 | } | 788 | } |
| 804 | name = dentry_name(dentry, 0); | 789 | name = dentry_name(dentry); |
| 805 | if (name == NULL) | 790 | if (name == NULL) |
| 806 | return -ENOMEM; | 791 | return -ENOMEM; |
| 807 | err = set_attr(name, &attrs, fd); | 792 | err = set_attr(name, &attrs, fd); |
| @@ -856,7 +841,7 @@ int hostfs_link_readpage(struct file *file, struct page *page) | |||
| 856 | int err; | 841 | int err; |
| 857 | 842 | ||
| 858 | buffer = kmap(page); | 843 | buffer = kmap(page); |
| 859 | name = inode_name(page->mapping->host, 0); | 844 | name = inode_name(page->mapping->host); |
| 860 | if (name == NULL) | 845 | if (name == NULL) |
| 861 | return -ENOMEM; | 846 | return -ENOMEM; |
| 862 | err = hostfs_do_readlink(name, buffer, PAGE_CACHE_SIZE); | 847 | err = hostfs_do_readlink(name, buffer, PAGE_CACHE_SIZE); |
