diff options
Diffstat (limited to 'fs/ext4/namei.c')
| -rw-r--r-- | fs/ext4/namei.c | 647 |
1 files changed, 534 insertions, 113 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 28fe71a2904c..ef22cd951c0c 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -26,7 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
| 28 | #include <linux/pagemap.h> | 28 | #include <linux/pagemap.h> |
| 29 | #include <linux/jbd2.h> | ||
| 30 | #include <linux/time.h> | 29 | #include <linux/time.h> |
| 31 | #include <linux/fcntl.h> | 30 | #include <linux/fcntl.h> |
| 32 | #include <linux/stat.h> | 31 | #include <linux/stat.h> |
| @@ -254,8 +253,9 @@ static struct dx_frame *dx_probe(const struct qstr *d_name, | |||
| 254 | struct dx_hash_info *hinfo, | 253 | struct dx_hash_info *hinfo, |
| 255 | struct dx_frame *frame); | 254 | struct dx_frame *frame); |
| 256 | static void dx_release(struct dx_frame *frames); | 255 | static void dx_release(struct dx_frame *frames); |
| 257 | static int dx_make_map(struct ext4_dir_entry_2 *de, unsigned blocksize, | 256 | static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de, |
| 258 | struct dx_hash_info *hinfo, struct dx_map_entry map[]); | 257 | unsigned blocksize, struct dx_hash_info *hinfo, |
| 258 | struct dx_map_entry map[]); | ||
| 259 | static void dx_sort_map(struct dx_map_entry *map, unsigned count); | 259 | static void dx_sort_map(struct dx_map_entry *map, unsigned count); |
| 260 | static struct ext4_dir_entry_2 *dx_move_dirents(char *from, char *to, | 260 | static struct ext4_dir_entry_2 *dx_move_dirents(char *from, char *to, |
| 261 | struct dx_map_entry *offsets, int count, unsigned blocksize); | 261 | struct dx_map_entry *offsets, int count, unsigned blocksize); |
| @@ -586,8 +586,10 @@ struct stats | |||
| 586 | unsigned bcount; | 586 | unsigned bcount; |
| 587 | }; | 587 | }; |
| 588 | 588 | ||
| 589 | static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext4_dir_entry_2 *de, | 589 | static struct stats dx_show_leaf(struct inode *dir, |
| 590 | int size, int show_names) | 590 | struct dx_hash_info *hinfo, |
| 591 | struct ext4_dir_entry_2 *de, | ||
| 592 | int size, int show_names) | ||
| 591 | { | 593 | { |
| 592 | unsigned names = 0, space = 0; | 594 | unsigned names = 0, space = 0; |
| 593 | char *base = (char *) de; | 595 | char *base = (char *) de; |
| @@ -600,12 +602,80 @@ static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext4_dir_ent | |||
| 600 | { | 602 | { |
| 601 | if (show_names) | 603 | if (show_names) |
| 602 | { | 604 | { |
| 605 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 606 | int len; | ||
| 607 | char *name; | ||
| 608 | struct ext4_str fname_crypto_str | ||
| 609 | = {.name = NULL, .len = 0}; | ||
| 610 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 611 | int res; | ||
| 612 | |||
| 613 | name = de->name; | ||
| 614 | len = de->name_len; | ||
| 615 | ctx = ext4_get_fname_crypto_ctx(dir, | ||
| 616 | EXT4_NAME_LEN); | ||
| 617 | if (IS_ERR(ctx)) { | ||
| 618 | printk(KERN_WARNING "Error acquiring" | ||
| 619 | " crypto ctxt--skipping crypto\n"); | ||
| 620 | ctx = NULL; | ||
| 621 | } | ||
| 622 | if (ctx == NULL) { | ||
| 623 | /* Directory is not encrypted */ | ||
| 624 | ext4fs_dirhash(de->name, | ||
| 625 | de->name_len, &h); | ||
| 626 | printk("%*.s:(U)%x.%u ", len, | ||
| 627 | name, h.hash, | ||
| 628 | (unsigned) ((char *) de | ||
| 629 | - base)); | ||
| 630 | } else { | ||
| 631 | /* Directory is encrypted */ | ||
| 632 | res = ext4_fname_crypto_alloc_buffer( | ||
| 633 | ctx, de->name_len, | ||
| 634 | &fname_crypto_str); | ||
| 635 | if (res < 0) { | ||
| 636 | printk(KERN_WARNING "Error " | ||
| 637 | "allocating crypto " | ||
| 638 | "buffer--skipping " | ||
| 639 | "crypto\n"); | ||
| 640 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 641 | ctx = NULL; | ||
| 642 | } | ||
| 643 | res = ext4_fname_disk_to_usr(ctx, de, | ||
| 644 | &fname_crypto_str); | ||
| 645 | if (res < 0) { | ||
| 646 | printk(KERN_WARNING "Error " | ||
| 647 | "converting filename " | ||
| 648 | "from disk to usr" | ||
| 649 | "\n"); | ||
| 650 | name = "??"; | ||
| 651 | len = 2; | ||
| 652 | } else { | ||
| 653 | name = fname_crypto_str.name; | ||
| 654 | len = fname_crypto_str.len; | ||
| 655 | } | ||
| 656 | res = ext4_fname_disk_to_hash(ctx, de, | ||
| 657 | &h); | ||
| 658 | if (res < 0) { | ||
| 659 | printk(KERN_WARNING "Error " | ||
| 660 | "converting filename " | ||
| 661 | "from disk to htree" | ||
| 662 | "\n"); | ||
| 663 | h.hash = 0xDEADBEEF; | ||
| 664 | } | ||
| 665 | printk("%*.s:(E)%x.%u ", len, name, | ||
| 666 | h.hash, (unsigned) ((char *) de | ||
| 667 | - base)); | ||
| 668 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 669 | ext4_fname_crypto_free_buffer( | ||
| 670 | &fname_crypto_str); | ||
| 671 | } | ||
| 672 | #else | ||
| 603 | int len = de->name_len; | 673 | int len = de->name_len; |
| 604 | char *name = de->name; | 674 | char *name = de->name; |
| 605 | while (len--) printk("%c", *name++); | ||
| 606 | ext4fs_dirhash(de->name, de->name_len, &h); | 675 | ext4fs_dirhash(de->name, de->name_len, &h); |
| 607 | printk(":%x.%u ", h.hash, | 676 | printk("%*.s:%x.%u ", len, name, h.hash, |
| 608 | (unsigned) ((char *) de - base)); | 677 | (unsigned) ((char *) de - base)); |
| 678 | #endif | ||
| 609 | } | 679 | } |
| 610 | space += EXT4_DIR_REC_LEN(de->name_len); | 680 | space += EXT4_DIR_REC_LEN(de->name_len); |
| 611 | names++; | 681 | names++; |
| @@ -623,7 +693,6 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, | |||
| 623 | unsigned count = dx_get_count(entries), names = 0, space = 0, i; | 693 | unsigned count = dx_get_count(entries), names = 0, space = 0, i; |
| 624 | unsigned bcount = 0; | 694 | unsigned bcount = 0; |
| 625 | struct buffer_head *bh; | 695 | struct buffer_head *bh; |
| 626 | int err; | ||
| 627 | printk("%i indexed blocks...\n", count); | 696 | printk("%i indexed blocks...\n", count); |
| 628 | for (i = 0; i < count; i++, entries++) | 697 | for (i = 0; i < count; i++, entries++) |
| 629 | { | 698 | { |
| @@ -637,7 +706,8 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, | |||
| 637 | continue; | 706 | continue; |
| 638 | stats = levels? | 707 | stats = levels? |
| 639 | dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): | 708 | dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): |
| 640 | dx_show_leaf(hinfo, (struct ext4_dir_entry_2 *) bh->b_data, blocksize, 0); | 709 | dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) |
| 710 | bh->b_data, blocksize, 0); | ||
| 641 | names += stats.names; | 711 | names += stats.names; |
| 642 | space += stats.space; | 712 | space += stats.space; |
| 643 | bcount += stats.bcount; | 713 | bcount += stats.bcount; |
| @@ -687,8 +757,28 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | |||
| 687 | if (hinfo->hash_version <= DX_HASH_TEA) | 757 | if (hinfo->hash_version <= DX_HASH_TEA) |
| 688 | hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; | 758 | hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; |
| 689 | hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed; | 759 | hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed; |
| 760 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 761 | if (d_name) { | ||
| 762 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 763 | int res; | ||
| 764 | |||
| 765 | /* Check if the directory is encrypted */ | ||
| 766 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 767 | if (IS_ERR(ctx)) { | ||
| 768 | ret_err = ERR_PTR(PTR_ERR(ctx)); | ||
| 769 | goto fail; | ||
| 770 | } | ||
| 771 | res = ext4_fname_usr_to_hash(ctx, d_name, hinfo); | ||
| 772 | if (res < 0) { | ||
| 773 | ret_err = ERR_PTR(res); | ||
| 774 | goto fail; | ||
| 775 | } | ||
| 776 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 777 | } | ||
| 778 | #else | ||
| 690 | if (d_name) | 779 | if (d_name) |
| 691 | ext4fs_dirhash(d_name->name, d_name->len, hinfo); | 780 | ext4fs_dirhash(d_name->name, d_name->len, hinfo); |
| 781 | #endif | ||
| 692 | hash = hinfo->hash; | 782 | hash = hinfo->hash; |
| 693 | 783 | ||
| 694 | if (root->info.unused_flags & 1) { | 784 | if (root->info.unused_flags & 1) { |
| @@ -773,6 +863,7 @@ fail: | |||
| 773 | brelse(frame->bh); | 863 | brelse(frame->bh); |
| 774 | frame--; | 864 | frame--; |
| 775 | } | 865 | } |
| 866 | |||
| 776 | if (ret_err == ERR_PTR(ERR_BAD_DX_DIR)) | 867 | if (ret_err == ERR_PTR(ERR_BAD_DX_DIR)) |
| 777 | ext4_warning(dir->i_sb, | 868 | ext4_warning(dir->i_sb, |
| 778 | "Corrupt dir inode %lu, running e2fsck is " | 869 | "Corrupt dir inode %lu, running e2fsck is " |
| @@ -878,6 +969,8 @@ static int htree_dirblock_to_tree(struct file *dir_file, | |||
| 878 | struct buffer_head *bh; | 969 | struct buffer_head *bh; |
| 879 | struct ext4_dir_entry_2 *de, *top; | 970 | struct ext4_dir_entry_2 *de, *top; |
| 880 | int err = 0, count = 0; | 971 | int err = 0, count = 0; |
| 972 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 973 | struct ext4_str fname_crypto_str = {.name = NULL, .len = 0}, tmp_str; | ||
| 881 | 974 | ||
| 882 | dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n", | 975 | dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n", |
| 883 | (unsigned long)block)); | 976 | (unsigned long)block)); |
| @@ -889,6 +982,24 @@ static int htree_dirblock_to_tree(struct file *dir_file, | |||
| 889 | top = (struct ext4_dir_entry_2 *) ((char *) de + | 982 | top = (struct ext4_dir_entry_2 *) ((char *) de + |
| 890 | dir->i_sb->s_blocksize - | 983 | dir->i_sb->s_blocksize - |
| 891 | EXT4_DIR_REC_LEN(0)); | 984 | EXT4_DIR_REC_LEN(0)); |
| 985 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 986 | /* Check if the directory is encrypted */ | ||
| 987 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 988 | if (IS_ERR(ctx)) { | ||
| 989 | err = PTR_ERR(ctx); | ||
| 990 | brelse(bh); | ||
| 991 | return err; | ||
| 992 | } | ||
| 993 | if (ctx != NULL) { | ||
| 994 | err = ext4_fname_crypto_alloc_buffer(ctx, EXT4_NAME_LEN, | ||
| 995 | &fname_crypto_str); | ||
| 996 | if (err < 0) { | ||
| 997 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 998 | brelse(bh); | ||
| 999 | return err; | ||
| 1000 | } | ||
| 1001 | } | ||
| 1002 | #endif | ||
| 892 | for (; de < top; de = ext4_next_entry(de, dir->i_sb->s_blocksize)) { | 1003 | for (; de < top; de = ext4_next_entry(de, dir->i_sb->s_blocksize)) { |
| 893 | if (ext4_check_dir_entry(dir, NULL, de, bh, | 1004 | if (ext4_check_dir_entry(dir, NULL, de, bh, |
| 894 | bh->b_data, bh->b_size, | 1005 | bh->b_data, bh->b_size, |
| @@ -897,21 +1008,52 @@ static int htree_dirblock_to_tree(struct file *dir_file, | |||
| 897 | /* silently ignore the rest of the block */ | 1008 | /* silently ignore the rest of the block */ |
| 898 | break; | 1009 | break; |
| 899 | } | 1010 | } |
| 1011 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1012 | err = ext4_fname_disk_to_hash(ctx, de, hinfo); | ||
| 1013 | if (err < 0) { | ||
| 1014 | count = err; | ||
| 1015 | goto errout; | ||
| 1016 | } | ||
| 1017 | #else | ||
| 900 | ext4fs_dirhash(de->name, de->name_len, hinfo); | 1018 | ext4fs_dirhash(de->name, de->name_len, hinfo); |
| 1019 | #endif | ||
| 901 | if ((hinfo->hash < start_hash) || | 1020 | if ((hinfo->hash < start_hash) || |
| 902 | ((hinfo->hash == start_hash) && | 1021 | ((hinfo->hash == start_hash) && |
| 903 | (hinfo->minor_hash < start_minor_hash))) | 1022 | (hinfo->minor_hash < start_minor_hash))) |
| 904 | continue; | 1023 | continue; |
| 905 | if (de->inode == 0) | 1024 | if (de->inode == 0) |
| 906 | continue; | 1025 | continue; |
| 907 | if ((err = ext4_htree_store_dirent(dir_file, | 1026 | if (ctx == NULL) { |
| 908 | hinfo->hash, hinfo->minor_hash, de)) != 0) { | 1027 | /* Directory is not encrypted */ |
| 909 | brelse(bh); | 1028 | tmp_str.name = de->name; |
| 910 | return err; | 1029 | tmp_str.len = de->name_len; |
| 1030 | err = ext4_htree_store_dirent(dir_file, | ||
| 1031 | hinfo->hash, hinfo->minor_hash, de, | ||
| 1032 | &tmp_str); | ||
| 1033 | } else { | ||
| 1034 | /* Directory is encrypted */ | ||
| 1035 | err = ext4_fname_disk_to_usr(ctx, de, | ||
| 1036 | &fname_crypto_str); | ||
| 1037 | if (err < 0) { | ||
| 1038 | count = err; | ||
| 1039 | goto errout; | ||
| 1040 | } | ||
| 1041 | err = ext4_htree_store_dirent(dir_file, | ||
| 1042 | hinfo->hash, hinfo->minor_hash, de, | ||
| 1043 | &fname_crypto_str); | ||
| 1044 | } | ||
| 1045 | if (err != 0) { | ||
| 1046 | count = err; | ||
| 1047 | goto errout; | ||
| 911 | } | 1048 | } |
| 912 | count++; | 1049 | count++; |
| 913 | } | 1050 | } |
| 1051 | errout: | ||
| 914 | brelse(bh); | 1052 | brelse(bh); |
| 1053 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1054 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1055 | ext4_fname_crypto_free_buffer(&fname_crypto_str); | ||
| 1056 | #endif | ||
| 915 | return count; | 1057 | return count; |
| 916 | } | 1058 | } |
| 917 | 1059 | ||
| @@ -935,6 +1077,7 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, | |||
| 935 | int count = 0; | 1077 | int count = 0; |
| 936 | int ret, err; | 1078 | int ret, err; |
| 937 | __u32 hashval; | 1079 | __u32 hashval; |
| 1080 | struct ext4_str tmp_str; | ||
| 938 | 1081 | ||
| 939 | dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", | 1082 | dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", |
| 940 | start_hash, start_minor_hash)); | 1083 | start_hash, start_minor_hash)); |
| @@ -970,14 +1113,22 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, | |||
| 970 | /* Add '.' and '..' from the htree header */ | 1113 | /* Add '.' and '..' from the htree header */ |
| 971 | if (!start_hash && !start_minor_hash) { | 1114 | if (!start_hash && !start_minor_hash) { |
| 972 | de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data; | 1115 | de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data; |
| 973 | if ((err = ext4_htree_store_dirent(dir_file, 0, 0, de)) != 0) | 1116 | tmp_str.name = de->name; |
| 1117 | tmp_str.len = de->name_len; | ||
| 1118 | err = ext4_htree_store_dirent(dir_file, 0, 0, | ||
| 1119 | de, &tmp_str); | ||
| 1120 | if (err != 0) | ||
| 974 | goto errout; | 1121 | goto errout; |
| 975 | count++; | 1122 | count++; |
| 976 | } | 1123 | } |
| 977 | if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) { | 1124 | if (start_hash < 2 || (start_hash ==2 && start_minor_hash==0)) { |
| 978 | de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data; | 1125 | de = (struct ext4_dir_entry_2 *) frames[0].bh->b_data; |
| 979 | de = ext4_next_entry(de, dir->i_sb->s_blocksize); | 1126 | de = ext4_next_entry(de, dir->i_sb->s_blocksize); |
| 980 | if ((err = ext4_htree_store_dirent(dir_file, 2, 0, de)) != 0) | 1127 | tmp_str.name = de->name; |
| 1128 | tmp_str.len = de->name_len; | ||
| 1129 | err = ext4_htree_store_dirent(dir_file, 2, 0, | ||
| 1130 | de, &tmp_str); | ||
| 1131 | if (err != 0) | ||
| 981 | goto errout; | 1132 | goto errout; |
| 982 | count++; | 1133 | count++; |
| 983 | } | 1134 | } |
| @@ -1035,17 +1186,33 @@ static inline int search_dirblock(struct buffer_head *bh, | |||
| 1035 | * Create map of hash values, offsets, and sizes, stored at end of block. | 1186 | * Create map of hash values, offsets, and sizes, stored at end of block. |
| 1036 | * Returns number of entries mapped. | 1187 | * Returns number of entries mapped. |
| 1037 | */ | 1188 | */ |
| 1038 | static int dx_make_map(struct ext4_dir_entry_2 *de, unsigned blocksize, | 1189 | static int dx_make_map(struct inode *dir, struct ext4_dir_entry_2 *de, |
| 1039 | struct dx_hash_info *hinfo, | 1190 | unsigned blocksize, struct dx_hash_info *hinfo, |
| 1040 | struct dx_map_entry *map_tail) | 1191 | struct dx_map_entry *map_tail) |
| 1041 | { | 1192 | { |
| 1042 | int count = 0; | 1193 | int count = 0; |
| 1043 | char *base = (char *) de; | 1194 | char *base = (char *) de; |
| 1044 | struct dx_hash_info h = *hinfo; | 1195 | struct dx_hash_info h = *hinfo; |
| 1196 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1197 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 1198 | int err; | ||
| 1199 | |||
| 1200 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 1201 | if (IS_ERR(ctx)) | ||
| 1202 | return PTR_ERR(ctx); | ||
| 1203 | #endif | ||
| 1045 | 1204 | ||
| 1046 | while ((char *) de < base + blocksize) { | 1205 | while ((char *) de < base + blocksize) { |
| 1047 | if (de->name_len && de->inode) { | 1206 | if (de->name_len && de->inode) { |
| 1207 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1208 | err = ext4_fname_disk_to_hash(ctx, de, &h); | ||
| 1209 | if (err < 0) { | ||
| 1210 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1211 | return err; | ||
| 1212 | } | ||
| 1213 | #else | ||
| 1048 | ext4fs_dirhash(de->name, de->name_len, &h); | 1214 | ext4fs_dirhash(de->name, de->name_len, &h); |
| 1215 | #endif | ||
| 1049 | map_tail--; | 1216 | map_tail--; |
| 1050 | map_tail->hash = h.hash; | 1217 | map_tail->hash = h.hash; |
| 1051 | map_tail->offs = ((char *) de - base)>>2; | 1218 | map_tail->offs = ((char *) de - base)>>2; |
| @@ -1056,6 +1223,9 @@ static int dx_make_map(struct ext4_dir_entry_2 *de, unsigned blocksize, | |||
| 1056 | /* XXX: do we need to check rec_len == 0 case? -Chris */ | 1223 | /* XXX: do we need to check rec_len == 0 case? -Chris */ |
| 1057 | de = ext4_next_entry(de, blocksize); | 1224 | de = ext4_next_entry(de, blocksize); |
| 1058 | } | 1225 | } |
| 1226 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1227 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1228 | #endif | ||
| 1059 | return count; | 1229 | return count; |
| 1060 | } | 1230 | } |
| 1061 | 1231 | ||
| @@ -1106,57 +1276,107 @@ static void dx_insert_block(struct dx_frame *frame, u32 hash, ext4_lblk_t block) | |||
| 1106 | * `len <= EXT4_NAME_LEN' is guaranteed by caller. | 1276 | * `len <= EXT4_NAME_LEN' is guaranteed by caller. |
| 1107 | * `de != NULL' is guaranteed by caller. | 1277 | * `de != NULL' is guaranteed by caller. |
| 1108 | */ | 1278 | */ |
| 1109 | static inline int ext4_match (int len, const char * const name, | 1279 | static inline int ext4_match(struct ext4_fname_crypto_ctx *ctx, |
| 1110 | struct ext4_dir_entry_2 * de) | 1280 | struct ext4_str *fname_crypto_str, |
| 1281 | int len, const char * const name, | ||
| 1282 | struct ext4_dir_entry_2 *de) | ||
| 1111 | { | 1283 | { |
| 1112 | if (len != de->name_len) | 1284 | int res; |
| 1113 | return 0; | 1285 | |
| 1114 | if (!de->inode) | 1286 | if (!de->inode) |
| 1115 | return 0; | 1287 | return 0; |
| 1116 | return !memcmp(name, de->name, len); | 1288 | |
| 1289 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1290 | if (ctx) { | ||
| 1291 | /* Directory is encrypted */ | ||
| 1292 | res = ext4_fname_disk_to_usr(ctx, de, fname_crypto_str); | ||
| 1293 | if (res < 0) | ||
| 1294 | return res; | ||
| 1295 | if (len != res) | ||
| 1296 | return 0; | ||
| 1297 | res = memcmp(name, fname_crypto_str->name, len); | ||
| 1298 | return (res == 0) ? 1 : 0; | ||
| 1299 | } | ||
| 1300 | #endif | ||
| 1301 | if (len != de->name_len) | ||
| 1302 | return 0; | ||
| 1303 | res = memcmp(name, de->name, len); | ||
| 1304 | return (res == 0) ? 1 : 0; | ||
| 1117 | } | 1305 | } |
| 1118 | 1306 | ||
| 1119 | /* | 1307 | /* |
| 1120 | * Returns 0 if not found, -1 on failure, and 1 on success | 1308 | * Returns 0 if not found, -1 on failure, and 1 on success |
| 1121 | */ | 1309 | */ |
| 1122 | int search_dir(struct buffer_head *bh, | 1310 | int search_dir(struct buffer_head *bh, char *search_buf, int buf_size, |
| 1123 | char *search_buf, | 1311 | struct inode *dir, const struct qstr *d_name, |
| 1124 | int buf_size, | 1312 | unsigned int offset, struct ext4_dir_entry_2 **res_dir) |
| 1125 | struct inode *dir, | ||
| 1126 | const struct qstr *d_name, | ||
| 1127 | unsigned int offset, | ||
| 1128 | struct ext4_dir_entry_2 **res_dir) | ||
| 1129 | { | 1313 | { |
| 1130 | struct ext4_dir_entry_2 * de; | 1314 | struct ext4_dir_entry_2 * de; |
| 1131 | char * dlimit; | 1315 | char * dlimit; |
| 1132 | int de_len; | 1316 | int de_len; |
| 1133 | const char *name = d_name->name; | 1317 | const char *name = d_name->name; |
| 1134 | int namelen = d_name->len; | 1318 | int namelen = d_name->len; |
| 1319 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 1320 | struct ext4_str fname_crypto_str = {.name = NULL, .len = 0}; | ||
| 1321 | int res; | ||
| 1322 | |||
| 1323 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 1324 | if (IS_ERR(ctx)) | ||
| 1325 | return -1; | ||
| 1326 | |||
| 1327 | if (ctx != NULL) { | ||
| 1328 | /* Allocate buffer to hold maximum name length */ | ||
| 1329 | res = ext4_fname_crypto_alloc_buffer(ctx, EXT4_NAME_LEN, | ||
| 1330 | &fname_crypto_str); | ||
| 1331 | if (res < 0) { | ||
| 1332 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1333 | return -1; | ||
| 1334 | } | ||
| 1335 | } | ||
| 1135 | 1336 | ||
| 1136 | de = (struct ext4_dir_entry_2 *)search_buf; | 1337 | de = (struct ext4_dir_entry_2 *)search_buf; |
| 1137 | dlimit = search_buf + buf_size; | 1338 | dlimit = search_buf + buf_size; |
| 1138 | while ((char *) de < dlimit) { | 1339 | while ((char *) de < dlimit) { |
| 1139 | /* this code is executed quadratically often */ | 1340 | /* this code is executed quadratically often */ |
| 1140 | /* do minimal checking `by hand' */ | 1341 | /* do minimal checking `by hand' */ |
| 1342 | if ((char *) de + de->name_len <= dlimit) { | ||
| 1343 | res = ext4_match(ctx, &fname_crypto_str, namelen, | ||
| 1344 | name, de); | ||
| 1345 | if (res < 0) { | ||
| 1346 | res = -1; | ||
| 1347 | goto return_result; | ||
| 1348 | } | ||
| 1349 | if (res > 0) { | ||
| 1350 | /* found a match - just to be sure, do | ||
| 1351 | * a full check */ | ||
| 1352 | if (ext4_check_dir_entry(dir, NULL, de, bh, | ||
| 1353 | bh->b_data, | ||
| 1354 | bh->b_size, offset)) { | ||
| 1355 | res = -1; | ||
| 1356 | goto return_result; | ||
| 1357 | } | ||
| 1358 | *res_dir = de; | ||
| 1359 | res = 1; | ||
| 1360 | goto return_result; | ||
| 1361 | } | ||
| 1141 | 1362 | ||
| 1142 | if ((char *) de + namelen <= dlimit && | ||
| 1143 | ext4_match (namelen, name, de)) { | ||
| 1144 | /* found a match - just to be sure, do a full check */ | ||
| 1145 | if (ext4_check_dir_entry(dir, NULL, de, bh, bh->b_data, | ||
| 1146 | bh->b_size, offset)) | ||
| 1147 | return -1; | ||
| 1148 | *res_dir = de; | ||
| 1149 | return 1; | ||
| 1150 | } | 1363 | } |
| 1151 | /* prevent looping on a bad block */ | 1364 | /* prevent looping on a bad block */ |
| 1152 | de_len = ext4_rec_len_from_disk(de->rec_len, | 1365 | de_len = ext4_rec_len_from_disk(de->rec_len, |
| 1153 | dir->i_sb->s_blocksize); | 1366 | dir->i_sb->s_blocksize); |
| 1154 | if (de_len <= 0) | 1367 | if (de_len <= 0) { |
| 1155 | return -1; | 1368 | res = -1; |
| 1369 | goto return_result; | ||
| 1370 | } | ||
| 1156 | offset += de_len; | 1371 | offset += de_len; |
| 1157 | de = (struct ext4_dir_entry_2 *) ((char *) de + de_len); | 1372 | de = (struct ext4_dir_entry_2 *) ((char *) de + de_len); |
| 1158 | } | 1373 | } |
| 1159 | return 0; | 1374 | |
| 1375 | res = 0; | ||
| 1376 | return_result: | ||
| 1377 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1378 | ext4_fname_crypto_free_buffer(&fname_crypto_str); | ||
| 1379 | return res; | ||
| 1160 | } | 1380 | } |
| 1161 | 1381 | ||
| 1162 | static int is_dx_internal_node(struct inode *dir, ext4_lblk_t block, | 1382 | static int is_dx_internal_node(struct inode *dir, ext4_lblk_t block, |
| @@ -1345,6 +1565,9 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir, const struct q | |||
| 1345 | ext4_lblk_t block; | 1565 | ext4_lblk_t block; |
| 1346 | int retval; | 1566 | int retval; |
| 1347 | 1567 | ||
| 1568 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 1569 | *res_dir = NULL; | ||
| 1570 | #endif | ||
| 1348 | frame = dx_probe(d_name, dir, &hinfo, frames); | 1571 | frame = dx_probe(d_name, dir, &hinfo, frames); |
| 1349 | if (IS_ERR(frame)) | 1572 | if (IS_ERR(frame)) |
| 1350 | return (struct buffer_head *) frame; | 1573 | return (struct buffer_head *) frame; |
| @@ -1417,6 +1640,18 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsi | |||
| 1417 | ino); | 1640 | ino); |
| 1418 | return ERR_PTR(-EIO); | 1641 | return ERR_PTR(-EIO); |
| 1419 | } | 1642 | } |
| 1643 | if (!IS_ERR(inode) && ext4_encrypted_inode(dir) && | ||
| 1644 | (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || | ||
| 1645 | S_ISLNK(inode->i_mode)) && | ||
| 1646 | !ext4_is_child_context_consistent_with_parent(dir, | ||
| 1647 | inode)) { | ||
| 1648 | iput(inode); | ||
| 1649 | ext4_warning(inode->i_sb, | ||
| 1650 | "Inconsistent encryption contexts: %lu/%lu\n", | ||
| 1651 | (unsigned long) dir->i_ino, | ||
| 1652 | (unsigned long) inode->i_ino); | ||
| 1653 | return ERR_PTR(-EPERM); | ||
| 1654 | } | ||
| 1420 | } | 1655 | } |
| 1421 | return d_splice_alias(inode, dentry); | 1656 | return d_splice_alias(inode, dentry); |
| 1422 | } | 1657 | } |
| @@ -1541,7 +1776,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, | |||
| 1541 | 1776 | ||
| 1542 | /* create map in the end of data2 block */ | 1777 | /* create map in the end of data2 block */ |
| 1543 | map = (struct dx_map_entry *) (data2 + blocksize); | 1778 | map = (struct dx_map_entry *) (data2 + blocksize); |
| 1544 | count = dx_make_map((struct ext4_dir_entry_2 *) data1, | 1779 | count = dx_make_map(dir, (struct ext4_dir_entry_2 *) data1, |
| 1545 | blocksize, hinfo, map); | 1780 | blocksize, hinfo, map); |
| 1546 | map -= count; | 1781 | map -= count; |
| 1547 | dx_sort_map(map, count); | 1782 | dx_sort_map(map, count); |
| @@ -1564,7 +1799,8 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, | |||
| 1564 | hash2, split, count-split)); | 1799 | hash2, split, count-split)); |
| 1565 | 1800 | ||
| 1566 | /* Fancy dance to stay within two buffers */ | 1801 | /* Fancy dance to stay within two buffers */ |
| 1567 | de2 = dx_move_dirents(data1, data2, map + split, count - split, blocksize); | 1802 | de2 = dx_move_dirents(data1, data2, map + split, count - split, |
| 1803 | blocksize); | ||
| 1568 | de = dx_pack_dirents(data1, blocksize); | 1804 | de = dx_pack_dirents(data1, blocksize); |
| 1569 | de->rec_len = ext4_rec_len_to_disk(data1 + (blocksize - csum_size) - | 1805 | de->rec_len = ext4_rec_len_to_disk(data1 + (blocksize - csum_size) - |
| 1570 | (char *) de, | 1806 | (char *) de, |
| @@ -1580,8 +1816,10 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, | |||
| 1580 | initialize_dirent_tail(t, blocksize); | 1816 | initialize_dirent_tail(t, blocksize); |
| 1581 | } | 1817 | } |
| 1582 | 1818 | ||
| 1583 | dxtrace(dx_show_leaf (hinfo, (struct ext4_dir_entry_2 *) data1, blocksize, 1)); | 1819 | dxtrace(dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) data1, |
| 1584 | dxtrace(dx_show_leaf (hinfo, (struct ext4_dir_entry_2 *) data2, blocksize, 1)); | 1820 | blocksize, 1)); |
| 1821 | dxtrace(dx_show_leaf(dir, hinfo, (struct ext4_dir_entry_2 *) data2, | ||
| 1822 | blocksize, 1)); | ||
| 1585 | 1823 | ||
| 1586 | /* Which block gets the new entry? */ | 1824 | /* Which block gets the new entry? */ |
| 1587 | if (hinfo->hash >= hash2) { | 1825 | if (hinfo->hash >= hash2) { |
| @@ -1618,15 +1856,48 @@ int ext4_find_dest_de(struct inode *dir, struct inode *inode, | |||
| 1618 | int nlen, rlen; | 1856 | int nlen, rlen; |
| 1619 | unsigned int offset = 0; | 1857 | unsigned int offset = 0; |
| 1620 | char *top; | 1858 | char *top; |
| 1859 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 1860 | struct ext4_str fname_crypto_str = {.name = NULL, .len = 0}; | ||
| 1861 | int res; | ||
| 1862 | |||
| 1863 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 1864 | if (IS_ERR(ctx)) | ||
| 1865 | return -1; | ||
| 1866 | |||
| 1867 | if (ctx != NULL) { | ||
| 1868 | /* Calculate record length needed to store the entry */ | ||
| 1869 | res = ext4_fname_crypto_namelen_on_disk(ctx, namelen); | ||
| 1870 | if (res < 0) { | ||
| 1871 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1872 | return res; | ||
| 1873 | } | ||
| 1874 | reclen = EXT4_DIR_REC_LEN(res); | ||
| 1875 | |||
| 1876 | /* Allocate buffer to hold maximum name length */ | ||
| 1877 | res = ext4_fname_crypto_alloc_buffer(ctx, EXT4_NAME_LEN, | ||
| 1878 | &fname_crypto_str); | ||
| 1879 | if (res < 0) { | ||
| 1880 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1881 | return -1; | ||
| 1882 | } | ||
| 1883 | } | ||
| 1621 | 1884 | ||
| 1622 | de = (struct ext4_dir_entry_2 *)buf; | 1885 | de = (struct ext4_dir_entry_2 *)buf; |
| 1623 | top = buf + buf_size - reclen; | 1886 | top = buf + buf_size - reclen; |
| 1624 | while ((char *) de <= top) { | 1887 | while ((char *) de <= top) { |
| 1625 | if (ext4_check_dir_entry(dir, NULL, de, bh, | 1888 | if (ext4_check_dir_entry(dir, NULL, de, bh, |
| 1626 | buf, buf_size, offset)) | 1889 | buf, buf_size, offset)) { |
| 1627 | return -EIO; | 1890 | res = -EIO; |
| 1628 | if (ext4_match(namelen, name, de)) | 1891 | goto return_result; |
| 1629 | return -EEXIST; | 1892 | } |
| 1893 | /* Provide crypto context and crypto buffer to ext4 match */ | ||
| 1894 | res = ext4_match(ctx, &fname_crypto_str, namelen, name, de); | ||
| 1895 | if (res < 0) | ||
| 1896 | goto return_result; | ||
| 1897 | if (res > 0) { | ||
| 1898 | res = -EEXIST; | ||
| 1899 | goto return_result; | ||
| 1900 | } | ||
| 1630 | nlen = EXT4_DIR_REC_LEN(de->name_len); | 1901 | nlen = EXT4_DIR_REC_LEN(de->name_len); |
| 1631 | rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); | 1902 | rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); |
| 1632 | if ((de->inode ? rlen - nlen : rlen) >= reclen) | 1903 | if ((de->inode ? rlen - nlen : rlen) >= reclen) |
| @@ -1634,26 +1905,62 @@ int ext4_find_dest_de(struct inode *dir, struct inode *inode, | |||
| 1634 | de = (struct ext4_dir_entry_2 *)((char *)de + rlen); | 1905 | de = (struct ext4_dir_entry_2 *)((char *)de + rlen); |
| 1635 | offset += rlen; | 1906 | offset += rlen; |
| 1636 | } | 1907 | } |
| 1637 | if ((char *) de > top) | ||
| 1638 | return -ENOSPC; | ||
| 1639 | 1908 | ||
| 1640 | *dest_de = de; | 1909 | if ((char *) de > top) |
| 1641 | return 0; | 1910 | res = -ENOSPC; |
| 1911 | else { | ||
| 1912 | *dest_de = de; | ||
| 1913 | res = 0; | ||
| 1914 | } | ||
| 1915 | return_result: | ||
| 1916 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1917 | ext4_fname_crypto_free_buffer(&fname_crypto_str); | ||
| 1918 | return res; | ||
| 1642 | } | 1919 | } |
| 1643 | 1920 | ||
| 1644 | void ext4_insert_dentry(struct inode *inode, | 1921 | int ext4_insert_dentry(struct inode *dir, |
| 1645 | struct ext4_dir_entry_2 *de, | 1922 | struct inode *inode, |
| 1646 | int buf_size, | 1923 | struct ext4_dir_entry_2 *de, |
| 1647 | const char *name, int namelen) | 1924 | int buf_size, |
| 1925 | const struct qstr *iname, | ||
| 1926 | const char *name, int namelen) | ||
| 1648 | { | 1927 | { |
| 1649 | 1928 | ||
| 1650 | int nlen, rlen; | 1929 | int nlen, rlen; |
| 1930 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 1931 | struct ext4_str fname_crypto_str = {.name = NULL, .len = 0}; | ||
| 1932 | struct ext4_str tmp_str; | ||
| 1933 | int res; | ||
| 1934 | |||
| 1935 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 1936 | if (IS_ERR(ctx)) | ||
| 1937 | return -EIO; | ||
| 1938 | /* By default, the input name would be written to the disk */ | ||
| 1939 | tmp_str.name = (unsigned char *)name; | ||
| 1940 | tmp_str.len = namelen; | ||
| 1941 | if (ctx != NULL) { | ||
| 1942 | /* Directory is encrypted */ | ||
| 1943 | res = ext4_fname_crypto_alloc_buffer(ctx, EXT4_NAME_LEN, | ||
| 1944 | &fname_crypto_str); | ||
| 1945 | if (res < 0) { | ||
| 1946 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1947 | return -ENOMEM; | ||
| 1948 | } | ||
| 1949 | res = ext4_fname_usr_to_disk(ctx, iname, &fname_crypto_str); | ||
| 1950 | if (res < 0) { | ||
| 1951 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1952 | ext4_fname_crypto_free_buffer(&fname_crypto_str); | ||
| 1953 | return res; | ||
| 1954 | } | ||
| 1955 | tmp_str.name = fname_crypto_str.name; | ||
| 1956 | tmp_str.len = fname_crypto_str.len; | ||
| 1957 | } | ||
| 1651 | 1958 | ||
| 1652 | nlen = EXT4_DIR_REC_LEN(de->name_len); | 1959 | nlen = EXT4_DIR_REC_LEN(de->name_len); |
| 1653 | rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); | 1960 | rlen = ext4_rec_len_from_disk(de->rec_len, buf_size); |
| 1654 | if (de->inode) { | 1961 | if (de->inode) { |
| 1655 | struct ext4_dir_entry_2 *de1 = | 1962 | struct ext4_dir_entry_2 *de1 = |
| 1656 | (struct ext4_dir_entry_2 *)((char *)de + nlen); | 1963 | (struct ext4_dir_entry_2 *)((char *)de + nlen); |
| 1657 | de1->rec_len = ext4_rec_len_to_disk(rlen - nlen, buf_size); | 1964 | de1->rec_len = ext4_rec_len_to_disk(rlen - nlen, buf_size); |
| 1658 | de->rec_len = ext4_rec_len_to_disk(nlen, buf_size); | 1965 | de->rec_len = ext4_rec_len_to_disk(nlen, buf_size); |
| 1659 | de = de1; | 1966 | de = de1; |
| @@ -1661,9 +1968,14 @@ void ext4_insert_dentry(struct inode *inode, | |||
| 1661 | de->file_type = EXT4_FT_UNKNOWN; | 1968 | de->file_type = EXT4_FT_UNKNOWN; |
| 1662 | de->inode = cpu_to_le32(inode->i_ino); | 1969 | de->inode = cpu_to_le32(inode->i_ino); |
| 1663 | ext4_set_de_type(inode->i_sb, de, inode->i_mode); | 1970 | ext4_set_de_type(inode->i_sb, de, inode->i_mode); |
| 1664 | de->name_len = namelen; | 1971 | de->name_len = tmp_str.len; |
| 1665 | memcpy(de->name, name, namelen); | 1972 | |
| 1973 | memcpy(de->name, tmp_str.name, tmp_str.len); | ||
| 1974 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 1975 | ext4_fname_crypto_free_buffer(&fname_crypto_str); | ||
| 1976 | return 0; | ||
| 1666 | } | 1977 | } |
| 1978 | |||
| 1667 | /* | 1979 | /* |
| 1668 | * Add a new entry into a directory (leaf) block. If de is non-NULL, | 1980 | * Add a new entry into a directory (leaf) block. If de is non-NULL, |
| 1669 | * it points to a directory entry which is guaranteed to be large | 1981 | * it points to a directory entry which is guaranteed to be large |
| @@ -1700,8 +2012,12 @@ static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, | |||
| 1700 | return err; | 2012 | return err; |
| 1701 | } | 2013 | } |
| 1702 | 2014 | ||
| 1703 | /* By now the buffer is marked for journaling */ | 2015 | /* By now the buffer is marked for journaling. Due to crypto operations, |
| 1704 | ext4_insert_dentry(inode, de, blocksize, name, namelen); | 2016 | * the following function call may fail */ |
| 2017 | err = ext4_insert_dentry(dir, inode, de, blocksize, &dentry->d_name, | ||
| 2018 | name, namelen); | ||
| 2019 | if (err < 0) | ||
| 2020 | return err; | ||
| 1705 | 2021 | ||
| 1706 | /* | 2022 | /* |
| 1707 | * XXX shouldn't update any times until successful | 2023 | * XXX shouldn't update any times until successful |
| @@ -1733,8 +2049,13 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
| 1733 | struct inode *inode, struct buffer_head *bh) | 2049 | struct inode *inode, struct buffer_head *bh) |
| 1734 | { | 2050 | { |
| 1735 | struct inode *dir = dentry->d_parent->d_inode; | 2051 | struct inode *dir = dentry->d_parent->d_inode; |
| 2052 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 2053 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 2054 | int res; | ||
| 2055 | #else | ||
| 1736 | const char *name = dentry->d_name.name; | 2056 | const char *name = dentry->d_name.name; |
| 1737 | int namelen = dentry->d_name.len; | 2057 | int namelen = dentry->d_name.len; |
| 2058 | #endif | ||
| 1738 | struct buffer_head *bh2; | 2059 | struct buffer_head *bh2; |
| 1739 | struct dx_root *root; | 2060 | struct dx_root *root; |
| 1740 | struct dx_frame frames[2], *frame; | 2061 | struct dx_frame frames[2], *frame; |
| @@ -1748,7 +2069,13 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
| 1748 | struct dx_hash_info hinfo; | 2069 | struct dx_hash_info hinfo; |
| 1749 | ext4_lblk_t block; | 2070 | ext4_lblk_t block; |
| 1750 | struct fake_dirent *fde; | 2071 | struct fake_dirent *fde; |
| 1751 | int csum_size = 0; | 2072 | int csum_size = 0; |
| 2073 | |||
| 2074 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 2075 | ctx = ext4_get_fname_crypto_ctx(dir, EXT4_NAME_LEN); | ||
| 2076 | if (IS_ERR(ctx)) | ||
| 2077 | return PTR_ERR(ctx); | ||
| 2078 | #endif | ||
| 1752 | 2079 | ||
| 1753 | if (ext4_has_metadata_csum(inode->i_sb)) | 2080 | if (ext4_has_metadata_csum(inode->i_sb)) |
| 1754 | csum_size = sizeof(struct ext4_dir_entry_tail); | 2081 | csum_size = sizeof(struct ext4_dir_entry_tail); |
| @@ -1815,7 +2142,18 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, | |||
| 1815 | if (hinfo.hash_version <= DX_HASH_TEA) | 2142 | if (hinfo.hash_version <= DX_HASH_TEA) |
| 1816 | hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; | 2143 | hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned; |
| 1817 | hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed; | 2144 | hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed; |
| 2145 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 2146 | res = ext4_fname_usr_to_hash(ctx, &dentry->d_name, &hinfo); | ||
| 2147 | if (res < 0) { | ||
| 2148 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 2149 | ext4_mark_inode_dirty(handle, dir); | ||
| 2150 | brelse(bh); | ||
| 2151 | return res; | ||
| 2152 | } | ||
| 2153 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 2154 | #else | ||
| 1818 | ext4fs_dirhash(name, namelen, &hinfo); | 2155 | ext4fs_dirhash(name, namelen, &hinfo); |
| 2156 | #endif | ||
| 1819 | memset(frames, 0, sizeof(frames)); | 2157 | memset(frames, 0, sizeof(frames)); |
| 1820 | frame = frames; | 2158 | frame = frames; |
| 1821 | frame->entries = entries; | 2159 | frame->entries = entries; |
| @@ -1865,7 +2203,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1865 | struct inode *inode) | 2203 | struct inode *inode) |
| 1866 | { | 2204 | { |
| 1867 | struct inode *dir = dentry->d_parent->d_inode; | 2205 | struct inode *dir = dentry->d_parent->d_inode; |
| 1868 | struct buffer_head *bh; | 2206 | struct buffer_head *bh = NULL; |
| 1869 | struct ext4_dir_entry_2 *de; | 2207 | struct ext4_dir_entry_2 *de; |
| 1870 | struct ext4_dir_entry_tail *t; | 2208 | struct ext4_dir_entry_tail *t; |
| 1871 | struct super_block *sb; | 2209 | struct super_block *sb; |
| @@ -1889,14 +2227,14 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1889 | return retval; | 2227 | return retval; |
| 1890 | if (retval == 1) { | 2228 | if (retval == 1) { |
| 1891 | retval = 0; | 2229 | retval = 0; |
| 1892 | return retval; | 2230 | goto out; |
| 1893 | } | 2231 | } |
| 1894 | } | 2232 | } |
| 1895 | 2233 | ||
| 1896 | if (is_dx(dir)) { | 2234 | if (is_dx(dir)) { |
| 1897 | retval = ext4_dx_add_entry(handle, dentry, inode); | 2235 | retval = ext4_dx_add_entry(handle, dentry, inode); |
| 1898 | if (!retval || (retval != ERR_BAD_DX_DIR)) | 2236 | if (!retval || (retval != ERR_BAD_DX_DIR)) |
| 1899 | return retval; | 2237 | goto out; |
| 1900 | ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); | 2238 | ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); |
| 1901 | dx_fallback++; | 2239 | dx_fallback++; |
| 1902 | ext4_mark_inode_dirty(handle, dir); | 2240 | ext4_mark_inode_dirty(handle, dir); |
| @@ -1908,14 +2246,15 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1908 | return PTR_ERR(bh); | 2246 | return PTR_ERR(bh); |
| 1909 | 2247 | ||
| 1910 | retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); | 2248 | retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); |
| 1911 | if (retval != -ENOSPC) { | 2249 | if (retval != -ENOSPC) |
| 1912 | brelse(bh); | 2250 | goto out; |
| 1913 | return retval; | ||
| 1914 | } | ||
| 1915 | 2251 | ||
| 1916 | if (blocks == 1 && !dx_fallback && | 2252 | if (blocks == 1 && !dx_fallback && |
| 1917 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) | 2253 | EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) { |
| 1918 | return make_indexed_dir(handle, dentry, inode, bh); | 2254 | retval = make_indexed_dir(handle, dentry, inode, bh); |
| 2255 | bh = NULL; /* make_indexed_dir releases bh */ | ||
| 2256 | goto out; | ||
| 2257 | } | ||
| 1919 | brelse(bh); | 2258 | brelse(bh); |
| 1920 | } | 2259 | } |
| 1921 | bh = ext4_append(handle, dir, &block); | 2260 | bh = ext4_append(handle, dir, &block); |
| @@ -1931,6 +2270,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | |||
| 1931 | } | 2270 | } |
| 1932 | 2271 | ||
| 1933 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | 2272 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); |
| 2273 | out: | ||
| 1934 | brelse(bh); | 2274 | brelse(bh); |
| 1935 | if (retval == 0) | 2275 | if (retval == 0) |
| 1936 | ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); | 2276 | ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); |
| @@ -2235,12 +2575,22 @@ retry: | |||
| 2235 | err = PTR_ERR(inode); | 2575 | err = PTR_ERR(inode); |
| 2236 | if (!IS_ERR(inode)) { | 2576 | if (!IS_ERR(inode)) { |
| 2237 | inode->i_op = &ext4_file_inode_operations; | 2577 | inode->i_op = &ext4_file_inode_operations; |
| 2238 | if (test_opt(inode->i_sb, DAX)) | 2578 | inode->i_fop = &ext4_file_operations; |
| 2239 | inode->i_fop = &ext4_dax_file_operations; | ||
| 2240 | else | ||
| 2241 | inode->i_fop = &ext4_file_operations; | ||
| 2242 | ext4_set_aops(inode); | 2579 | ext4_set_aops(inode); |
| 2243 | err = ext4_add_nondir(handle, dentry, inode); | 2580 | err = 0; |
| 2581 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 2582 | if (!err && (ext4_encrypted_inode(dir) || | ||
| 2583 | DUMMY_ENCRYPTION_ENABLED(EXT4_SB(dir->i_sb)))) { | ||
| 2584 | err = ext4_inherit_context(dir, inode); | ||
| 2585 | if (err) { | ||
| 2586 | clear_nlink(inode); | ||
| 2587 | unlock_new_inode(inode); | ||
| 2588 | iput(inode); | ||
| 2589 | } | ||
| 2590 | } | ||
| 2591 | #endif | ||
| 2592 | if (!err) | ||
| 2593 | err = ext4_add_nondir(handle, dentry, inode); | ||
| 2244 | if (!err && IS_DIRSYNC(dir)) | 2594 | if (!err && IS_DIRSYNC(dir)) |
| 2245 | ext4_handle_sync(handle); | 2595 | ext4_handle_sync(handle); |
| 2246 | } | 2596 | } |
| @@ -2302,10 +2652,7 @@ retry: | |||
| 2302 | err = PTR_ERR(inode); | 2652 | err = PTR_ERR(inode); |
| 2303 | if (!IS_ERR(inode)) { | 2653 | if (!IS_ERR(inode)) { |
| 2304 | inode->i_op = &ext4_file_inode_operations; | 2654 | inode->i_op = &ext4_file_inode_operations; |
| 2305 | if (test_opt(inode->i_sb, DAX)) | 2655 | inode->i_fop = &ext4_file_operations; |
| 2306 | inode->i_fop = &ext4_dax_file_operations; | ||
| 2307 | else | ||
| 2308 | inode->i_fop = &ext4_file_operations; | ||
| 2309 | ext4_set_aops(inode); | 2656 | ext4_set_aops(inode); |
| 2310 | d_tmpfile(dentry, inode); | 2657 | d_tmpfile(dentry, inode); |
| 2311 | err = ext4_orphan_add(handle, inode); | 2658 | err = ext4_orphan_add(handle, inode); |
| @@ -2424,6 +2771,14 @@ retry: | |||
| 2424 | err = ext4_init_new_dir(handle, dir, inode); | 2771 | err = ext4_init_new_dir(handle, dir, inode); |
| 2425 | if (err) | 2772 | if (err) |
| 2426 | goto out_clear_inode; | 2773 | goto out_clear_inode; |
| 2774 | #ifdef CONFIG_EXT4_FS_ENCRYPTION | ||
| 2775 | if (ext4_encrypted_inode(dir) || | ||
| 2776 | DUMMY_ENCRYPTION_ENABLED(EXT4_SB(dir->i_sb))) { | ||
| 2777 | err = ext4_inherit_context(dir, inode); | ||
| 2778 | if (err) | ||
| 2779 | goto out_clear_inode; | ||
| 2780 | } | ||
| 2781 | #endif | ||
| 2427 | err = ext4_mark_inode_dirty(handle, inode); | 2782 | err = ext4_mark_inode_dirty(handle, inode); |
| 2428 | if (!err) | 2783 | if (!err) |
| 2429 | err = ext4_add_entry(handle, dentry, inode); | 2784 | err = ext4_add_entry(handle, dentry, inode); |
| @@ -2456,7 +2811,7 @@ out_stop: | |||
| 2456 | /* | 2811 | /* |
| 2457 | * routine to check that the specified directory is empty (for rmdir) | 2812 | * routine to check that the specified directory is empty (for rmdir) |
| 2458 | */ | 2813 | */ |
| 2459 | static int empty_dir(struct inode *inode) | 2814 | int ext4_empty_dir(struct inode *inode) |
| 2460 | { | 2815 | { |
| 2461 | unsigned int offset; | 2816 | unsigned int offset; |
| 2462 | struct buffer_head *bh; | 2817 | struct buffer_head *bh; |
| @@ -2724,7 +3079,7 @@ static int ext4_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 2724 | goto end_rmdir; | 3079 | goto end_rmdir; |
| 2725 | 3080 | ||
| 2726 | retval = -ENOTEMPTY; | 3081 | retval = -ENOTEMPTY; |
| 2727 | if (!empty_dir(inode)) | 3082 | if (!ext4_empty_dir(inode)) |
| 2728 | goto end_rmdir; | 3083 | goto end_rmdir; |
| 2729 | 3084 | ||
| 2730 | handle = ext4_journal_start(dir, EXT4_HT_DIR, | 3085 | handle = ext4_journal_start(dir, EXT4_HT_DIR, |
| @@ -2834,16 +3189,25 @@ static int ext4_symlink(struct inode *dir, | |||
| 2834 | { | 3189 | { |
| 2835 | handle_t *handle; | 3190 | handle_t *handle; |
| 2836 | struct inode *inode; | 3191 | struct inode *inode; |
| 2837 | int l, err, retries = 0; | 3192 | int err, len = strlen(symname); |
| 2838 | int credits; | 3193 | int credits; |
| 2839 | 3194 | bool encryption_required; | |
| 2840 | l = strlen(symname)+1; | 3195 | struct ext4_str disk_link; |
| 2841 | if (l > dir->i_sb->s_blocksize) | 3196 | struct ext4_encrypted_symlink_data *sd = NULL; |
| 3197 | |||
| 3198 | disk_link.len = len + 1; | ||
| 3199 | disk_link.name = (char *) symname; | ||
| 3200 | |||
| 3201 | encryption_required = (ext4_encrypted_inode(dir) || | ||
| 3202 | DUMMY_ENCRYPTION_ENABLED(EXT4_SB(dir->i_sb))); | ||
| 3203 | if (encryption_required) | ||
| 3204 | disk_link.len = encrypted_symlink_data_len(len) + 1; | ||
| 3205 | if (disk_link.len > dir->i_sb->s_blocksize) | ||
| 2842 | return -ENAMETOOLONG; | 3206 | return -ENAMETOOLONG; |
| 2843 | 3207 | ||
| 2844 | dquot_initialize(dir); | 3208 | dquot_initialize(dir); |
| 2845 | 3209 | ||
| 2846 | if (l > EXT4_N_BLOCKS * 4) { | 3210 | if ((disk_link.len > EXT4_N_BLOCKS * 4)) { |
| 2847 | /* | 3211 | /* |
| 2848 | * For non-fast symlinks, we just allocate inode and put it on | 3212 | * For non-fast symlinks, we just allocate inode and put it on |
| 2849 | * orphan list in the first transaction => we need bitmap, | 3213 | * orphan list in the first transaction => we need bitmap, |
| @@ -2862,16 +3226,49 @@ static int ext4_symlink(struct inode *dir, | |||
| 2862 | credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + | 3226 | credits = EXT4_DATA_TRANS_BLOCKS(dir->i_sb) + |
| 2863 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3; | 3227 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 3; |
| 2864 | } | 3228 | } |
| 2865 | retry: | 3229 | |
| 2866 | inode = ext4_new_inode_start_handle(dir, S_IFLNK|S_IRWXUGO, | 3230 | inode = ext4_new_inode_start_handle(dir, S_IFLNK|S_IRWXUGO, |
| 2867 | &dentry->d_name, 0, NULL, | 3231 | &dentry->d_name, 0, NULL, |
| 2868 | EXT4_HT_DIR, credits); | 3232 | EXT4_HT_DIR, credits); |
| 2869 | handle = ext4_journal_current_handle(); | 3233 | handle = ext4_journal_current_handle(); |
| 2870 | err = PTR_ERR(inode); | 3234 | if (IS_ERR(inode)) { |
| 2871 | if (IS_ERR(inode)) | 3235 | if (handle) |
| 2872 | goto out_stop; | 3236 | ext4_journal_stop(handle); |
| 3237 | return PTR_ERR(inode); | ||
| 3238 | } | ||
| 3239 | |||
| 3240 | if (encryption_required) { | ||
| 3241 | struct ext4_fname_crypto_ctx *ctx = NULL; | ||
| 3242 | struct qstr istr; | ||
| 3243 | struct ext4_str ostr; | ||
| 3244 | |||
| 3245 | sd = kzalloc(disk_link.len, GFP_NOFS); | ||
| 3246 | if (!sd) { | ||
| 3247 | err = -ENOMEM; | ||
| 3248 | goto err_drop_inode; | ||
| 3249 | } | ||
| 3250 | err = ext4_inherit_context(dir, inode); | ||
| 3251 | if (err) | ||
| 3252 | goto err_drop_inode; | ||
| 3253 | ctx = ext4_get_fname_crypto_ctx(inode, | ||
| 3254 | inode->i_sb->s_blocksize); | ||
| 3255 | if (IS_ERR_OR_NULL(ctx)) { | ||
| 3256 | /* We just set the policy, so ctx should not be NULL */ | ||
| 3257 | err = (ctx == NULL) ? -EIO : PTR_ERR(ctx); | ||
| 3258 | goto err_drop_inode; | ||
| 3259 | } | ||
| 3260 | istr.name = (const unsigned char *) symname; | ||
| 3261 | istr.len = len; | ||
| 3262 | ostr.name = sd->encrypted_path; | ||
| 3263 | err = ext4_fname_usr_to_disk(ctx, &istr, &ostr); | ||
| 3264 | ext4_put_fname_crypto_ctx(&ctx); | ||
| 3265 | if (err < 0) | ||
| 3266 | goto err_drop_inode; | ||
| 3267 | sd->len = cpu_to_le16(ostr.len); | ||
| 3268 | disk_link.name = (char *) sd; | ||
| 3269 | } | ||
| 2873 | 3270 | ||
| 2874 | if (l > EXT4_N_BLOCKS * 4) { | 3271 | if ((disk_link.len > EXT4_N_BLOCKS * 4)) { |
| 2875 | inode->i_op = &ext4_symlink_inode_operations; | 3272 | inode->i_op = &ext4_symlink_inode_operations; |
| 2876 | ext4_set_aops(inode); | 3273 | ext4_set_aops(inode); |
| 2877 | /* | 3274 | /* |
| @@ -2887,9 +3284,10 @@ retry: | |||
| 2887 | drop_nlink(inode); | 3284 | drop_nlink(inode); |
| 2888 | err = ext4_orphan_add(handle, inode); | 3285 | err = ext4_orphan_add(handle, inode); |
| 2889 | ext4_journal_stop(handle); | 3286 | ext4_journal_stop(handle); |
| 3287 | handle = NULL; | ||
| 2890 | if (err) | 3288 | if (err) |
| 2891 | goto err_drop_inode; | 3289 | goto err_drop_inode; |
| 2892 | err = __page_symlink(inode, symname, l, 1); | 3290 | err = __page_symlink(inode, disk_link.name, disk_link.len, 1); |
| 2893 | if (err) | 3291 | if (err) |
| 2894 | goto err_drop_inode; | 3292 | goto err_drop_inode; |
| 2895 | /* | 3293 | /* |
| @@ -2901,34 +3299,37 @@ retry: | |||
| 2901 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 1); | 3299 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 1); |
| 2902 | if (IS_ERR(handle)) { | 3300 | if (IS_ERR(handle)) { |
| 2903 | err = PTR_ERR(handle); | 3301 | err = PTR_ERR(handle); |
| 3302 | handle = NULL; | ||
| 2904 | goto err_drop_inode; | 3303 | goto err_drop_inode; |
| 2905 | } | 3304 | } |
| 2906 | set_nlink(inode, 1); | 3305 | set_nlink(inode, 1); |
| 2907 | err = ext4_orphan_del(handle, inode); | 3306 | err = ext4_orphan_del(handle, inode); |
| 2908 | if (err) { | 3307 | if (err) |
| 2909 | ext4_journal_stop(handle); | ||
| 2910 | clear_nlink(inode); | ||
| 2911 | goto err_drop_inode; | 3308 | goto err_drop_inode; |
| 2912 | } | ||
| 2913 | } else { | 3309 | } else { |
| 2914 | /* clear the extent format for fast symlink */ | 3310 | /* clear the extent format for fast symlink */ |
| 2915 | ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS); | 3311 | ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS); |
| 2916 | inode->i_op = &ext4_fast_symlink_inode_operations; | 3312 | inode->i_op = encryption_required ? |
| 2917 | memcpy((char *)&EXT4_I(inode)->i_data, symname, l); | 3313 | &ext4_symlink_inode_operations : |
| 2918 | inode->i_size = l-1; | 3314 | &ext4_fast_symlink_inode_operations; |
| 3315 | memcpy((char *)&EXT4_I(inode)->i_data, disk_link.name, | ||
| 3316 | disk_link.len); | ||
| 3317 | inode->i_size = disk_link.len - 1; | ||
| 2919 | } | 3318 | } |
| 2920 | EXT4_I(inode)->i_disksize = inode->i_size; | 3319 | EXT4_I(inode)->i_disksize = inode->i_size; |
| 2921 | err = ext4_add_nondir(handle, dentry, inode); | 3320 | err = ext4_add_nondir(handle, dentry, inode); |
| 2922 | if (!err && IS_DIRSYNC(dir)) | 3321 | if (!err && IS_DIRSYNC(dir)) |
| 2923 | ext4_handle_sync(handle); | 3322 | ext4_handle_sync(handle); |
| 2924 | 3323 | ||
| 2925 | out_stop: | ||
| 2926 | if (handle) | 3324 | if (handle) |
| 2927 | ext4_journal_stop(handle); | 3325 | ext4_journal_stop(handle); |
| 2928 | if (err == -ENOSPC && ext4_should_retry_alloc(dir->i_sb, &retries)) | 3326 | kfree(sd); |
| 2929 | goto retry; | ||
| 2930 | return err; | 3327 | return err; |
| 2931 | err_drop_inode: | 3328 | err_drop_inode: |
| 3329 | if (handle) | ||
| 3330 | ext4_journal_stop(handle); | ||
| 3331 | kfree(sd); | ||
| 3332 | clear_nlink(inode); | ||
| 2932 | unlock_new_inode(inode); | 3333 | unlock_new_inode(inode); |
| 2933 | iput(inode); | 3334 | iput(inode); |
| 2934 | return err; | 3335 | return err; |
| @@ -2943,7 +3344,9 @@ static int ext4_link(struct dentry *old_dentry, | |||
| 2943 | 3344 | ||
| 2944 | if (inode->i_nlink >= EXT4_LINK_MAX) | 3345 | if (inode->i_nlink >= EXT4_LINK_MAX) |
| 2945 | return -EMLINK; | 3346 | return -EMLINK; |
| 2946 | 3347 | if (ext4_encrypted_inode(dir) && | |
| 3348 | !ext4_is_child_context_consistent_with_parent(dir, inode)) | ||
| 3349 | return -EPERM; | ||
| 2947 | dquot_initialize(dir); | 3350 | dquot_initialize(dir); |
| 2948 | 3351 | ||
| 2949 | retry: | 3352 | retry: |
| @@ -3244,6 +3647,14 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 3244 | if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) | 3647 | if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) |
| 3245 | goto end_rename; | 3648 | goto end_rename; |
| 3246 | 3649 | ||
| 3650 | if ((old.dir != new.dir) && | ||
| 3651 | ext4_encrypted_inode(new.dir) && | ||
| 3652 | !ext4_is_child_context_consistent_with_parent(new.dir, | ||
| 3653 | old.inode)) { | ||
| 3654 | retval = -EPERM; | ||
| 3655 | goto end_rename; | ||
| 3656 | } | ||
| 3657 | |||
| 3247 | new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, | 3658 | new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, |
| 3248 | &new.de, &new.inlined); | 3659 | &new.de, &new.inlined); |
| 3249 | if (IS_ERR(new.bh)) { | 3660 | if (IS_ERR(new.bh)) { |
| @@ -3264,12 +3675,18 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 3264 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2); | 3675 | EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2); |
| 3265 | if (!(flags & RENAME_WHITEOUT)) { | 3676 | if (!(flags & RENAME_WHITEOUT)) { |
| 3266 | handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits); | 3677 | handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits); |
| 3267 | if (IS_ERR(handle)) | 3678 | if (IS_ERR(handle)) { |
| 3268 | return PTR_ERR(handle); | 3679 | retval = PTR_ERR(handle); |
| 3680 | handle = NULL; | ||
| 3681 | goto end_rename; | ||
| 3682 | } | ||
| 3269 | } else { | 3683 | } else { |
| 3270 | whiteout = ext4_whiteout_for_rename(&old, credits, &handle); | 3684 | whiteout = ext4_whiteout_for_rename(&old, credits, &handle); |
| 3271 | if (IS_ERR(whiteout)) | 3685 | if (IS_ERR(whiteout)) { |
| 3272 | return PTR_ERR(whiteout); | 3686 | retval = PTR_ERR(whiteout); |
| 3687 | whiteout = NULL; | ||
| 3688 | goto end_rename; | ||
| 3689 | } | ||
| 3273 | } | 3690 | } |
| 3274 | 3691 | ||
| 3275 | if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir)) | 3692 | if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir)) |
| @@ -3278,7 +3695,7 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 3278 | if (S_ISDIR(old.inode->i_mode)) { | 3695 | if (S_ISDIR(old.inode->i_mode)) { |
| 3279 | if (new.inode) { | 3696 | if (new.inode) { |
| 3280 | retval = -ENOTEMPTY; | 3697 | retval = -ENOTEMPTY; |
| 3281 | if (!empty_dir(new.inode)) | 3698 | if (!ext4_empty_dir(new.inode)) |
| 3282 | goto end_rename; | 3699 | goto end_rename; |
| 3283 | } else { | 3700 | } else { |
| 3284 | retval = -EMLINK; | 3701 | retval = -EMLINK; |
| @@ -3352,8 +3769,9 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 3352 | 3769 | ||
| 3353 | ext4_dec_count(handle, old.dir); | 3770 | ext4_dec_count(handle, old.dir); |
| 3354 | if (new.inode) { | 3771 | if (new.inode) { |
| 3355 | /* checked empty_dir above, can't have another parent, | 3772 | /* checked ext4_empty_dir above, can't have another |
| 3356 | * ext4_dec_count() won't work for many-linked dirs */ | 3773 | * parent, ext4_dec_count() won't work for many-linked |
| 3774 | * dirs */ | ||
| 3357 | clear_nlink(new.inode); | 3775 | clear_nlink(new.inode); |
| 3358 | } else { | 3776 | } else { |
| 3359 | ext4_inc_count(handle, new.dir); | 3777 | ext4_inc_count(handle, new.dir); |
| @@ -3433,8 +3851,11 @@ static int ext4_cross_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 3433 | handle = ext4_journal_start(old.dir, EXT4_HT_DIR, | 3851 | handle = ext4_journal_start(old.dir, EXT4_HT_DIR, |
| 3434 | (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) + | 3852 | (2 * EXT4_DATA_TRANS_BLOCKS(old.dir->i_sb) + |
| 3435 | 2 * EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2)); | 3853 | 2 * EXT4_INDEX_EXTRA_TRANS_BLOCKS + 2)); |
| 3436 | if (IS_ERR(handle)) | 3854 | if (IS_ERR(handle)) { |
| 3437 | return PTR_ERR(handle); | 3855 | retval = PTR_ERR(handle); |
| 3856 | handle = NULL; | ||
| 3857 | goto end_rename; | ||
| 3858 | } | ||
| 3438 | 3859 | ||
| 3439 | if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir)) | 3860 | if (IS_DIRSYNC(old.dir) || IS_DIRSYNC(new.dir)) |
| 3440 | ext4_handle_sync(handle); | 3861 | ext4_handle_sync(handle); |
