diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2010-06-16 12:08:13 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2010-06-16 12:08:13 -0400 |
| commit | f1bbbb6912662b9f6070c5bfc4ca9eb1f06a9d5b (patch) | |
| tree | c2c130a74be25b0b2dff992e1a195e2728bdaadd /fs/ecryptfs | |
| parent | fd0961ff67727482bb20ca7e8ea97b83e9de2ddb (diff) | |
| parent | 7e27d6e778cd87b6f2415515d7127eba53fe5d02 (diff) | |
Merge branch 'master' into for-next
Diffstat (limited to 'fs/ecryptfs')
| -rw-r--r-- | fs/ecryptfs/ecryptfs_kernel.h | 5 | ||||
| -rw-r--r-- | fs/ecryptfs/file.c | 6 | ||||
| -rw-r--r-- | fs/ecryptfs/inode.c | 52 | ||||
| -rw-r--r-- | fs/ecryptfs/main.c | 166 | ||||
| -rw-r--r-- | fs/ecryptfs/mmap.c | 19 | ||||
| -rw-r--r-- | fs/ecryptfs/read_write.c | 13 | ||||
| -rw-r--r-- | fs/ecryptfs/super.c | 22 |
7 files changed, 106 insertions, 177 deletions
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index bfc2e0f78f00..0032a9f5a3a9 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
| @@ -731,15 +731,14 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, | |||
| 731 | int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | 731 | int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, |
| 732 | struct page *page_for_lower, | 732 | struct page *page_for_lower, |
| 733 | size_t offset_in_page, size_t size); | 733 | size_t offset_in_page, size_t size); |
| 734 | int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | 734 | int ecryptfs_write(struct inode *inode, char *data, loff_t offset, size_t size); |
| 735 | size_t size); | ||
| 736 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, | 735 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, |
| 737 | struct inode *ecryptfs_inode); | 736 | struct inode *ecryptfs_inode); |
| 738 | int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, | 737 | int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, |
| 739 | pgoff_t page_index, | 738 | pgoff_t page_index, |
| 740 | size_t offset_in_page, size_t size, | 739 | size_t offset_in_page, size_t size, |
| 741 | struct inode *ecryptfs_inode); | 740 | struct inode *ecryptfs_inode); |
| 742 | struct page *ecryptfs_get_locked_page(struct file *file, loff_t index); | 741 | struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index); |
| 743 | int ecryptfs_exorcise_daemon(struct ecryptfs_daemon *daemon); | 742 | int ecryptfs_exorcise_daemon(struct ecryptfs_daemon *daemon); |
| 744 | int ecryptfs_find_daemon_by_euid(struct ecryptfs_daemon **daemon, uid_t euid, | 743 | int ecryptfs_find_daemon_by_euid(struct ecryptfs_daemon **daemon, uid_t euid, |
| 745 | struct user_namespace *user_ns); | 744 | struct user_namespace *user_ns); |
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index e7440a6f5ebf..e8fcf4e2ed7d 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
| @@ -274,11 +274,9 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | static int | 276 | static int |
| 277 | ecryptfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 277 | ecryptfs_fsync(struct file *file, int datasync) |
| 278 | { | 278 | { |
| 279 | return vfs_fsync(ecryptfs_file_to_lower(file), | 279 | return vfs_fsync(ecryptfs_file_to_lower(file), datasync); |
| 280 | ecryptfs_dentry_to_lower(dentry), | ||
| 281 | datasync); | ||
| 282 | } | 280 | } |
| 283 | 281 | ||
| 284 | static int ecryptfs_fasync(int fd, struct file *file, int flag) | 282 | static int ecryptfs_fasync(int fd, struct file *file, int flag) |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index e2d4418affac..31ef5252f0fe 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -142,19 +142,10 @@ out: | |||
| 142 | static int grow_file(struct dentry *ecryptfs_dentry) | 142 | static int grow_file(struct dentry *ecryptfs_dentry) |
| 143 | { | 143 | { |
| 144 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; | 144 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; |
| 145 | struct file fake_file; | ||
| 146 | struct ecryptfs_file_info tmp_file_info; | ||
| 147 | char zero_virt[] = { 0x00 }; | 145 | char zero_virt[] = { 0x00 }; |
| 148 | int rc = 0; | 146 | int rc = 0; |
| 149 | 147 | ||
| 150 | memset(&fake_file, 0, sizeof(fake_file)); | 148 | rc = ecryptfs_write(ecryptfs_inode, zero_virt, 0, 1); |
| 151 | fake_file.f_path.dentry = ecryptfs_dentry; | ||
| 152 | memset(&tmp_file_info, 0, sizeof(tmp_file_info)); | ||
| 153 | ecryptfs_set_file_private(&fake_file, &tmp_file_info); | ||
| 154 | ecryptfs_set_file_lower( | ||
| 155 | &fake_file, | ||
| 156 | ecryptfs_inode_to_private(ecryptfs_inode)->lower_file); | ||
| 157 | rc = ecryptfs_write(&fake_file, zero_virt, 0, 1); | ||
| 158 | i_size_write(ecryptfs_inode, 0); | 149 | i_size_write(ecryptfs_inode, 0); |
| 159 | rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode); | 150 | rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode); |
| 160 | ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat.flags |= | 151 | ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat.flags |= |
| @@ -784,8 +775,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 784 | { | 775 | { |
| 785 | int rc = 0; | 776 | int rc = 0; |
| 786 | struct inode *inode = dentry->d_inode; | 777 | struct inode *inode = dentry->d_inode; |
| 787 | struct dentry *lower_dentry; | ||
| 788 | struct file fake_ecryptfs_file; | ||
| 789 | struct ecryptfs_crypt_stat *crypt_stat; | 778 | struct ecryptfs_crypt_stat *crypt_stat; |
| 790 | loff_t i_size = i_size_read(inode); | 779 | loff_t i_size = i_size_read(inode); |
| 791 | loff_t lower_size_before_truncate; | 780 | loff_t lower_size_before_truncate; |
| @@ -796,23 +785,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 796 | goto out; | 785 | goto out; |
| 797 | } | 786 | } |
| 798 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; | 787 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; |
| 799 | /* Set up a fake ecryptfs file, this is used to interface with | ||
| 800 | * the file in the underlying filesystem so that the | ||
| 801 | * truncation has an effect there as well. */ | ||
| 802 | memset(&fake_ecryptfs_file, 0, sizeof(fake_ecryptfs_file)); | ||
| 803 | fake_ecryptfs_file.f_path.dentry = dentry; | ||
| 804 | /* Released at out_free: label */ | ||
| 805 | ecryptfs_set_file_private(&fake_ecryptfs_file, | ||
| 806 | kmem_cache_alloc(ecryptfs_file_info_cache, | ||
| 807 | GFP_KERNEL)); | ||
| 808 | if (unlikely(!ecryptfs_file_to_private(&fake_ecryptfs_file))) { | ||
| 809 | rc = -ENOMEM; | ||
| 810 | goto out; | ||
| 811 | } | ||
| 812 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | ||
| 813 | ecryptfs_set_file_lower( | ||
| 814 | &fake_ecryptfs_file, | ||
| 815 | ecryptfs_inode_to_private(dentry->d_inode)->lower_file); | ||
| 816 | /* Switch on growing or shrinking file */ | 788 | /* Switch on growing or shrinking file */ |
| 817 | if (ia->ia_size > i_size) { | 789 | if (ia->ia_size > i_size) { |
| 818 | char zero[] = { 0x00 }; | 790 | char zero[] = { 0x00 }; |
| @@ -822,7 +794,7 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 822 | * this triggers code that will fill in 0's throughout | 794 | * this triggers code that will fill in 0's throughout |
| 823 | * the intermediate portion of the previous end of the | 795 | * the intermediate portion of the previous end of the |
| 824 | * file and the new and of the file */ | 796 | * file and the new and of the file */ |
| 825 | rc = ecryptfs_write(&fake_ecryptfs_file, zero, | 797 | rc = ecryptfs_write(inode, zero, |
| 826 | (ia->ia_size - 1), 1); | 798 | (ia->ia_size - 1), 1); |
| 827 | } else { /* ia->ia_size < i_size_read(inode) */ | 799 | } else { /* ia->ia_size < i_size_read(inode) */ |
| 828 | /* We're chopping off all the pages down to the page | 800 | /* We're chopping off all the pages down to the page |
| @@ -833,12 +805,12 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 833 | - (ia->ia_size & ~PAGE_CACHE_MASK)); | 805 | - (ia->ia_size & ~PAGE_CACHE_MASK)); |
| 834 | 806 | ||
| 835 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | 807 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { |
| 836 | rc = vmtruncate(inode, ia->ia_size); | 808 | rc = simple_setsize(inode, ia->ia_size); |
| 837 | if (rc) | 809 | if (rc) |
| 838 | goto out_free; | 810 | goto out; |
| 839 | lower_ia->ia_size = ia->ia_size; | 811 | lower_ia->ia_size = ia->ia_size; |
| 840 | lower_ia->ia_valid |= ATTR_SIZE; | 812 | lower_ia->ia_valid |= ATTR_SIZE; |
| 841 | goto out_free; | 813 | goto out; |
| 842 | } | 814 | } |
| 843 | if (num_zeros) { | 815 | if (num_zeros) { |
| 844 | char *zeros_virt; | 816 | char *zeros_virt; |
| @@ -846,25 +818,25 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 846 | zeros_virt = kzalloc(num_zeros, GFP_KERNEL); | 818 | zeros_virt = kzalloc(num_zeros, GFP_KERNEL); |
| 847 | if (!zeros_virt) { | 819 | if (!zeros_virt) { |
| 848 | rc = -ENOMEM; | 820 | rc = -ENOMEM; |
| 849 | goto out_free; | 821 | goto out; |
| 850 | } | 822 | } |
| 851 | rc = ecryptfs_write(&fake_ecryptfs_file, zeros_virt, | 823 | rc = ecryptfs_write(inode, zeros_virt, |
| 852 | ia->ia_size, num_zeros); | 824 | ia->ia_size, num_zeros); |
| 853 | kfree(zeros_virt); | 825 | kfree(zeros_virt); |
| 854 | if (rc) { | 826 | if (rc) { |
| 855 | printk(KERN_ERR "Error attempting to zero out " | 827 | printk(KERN_ERR "Error attempting to zero out " |
| 856 | "the remainder of the end page on " | 828 | "the remainder of the end page on " |
| 857 | "reducing truncate; rc = [%d]\n", rc); | 829 | "reducing truncate; rc = [%d]\n", rc); |
| 858 | goto out_free; | 830 | goto out; |
| 859 | } | 831 | } |
| 860 | } | 832 | } |
| 861 | vmtruncate(inode, ia->ia_size); | 833 | simple_setsize(inode, ia->ia_size); |
| 862 | rc = ecryptfs_write_inode_size_to_metadata(inode); | 834 | rc = ecryptfs_write_inode_size_to_metadata(inode); |
| 863 | if (rc) { | 835 | if (rc) { |
| 864 | printk(KERN_ERR "Problem with " | 836 | printk(KERN_ERR "Problem with " |
| 865 | "ecryptfs_write_inode_size_to_metadata; " | 837 | "ecryptfs_write_inode_size_to_metadata; " |
| 866 | "rc = [%d]\n", rc); | 838 | "rc = [%d]\n", rc); |
| 867 | goto out_free; | 839 | goto out; |
| 868 | } | 840 | } |
| 869 | /* We are reducing the size of the ecryptfs file, and need to | 841 | /* We are reducing the size of the ecryptfs file, and need to |
| 870 | * know if we need to reduce the size of the lower file. */ | 842 | * know if we need to reduce the size of the lower file. */ |
| @@ -878,10 +850,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 878 | } else | 850 | } else |
| 879 | lower_ia->ia_valid &= ~ATTR_SIZE; | 851 | lower_ia->ia_valid &= ~ATTR_SIZE; |
| 880 | } | 852 | } |
| 881 | out_free: | ||
| 882 | if (ecryptfs_file_to_private(&fake_ecryptfs_file)) | ||
| 883 | kmem_cache_free(ecryptfs_file_info_cache, | ||
| 884 | ecryptfs_file_to_private(&fake_ecryptfs_file)); | ||
| 885 | out: | 853 | out: |
| 886 | return rc; | 854 | return rc; |
| 887 | } | 855 | } |
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 760983d0f25e..cbd4e18adb20 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
| @@ -281,7 +281,7 @@ static void ecryptfs_init_mount_crypt_stat( | |||
| 281 | * | 281 | * |
| 282 | * Returns zero on success; non-zero on error | 282 | * Returns zero on success; non-zero on error |
| 283 | */ | 283 | */ |
| 284 | static int ecryptfs_parse_options(struct super_block *sb, char *options) | 284 | static int ecryptfs_parse_options(struct ecryptfs_sb_info *sbi, char *options) |
| 285 | { | 285 | { |
| 286 | char *p; | 286 | char *p; |
| 287 | int rc = 0; | 287 | int rc = 0; |
| @@ -293,7 +293,7 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options) | |||
| 293 | int fn_cipher_key_bytes; | 293 | int fn_cipher_key_bytes; |
| 294 | int fn_cipher_key_bytes_set = 0; | 294 | int fn_cipher_key_bytes_set = 0; |
| 295 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = | 295 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = |
| 296 | &ecryptfs_superblock_to_private(sb)->mount_crypt_stat; | 296 | &sbi->mount_crypt_stat; |
| 297 | substring_t args[MAX_OPT_ARGS]; | 297 | substring_t args[MAX_OPT_ARGS]; |
| 298 | int token; | 298 | int token; |
| 299 | char *sig_src; | 299 | char *sig_src; |
| @@ -483,68 +483,7 @@ out: | |||
| 483 | } | 483 | } |
| 484 | 484 | ||
| 485 | struct kmem_cache *ecryptfs_sb_info_cache; | 485 | struct kmem_cache *ecryptfs_sb_info_cache; |
| 486 | 486 | static struct file_system_type ecryptfs_fs_type; | |
| 487 | /** | ||
| 488 | * ecryptfs_fill_super | ||
| 489 | * @sb: The ecryptfs super block | ||
| 490 | * @raw_data: The options passed to mount | ||
| 491 | * @silent: Not used but required by function prototype | ||
| 492 | * | ||
| 493 | * Sets up what we can of the sb, rest is done in ecryptfs_read_super | ||
| 494 | * | ||
| 495 | * Returns zero on success; non-zero otherwise | ||
| 496 | */ | ||
| 497 | static int | ||
| 498 | ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent) | ||
| 499 | { | ||
| 500 | struct ecryptfs_sb_info *esi; | ||
| 501 | int rc = 0; | ||
| 502 | |||
| 503 | /* Released in ecryptfs_put_super() */ | ||
| 504 | ecryptfs_set_superblock_private(sb, | ||
| 505 | kmem_cache_zalloc(ecryptfs_sb_info_cache, | ||
| 506 | GFP_KERNEL)); | ||
| 507 | esi = ecryptfs_superblock_to_private(sb); | ||
| 508 | if (!esi) { | ||
| 509 | ecryptfs_printk(KERN_WARNING, "Out of memory\n"); | ||
| 510 | rc = -ENOMEM; | ||
| 511 | goto out; | ||
| 512 | } | ||
| 513 | |||
| 514 | rc = bdi_setup_and_register(&esi->bdi, "ecryptfs", BDI_CAP_MAP_COPY); | ||
| 515 | if (rc) | ||
| 516 | goto out; | ||
| 517 | |||
| 518 | sb->s_bdi = &esi->bdi; | ||
| 519 | sb->s_op = &ecryptfs_sops; | ||
| 520 | /* Released through deactivate_super(sb) from get_sb_nodev */ | ||
| 521 | sb->s_root = d_alloc(NULL, &(const struct qstr) { | ||
| 522 | .hash = 0,.name = "/",.len = 1}); | ||
| 523 | if (!sb->s_root) { | ||
| 524 | ecryptfs_printk(KERN_ERR, "d_alloc failed\n"); | ||
| 525 | rc = -ENOMEM; | ||
| 526 | goto out; | ||
| 527 | } | ||
| 528 | sb->s_root->d_op = &ecryptfs_dops; | ||
| 529 | sb->s_root->d_sb = sb; | ||
| 530 | sb->s_root->d_parent = sb->s_root; | ||
| 531 | /* Released in d_release when dput(sb->s_root) is called */ | ||
| 532 | /* through deactivate_super(sb) from get_sb_nodev() */ | ||
| 533 | ecryptfs_set_dentry_private(sb->s_root, | ||
| 534 | kmem_cache_zalloc(ecryptfs_dentry_info_cache, | ||
| 535 | GFP_KERNEL)); | ||
| 536 | if (!ecryptfs_dentry_to_private(sb->s_root)) { | ||
| 537 | ecryptfs_printk(KERN_ERR, | ||
| 538 | "dentry_info_cache alloc failed\n"); | ||
| 539 | rc = -ENOMEM; | ||
| 540 | goto out; | ||
| 541 | } | ||
| 542 | rc = 0; | ||
| 543 | out: | ||
| 544 | /* Should be able to rely on deactivate_super called from | ||
| 545 | * get_sb_nodev */ | ||
| 546 | return rc; | ||
| 547 | } | ||
| 548 | 487 | ||
| 549 | /** | 488 | /** |
| 550 | * ecryptfs_read_super | 489 | * ecryptfs_read_super |
| @@ -565,6 +504,13 @@ static int ecryptfs_read_super(struct super_block *sb, const char *dev_name) | |||
| 565 | ecryptfs_printk(KERN_WARNING, "path_lookup() failed\n"); | 504 | ecryptfs_printk(KERN_WARNING, "path_lookup() failed\n"); |
| 566 | goto out; | 505 | goto out; |
| 567 | } | 506 | } |
| 507 | if (path.dentry->d_sb->s_type == &ecryptfs_fs_type) { | ||
| 508 | rc = -EINVAL; | ||
| 509 | printk(KERN_ERR "Mount on filesystem of type " | ||
| 510 | "eCryptfs explicitly disallowed due to " | ||
| 511 | "known incompatibilities\n"); | ||
| 512 | goto out_free; | ||
| 513 | } | ||
| 568 | ecryptfs_set_superblock_lower(sb, path.dentry->d_sb); | 514 | ecryptfs_set_superblock_lower(sb, path.dentry->d_sb); |
| 569 | sb->s_maxbytes = path.dentry->d_sb->s_maxbytes; | 515 | sb->s_maxbytes = path.dentry->d_sb->s_maxbytes; |
| 570 | sb->s_blocksize = path.dentry->d_sb->s_blocksize; | 516 | sb->s_blocksize = path.dentry->d_sb->s_blocksize; |
| @@ -588,11 +534,8 @@ out: | |||
| 588 | * @dev_name: The path to mount over | 534 | * @dev_name: The path to mount over |
| 589 | * @raw_data: The options passed into the kernel | 535 | * @raw_data: The options passed into the kernel |
| 590 | * | 536 | * |
| 591 | * The whole ecryptfs_get_sb process is broken into 4 functions: | 537 | * The whole ecryptfs_get_sb process is broken into 3 functions: |
| 592 | * ecryptfs_parse_options(): handle options passed to ecryptfs, if any | 538 | * ecryptfs_parse_options(): handle options passed to ecryptfs, if any |
| 593 | * ecryptfs_fill_super(): used by get_sb_nodev, fills out the super_block | ||
| 594 | * with as much information as it can before needing | ||
| 595 | * the lower filesystem. | ||
| 596 | * ecryptfs_read_super(): this accesses the lower filesystem and uses | 539 | * ecryptfs_read_super(): this accesses the lower filesystem and uses |
| 597 | * ecryptfs_interpose to perform most of the linking | 540 | * ecryptfs_interpose to perform most of the linking |
| 598 | * ecryptfs_interpose(): links the lower filesystem into ecryptfs (inode.c) | 541 | * ecryptfs_interpose(): links the lower filesystem into ecryptfs (inode.c) |
| @@ -601,30 +544,78 @@ static int ecryptfs_get_sb(struct file_system_type *fs_type, int flags, | |||
| 601 | const char *dev_name, void *raw_data, | 544 | const char *dev_name, void *raw_data, |
| 602 | struct vfsmount *mnt) | 545 | struct vfsmount *mnt) |
| 603 | { | 546 | { |
| 547 | struct super_block *s; | ||
| 548 | struct ecryptfs_sb_info *sbi; | ||
| 549 | struct ecryptfs_dentry_info *root_info; | ||
| 550 | const char *err = "Getting sb failed"; | ||
| 604 | int rc; | 551 | int rc; |
| 605 | struct super_block *sb; | ||
| 606 | 552 | ||
| 607 | rc = get_sb_nodev(fs_type, flags, raw_data, ecryptfs_fill_super, mnt); | 553 | sbi = kmem_cache_zalloc(ecryptfs_sb_info_cache, GFP_KERNEL); |
| 608 | if (rc < 0) { | 554 | if (!sbi) { |
| 609 | printk(KERN_ERR "Getting sb failed; rc = [%d]\n", rc); | 555 | rc = -ENOMEM; |
| 610 | goto out; | 556 | goto out; |
| 611 | } | 557 | } |
| 612 | sb = mnt->mnt_sb; | 558 | |
| 613 | rc = ecryptfs_parse_options(sb, raw_data); | 559 | rc = ecryptfs_parse_options(sbi, raw_data); |
| 614 | if (rc) { | 560 | if (rc) { |
| 615 | printk(KERN_ERR "Error parsing options; rc = [%d]\n", rc); | 561 | err = "Error parsing options"; |
| 616 | goto out_abort; | 562 | goto out; |
| 563 | } | ||
| 564 | |||
| 565 | s = sget(fs_type, NULL, set_anon_super, NULL); | ||
| 566 | if (IS_ERR(s)) { | ||
| 567 | rc = PTR_ERR(s); | ||
| 568 | goto out; | ||
| 617 | } | 569 | } |
| 618 | rc = ecryptfs_read_super(sb, dev_name); | 570 | |
| 571 | s->s_flags = flags; | ||
| 572 | rc = bdi_setup_and_register(&sbi->bdi, "ecryptfs", BDI_CAP_MAP_COPY); | ||
| 619 | if (rc) { | 573 | if (rc) { |
| 620 | printk(KERN_ERR "Reading sb failed; rc = [%d]\n", rc); | 574 | deactivate_locked_super(s); |
| 621 | goto out_abort; | 575 | goto out; |
| 622 | } | 576 | } |
| 623 | goto out; | 577 | |
| 624 | out_abort: | 578 | ecryptfs_set_superblock_private(s, sbi); |
| 625 | dput(sb->s_root); /* aka mnt->mnt_root, as set by get_sb_nodev() */ | 579 | s->s_bdi = &sbi->bdi; |
| 626 | deactivate_locked_super(sb); | 580 | |
| 581 | /* ->kill_sb() will take care of sbi after that point */ | ||
| 582 | sbi = NULL; | ||
| 583 | s->s_op = &ecryptfs_sops; | ||
| 584 | |||
| 585 | rc = -ENOMEM; | ||
| 586 | s->s_root = d_alloc(NULL, &(const struct qstr) { | ||
| 587 | .hash = 0,.name = "/",.len = 1}); | ||
| 588 | if (!s->s_root) { | ||
| 589 | deactivate_locked_super(s); | ||
| 590 | goto out; | ||
| 591 | } | ||
| 592 | s->s_root->d_op = &ecryptfs_dops; | ||
| 593 | s->s_root->d_sb = s; | ||
| 594 | s->s_root->d_parent = s->s_root; | ||
| 595 | |||
| 596 | root_info = kmem_cache_zalloc(ecryptfs_dentry_info_cache, GFP_KERNEL); | ||
| 597 | if (!root_info) { | ||
| 598 | deactivate_locked_super(s); | ||
| 599 | goto out; | ||
| 600 | } | ||
| 601 | /* ->kill_sb() will take care of root_info */ | ||
| 602 | ecryptfs_set_dentry_private(s->s_root, root_info); | ||
| 603 | s->s_flags |= MS_ACTIVE; | ||
| 604 | rc = ecryptfs_read_super(s, dev_name); | ||
| 605 | if (rc) { | ||
| 606 | deactivate_locked_super(s); | ||
| 607 | err = "Reading sb failed"; | ||
| 608 | goto out; | ||
| 609 | } | ||
| 610 | simple_set_mnt(mnt, s); | ||
| 611 | return 0; | ||
| 612 | |||
| 627 | out: | 613 | out: |
| 614 | if (sbi) { | ||
| 615 | ecryptfs_destroy_mount_crypt_stat(&sbi->mount_crypt_stat); | ||
| 616 | kmem_cache_free(ecryptfs_sb_info_cache, sbi); | ||
| 617 | } | ||
| 618 | printk(KERN_ERR "%s; rc = [%d]\n", err, rc); | ||
| 628 | return rc; | 619 | return rc; |
| 629 | } | 620 | } |
| 630 | 621 | ||
| @@ -633,11 +624,16 @@ out: | |||
| 633 | * @sb: The ecryptfs super block | 624 | * @sb: The ecryptfs super block |
| 634 | * | 625 | * |
| 635 | * Used to bring the superblock down and free the private data. | 626 | * Used to bring the superblock down and free the private data. |
| 636 | * Private data is free'd in ecryptfs_put_super() | ||
| 637 | */ | 627 | */ |
| 638 | static void ecryptfs_kill_block_super(struct super_block *sb) | 628 | static void ecryptfs_kill_block_super(struct super_block *sb) |
| 639 | { | 629 | { |
| 640 | generic_shutdown_super(sb); | 630 | struct ecryptfs_sb_info *sb_info = ecryptfs_superblock_to_private(sb); |
| 631 | kill_anon_super(sb); | ||
| 632 | if (!sb_info) | ||
| 633 | return; | ||
| 634 | ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat); | ||
| 635 | bdi_destroy(&sb_info->bdi); | ||
| 636 | kmem_cache_free(ecryptfs_sb_info_cache, sb_info); | ||
| 641 | } | 637 | } |
| 642 | 638 | ||
| 643 | static struct file_system_type ecryptfs_fs_type = { | 639 | static struct file_system_type ecryptfs_fs_type = { |
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 2ee9a3a7b68c..b1d82756544b 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
| @@ -44,17 +44,9 @@ | |||
| 44 | * Returns locked and up-to-date page (if ok), with increased | 44 | * Returns locked and up-to-date page (if ok), with increased |
| 45 | * refcnt. | 45 | * refcnt. |
| 46 | */ | 46 | */ |
| 47 | struct page *ecryptfs_get_locked_page(struct file *file, loff_t index) | 47 | struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index) |
| 48 | { | 48 | { |
| 49 | struct dentry *dentry; | 49 | struct page *page = read_mapping_page(inode->i_mapping, index, NULL); |
| 50 | struct inode *inode; | ||
| 51 | struct address_space *mapping; | ||
| 52 | struct page *page; | ||
| 53 | |||
| 54 | dentry = file->f_path.dentry; | ||
| 55 | inode = dentry->d_inode; | ||
| 56 | mapping = inode->i_mapping; | ||
| 57 | page = read_mapping_page(mapping, index, (void *)file); | ||
| 58 | if (!IS_ERR(page)) | 50 | if (!IS_ERR(page)) |
| 59 | lock_page(page); | 51 | lock_page(page); |
| 60 | return page; | 52 | return page; |
| @@ -198,7 +190,7 @@ out: | |||
| 198 | static int ecryptfs_readpage(struct file *file, struct page *page) | 190 | static int ecryptfs_readpage(struct file *file, struct page *page) |
| 199 | { | 191 | { |
| 200 | struct ecryptfs_crypt_stat *crypt_stat = | 192 | struct ecryptfs_crypt_stat *crypt_stat = |
| 201 | &ecryptfs_inode_to_private(file->f_path.dentry->d_inode)->crypt_stat; | 193 | &ecryptfs_inode_to_private(page->mapping->host)->crypt_stat; |
| 202 | int rc = 0; | 194 | int rc = 0; |
| 203 | 195 | ||
| 204 | if (!crypt_stat | 196 | if (!crypt_stat |
| @@ -300,8 +292,7 @@ static int ecryptfs_write_begin(struct file *file, | |||
| 300 | 292 | ||
| 301 | if (!PageUptodate(page)) { | 293 | if (!PageUptodate(page)) { |
| 302 | struct ecryptfs_crypt_stat *crypt_stat = | 294 | struct ecryptfs_crypt_stat *crypt_stat = |
| 303 | &ecryptfs_inode_to_private( | 295 | &ecryptfs_inode_to_private(mapping->host)->crypt_stat; |
| 304 | file->f_path.dentry->d_inode)->crypt_stat; | ||
| 305 | 296 | ||
| 306 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED) | 297 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED) |
| 307 | || (crypt_stat->flags & ECRYPTFS_NEW_FILE)) { | 298 | || (crypt_stat->flags & ECRYPTFS_NEW_FILE)) { |
| @@ -487,7 +478,7 @@ static int ecryptfs_write_end(struct file *file, | |||
| 487 | unsigned to = from + copied; | 478 | unsigned to = from + copied; |
| 488 | struct inode *ecryptfs_inode = mapping->host; | 479 | struct inode *ecryptfs_inode = mapping->host; |
| 489 | struct ecryptfs_crypt_stat *crypt_stat = | 480 | struct ecryptfs_crypt_stat *crypt_stat = |
| 490 | &ecryptfs_inode_to_private(file->f_path.dentry->d_inode)->crypt_stat; | 481 | &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat; |
| 491 | int rc; | 482 | int rc; |
| 492 | 483 | ||
| 493 | if (crypt_stat->flags & ECRYPTFS_NEW_FILE) { | 484 | if (crypt_stat->flags & ECRYPTFS_NEW_FILE) { |
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 0cc4fafd6552..db184ef15d3d 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
| @@ -93,7 +93,7 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | |||
| 93 | 93 | ||
| 94 | /** | 94 | /** |
| 95 | * ecryptfs_write | 95 | * ecryptfs_write |
| 96 | * @ecryptfs_file: The eCryptfs file into which to write | 96 | * @ecryptfs_inode: The eCryptfs file into which to write |
| 97 | * @data: Virtual address where data to write is located | 97 | * @data: Virtual address where data to write is located |
| 98 | * @offset: Offset in the eCryptfs file at which to begin writing the | 98 | * @offset: Offset in the eCryptfs file at which to begin writing the |
| 99 | * data from @data | 99 | * data from @data |
| @@ -109,12 +109,11 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | |||
| 109 | * | 109 | * |
| 110 | * Returns zero on success; non-zero otherwise | 110 | * Returns zero on success; non-zero otherwise |
| 111 | */ | 111 | */ |
| 112 | int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | 112 | int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, |
| 113 | size_t size) | 113 | size_t size) |
| 114 | { | 114 | { |
| 115 | struct page *ecryptfs_page; | 115 | struct page *ecryptfs_page; |
| 116 | struct ecryptfs_crypt_stat *crypt_stat; | 116 | struct ecryptfs_crypt_stat *crypt_stat; |
| 117 | struct inode *ecryptfs_inode = ecryptfs_file->f_dentry->d_inode; | ||
| 118 | char *ecryptfs_page_virt; | 117 | char *ecryptfs_page_virt; |
| 119 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); | 118 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); |
| 120 | loff_t data_offset = 0; | 119 | loff_t data_offset = 0; |
| @@ -145,7 +144,7 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | |||
| 145 | if (num_bytes > total_remaining_zeros) | 144 | if (num_bytes > total_remaining_zeros) |
| 146 | num_bytes = total_remaining_zeros; | 145 | num_bytes = total_remaining_zeros; |
| 147 | } | 146 | } |
| 148 | ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_file, | 147 | ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_inode, |
| 149 | ecryptfs_page_idx); | 148 | ecryptfs_page_idx); |
| 150 | if (IS_ERR(ecryptfs_page)) { | 149 | if (IS_ERR(ecryptfs_page)) { |
| 151 | rc = PTR_ERR(ecryptfs_page); | 150 | rc = PTR_ERR(ecryptfs_page); |
| @@ -302,10 +301,10 @@ int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, | |||
| 302 | int ecryptfs_read(char *data, loff_t offset, size_t size, | 301 | int ecryptfs_read(char *data, loff_t offset, size_t size, |
| 303 | struct file *ecryptfs_file) | 302 | struct file *ecryptfs_file) |
| 304 | { | 303 | { |
| 304 | struct inode *ecryptfs_inode = ecryptfs_file->f_dentry->d_inode; | ||
| 305 | struct page *ecryptfs_page; | 305 | struct page *ecryptfs_page; |
| 306 | char *ecryptfs_page_virt; | 306 | char *ecryptfs_page_virt; |
| 307 | loff_t ecryptfs_file_size = | 307 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); |
| 308 | i_size_read(ecryptfs_file->f_dentry->d_inode); | ||
| 309 | loff_t data_offset = 0; | 308 | loff_t data_offset = 0; |
| 310 | loff_t pos; | 309 | loff_t pos; |
| 311 | int rc = 0; | 310 | int rc = 0; |
| @@ -327,7 +326,7 @@ int ecryptfs_read(char *data, loff_t offset, size_t size, | |||
| 327 | 326 | ||
| 328 | if (num_bytes > total_remaining_bytes) | 327 | if (num_bytes > total_remaining_bytes) |
| 329 | num_bytes = total_remaining_bytes; | 328 | num_bytes = total_remaining_bytes; |
| 330 | ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_file, | 329 | ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_inode, |
| 331 | ecryptfs_page_idx); | 330 | ecryptfs_page_idx); |
| 332 | if (IS_ERR(ecryptfs_page)) { | 331 | if (IS_ERR(ecryptfs_page)) { |
| 333 | rc = PTR_ERR(ecryptfs_page); | 332 | rc = PTR_ERR(ecryptfs_page); |
diff --git a/fs/ecryptfs/super.c b/fs/ecryptfs/super.c index 0c0ae491d231..0435886e4a9f 100644 --- a/fs/ecryptfs/super.c +++ b/fs/ecryptfs/super.c | |||
| @@ -109,27 +109,6 @@ void ecryptfs_init_inode(struct inode *inode, struct inode *lower_inode) | |||
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | /** | 111 | /** |
| 112 | * ecryptfs_put_super | ||
| 113 | * @sb: Pointer to the ecryptfs super block | ||
| 114 | * | ||
| 115 | * Final actions when unmounting a file system. | ||
| 116 | * This will handle deallocation and release of our private data. | ||
| 117 | */ | ||
| 118 | static void ecryptfs_put_super(struct super_block *sb) | ||
| 119 | { | ||
| 120 | struct ecryptfs_sb_info *sb_info = ecryptfs_superblock_to_private(sb); | ||
| 121 | |||
| 122 | lock_kernel(); | ||
| 123 | |||
| 124 | ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat); | ||
| 125 | bdi_destroy(&sb_info->bdi); | ||
| 126 | kmem_cache_free(ecryptfs_sb_info_cache, sb_info); | ||
| 127 | ecryptfs_set_superblock_private(sb, NULL); | ||
| 128 | |||
| 129 | unlock_kernel(); | ||
| 130 | } | ||
| 131 | |||
| 132 | /** | ||
| 133 | * ecryptfs_statfs | 112 | * ecryptfs_statfs |
| 134 | * @sb: The ecryptfs super block | 113 | * @sb: The ecryptfs super block |
| 135 | * @buf: The struct kstatfs to fill in with stats | 114 | * @buf: The struct kstatfs to fill in with stats |
| @@ -203,7 +182,6 @@ const struct super_operations ecryptfs_sops = { | |||
| 203 | .alloc_inode = ecryptfs_alloc_inode, | 182 | .alloc_inode = ecryptfs_alloc_inode, |
| 204 | .destroy_inode = ecryptfs_destroy_inode, | 183 | .destroy_inode = ecryptfs_destroy_inode, |
| 205 | .drop_inode = generic_delete_inode, | 184 | .drop_inode = generic_delete_inode, |
| 206 | .put_super = ecryptfs_put_super, | ||
| 207 | .statfs = ecryptfs_statfs, | 185 | .statfs = ecryptfs_statfs, |
| 208 | .remount_fs = NULL, | 186 | .remount_fs = NULL, |
| 209 | .clear_inode = ecryptfs_clear_inode, | 187 | .clear_inode = ecryptfs_clear_inode, |
