diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-05-15 19:26:10 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-03-18 00:19:33 -0400 |
commit | 0b81d0779072696371822e5ed9e7c6292e547024 (patch) | |
tree | c75412a642ee596fd33a392f0f353c4c1185f7f5 /fs/f2fs/dir.c | |
parent | 59692b7c71e4271b62bddce5bfd50b9e805a4a02 (diff) |
fs crypto: move per-file encryption from f2fs tree to fs/crypto
This patch adds the renamed functions moved from the f2fs crypto files.
1. definitions for per-file encryption used by ext4 and f2fs.
2. crypto.c for encrypt/decrypt functions
a. IO preparation:
- fscrypt_get_ctx / fscrypt_release_ctx
b. before IOs:
- fscrypt_encrypt_page
- fscrypt_decrypt_page
- fscrypt_zeroout_range
c. after IOs:
- fscrypt_decrypt_bio_pages
- fscrypt_pullback_bio_page
- fscrypt_restore_control_page
3. policy.c supporting context management.
a. For ioctls:
- fscrypt_process_policy
- fscrypt_get_policy
b. For context permission
- fscrypt_has_permitted_context
- fscrypt_inherit_context
4. keyinfo.c to handle permissions
- fscrypt_get_encryption_info
- fscrypt_free_encryption_info
5. fname.c to support filename encryption
a. general wrapper functions
- fscrypt_fname_disk_to_usr
- fscrypt_fname_usr_to_disk
- fscrypt_setup_filename
- fscrypt_free_filename
b. specific filename handling functions
- fscrypt_fname_alloc_buffer
- fscrypt_fname_free_buffer
6. Makefile and Kconfig
Cc: Al Viro <viro@ftp.linux.org.uk>
Signed-off-by: Michael Halcrow <mhalcrow@google.com>
Signed-off-by: Ildar Muslukhov <ildarm@google.com>
Signed-off-by: Uday Savagaonkar <savagaon@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs/dir.c')
-rw-r--r-- | fs/f2fs/dir.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index 8f09da0552ac..f82e28b121a8 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c | |||
@@ -77,7 +77,7 @@ static unsigned long dir_block_index(unsigned int level, | |||
77 | } | 77 | } |
78 | 78 | ||
79 | static struct f2fs_dir_entry *find_in_block(struct page *dentry_page, | 79 | static struct f2fs_dir_entry *find_in_block(struct page *dentry_page, |
80 | struct f2fs_filename *fname, | 80 | struct fscrypt_name *fname, |
81 | f2fs_hash_t namehash, | 81 | f2fs_hash_t namehash, |
82 | int *max_slots, | 82 | int *max_slots, |
83 | struct page **res_page) | 83 | struct page **res_page) |
@@ -103,15 +103,15 @@ static struct f2fs_dir_entry *find_in_block(struct page *dentry_page, | |||
103 | return de; | 103 | return de; |
104 | } | 104 | } |
105 | 105 | ||
106 | struct f2fs_dir_entry *find_target_dentry(struct f2fs_filename *fname, | 106 | struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *fname, |
107 | f2fs_hash_t namehash, int *max_slots, | 107 | f2fs_hash_t namehash, int *max_slots, |
108 | struct f2fs_dentry_ptr *d) | 108 | struct f2fs_dentry_ptr *d) |
109 | { | 109 | { |
110 | struct f2fs_dir_entry *de; | 110 | struct f2fs_dir_entry *de; |
111 | unsigned long bit_pos = 0; | 111 | unsigned long bit_pos = 0; |
112 | int max_len = 0; | 112 | int max_len = 0; |
113 | struct f2fs_str de_name = FSTR_INIT(NULL, 0); | 113 | struct fscrypt_str de_name = FSTR_INIT(NULL, 0); |
114 | struct f2fs_str *name = &fname->disk_name; | 114 | struct fscrypt_str *name = &fname->disk_name; |
115 | 115 | ||
116 | if (max_slots) | 116 | if (max_slots) |
117 | *max_slots = 0; | 117 | *max_slots = 0; |
@@ -157,7 +157,7 @@ found: | |||
157 | 157 | ||
158 | static struct f2fs_dir_entry *find_in_level(struct inode *dir, | 158 | static struct f2fs_dir_entry *find_in_level(struct inode *dir, |
159 | unsigned int level, | 159 | unsigned int level, |
160 | struct f2fs_filename *fname, | 160 | struct fscrypt_name *fname, |
161 | struct page **res_page) | 161 | struct page **res_page) |
162 | { | 162 | { |
163 | struct qstr name = FSTR_TO_QSTR(&fname->disk_name); | 163 | struct qstr name = FSTR_TO_QSTR(&fname->disk_name); |
@@ -218,12 +218,12 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir, | |||
218 | struct f2fs_dir_entry *de = NULL; | 218 | struct f2fs_dir_entry *de = NULL; |
219 | unsigned int max_depth; | 219 | unsigned int max_depth; |
220 | unsigned int level; | 220 | unsigned int level; |
221 | struct f2fs_filename fname; | 221 | struct fscrypt_name fname; |
222 | int err; | 222 | int err; |
223 | 223 | ||
224 | *res_page = NULL; | 224 | *res_page = NULL; |
225 | 225 | ||
226 | err = f2fs_fname_setup_filename(dir, child, 1, &fname); | 226 | err = fscrypt_setup_filename(dir, child, 1, &fname); |
227 | if (err) | 227 | if (err) |
228 | return NULL; | 228 | return NULL; |
229 | 229 | ||
@@ -251,7 +251,7 @@ struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir, | |||
251 | break; | 251 | break; |
252 | } | 252 | } |
253 | out: | 253 | out: |
254 | f2fs_fname_free_filename(&fname); | 254 | fscrypt_free_filename(&fname); |
255 | return de; | 255 | return de; |
256 | } | 256 | } |
257 | 257 | ||
@@ -413,7 +413,7 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir, | |||
413 | goto put_error; | 413 | goto put_error; |
414 | 414 | ||
415 | if (f2fs_encrypted_inode(dir) && f2fs_may_encrypt(inode)) { | 415 | if (f2fs_encrypted_inode(dir) && f2fs_may_encrypt(inode)) { |
416 | err = f2fs_inherit_context(dir, inode, page); | 416 | err = fscrypt_inherit_context(dir, inode, page, false); |
417 | if (err) | 417 | if (err) |
418 | goto put_error; | 418 | goto put_error; |
419 | } | 419 | } |
@@ -536,11 +536,11 @@ int __f2fs_add_link(struct inode *dir, const struct qstr *name, | |||
536 | struct f2fs_dentry_block *dentry_blk = NULL; | 536 | struct f2fs_dentry_block *dentry_blk = NULL; |
537 | struct f2fs_dentry_ptr d; | 537 | struct f2fs_dentry_ptr d; |
538 | struct page *page = NULL; | 538 | struct page *page = NULL; |
539 | struct f2fs_filename fname; | 539 | struct fscrypt_name fname; |
540 | struct qstr new_name; | 540 | struct qstr new_name; |
541 | int slots, err; | 541 | int slots, err; |
542 | 542 | ||
543 | err = f2fs_fname_setup_filename(dir, name, 0, &fname); | 543 | err = fscrypt_setup_filename(dir, name, 0, &fname); |
544 | if (err) | 544 | if (err) |
545 | return err; | 545 | return err; |
546 | 546 | ||
@@ -639,7 +639,7 @@ fail: | |||
639 | kunmap(dentry_page); | 639 | kunmap(dentry_page); |
640 | f2fs_put_page(dentry_page, 1); | 640 | f2fs_put_page(dentry_page, 1); |
641 | out: | 641 | out: |
642 | f2fs_fname_free_filename(&fname); | 642 | fscrypt_free_filename(&fname); |
643 | f2fs_update_time(F2FS_I_SB(dir), REQ_TIME); | 643 | f2fs_update_time(F2FS_I_SB(dir), REQ_TIME); |
644 | return err; | 644 | return err; |
645 | } | 645 | } |
@@ -781,12 +781,12 @@ bool f2fs_empty_dir(struct inode *dir) | |||
781 | } | 781 | } |
782 | 782 | ||
783 | bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, | 783 | bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, |
784 | unsigned int start_pos, struct f2fs_str *fstr) | 784 | unsigned int start_pos, struct fscrypt_str *fstr) |
785 | { | 785 | { |
786 | unsigned char d_type = DT_UNKNOWN; | 786 | unsigned char d_type = DT_UNKNOWN; |
787 | unsigned int bit_pos; | 787 | unsigned int bit_pos; |
788 | struct f2fs_dir_entry *de = NULL; | 788 | struct f2fs_dir_entry *de = NULL; |
789 | struct f2fs_str de_name = FSTR_INIT(NULL, 0); | 789 | struct fscrypt_str de_name = FSTR_INIT(NULL, 0); |
790 | 790 | ||
791 | bit_pos = ((unsigned long)ctx->pos % d->max); | 791 | bit_pos = ((unsigned long)ctx->pos % d->max); |
792 | 792 | ||
@@ -820,8 +820,9 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, | |||
820 | 820 | ||
821 | memcpy(de_name.name, d->filename[bit_pos], de_name.len); | 821 | memcpy(de_name.name, d->filename[bit_pos], de_name.len); |
822 | 822 | ||
823 | ret = f2fs_fname_disk_to_usr(d->inode, &de->hash_code, | 823 | ret = fscrypt_fname_disk_to_usr(d->inode, |
824 | &de_name, fstr); | 824 | (u32)de->hash_code, 0, |
825 | &de_name, fstr); | ||
825 | kfree(de_name.name); | 826 | kfree(de_name.name); |
826 | if (ret < 0) | 827 | if (ret < 0) |
827 | return true; | 828 | return true; |
@@ -849,16 +850,15 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx) | |||
849 | struct file_ra_state *ra = &file->f_ra; | 850 | struct file_ra_state *ra = &file->f_ra; |
850 | unsigned int n = ((unsigned long)ctx->pos / NR_DENTRY_IN_BLOCK); | 851 | unsigned int n = ((unsigned long)ctx->pos / NR_DENTRY_IN_BLOCK); |
851 | struct f2fs_dentry_ptr d; | 852 | struct f2fs_dentry_ptr d; |
852 | struct f2fs_str fstr = FSTR_INIT(NULL, 0); | 853 | struct fscrypt_str fstr = FSTR_INIT(NULL, 0); |
853 | int err = 0; | 854 | int err = 0; |
854 | 855 | ||
855 | if (f2fs_encrypted_inode(inode)) { | 856 | if (f2fs_encrypted_inode(inode)) { |
856 | err = f2fs_get_encryption_info(inode); | 857 | err = fscrypt_get_encryption_info(inode); |
857 | if (err) | 858 | if (err) |
858 | return err; | 859 | return err; |
859 | 860 | ||
860 | err = f2fs_fname_crypto_alloc_buffer(inode, F2FS_NAME_LEN, | 861 | err = fscrypt_fname_alloc_buffer(inode, F2FS_NAME_LEN, &fstr); |
861 | &fstr); | ||
862 | if (err < 0) | 862 | if (err < 0) |
863 | return err; | 863 | return err; |
864 | } | 864 | } |
@@ -898,14 +898,14 @@ static int f2fs_readdir(struct file *file, struct dir_context *ctx) | |||
898 | f2fs_put_page(dentry_page, 1); | 898 | f2fs_put_page(dentry_page, 1); |
899 | } | 899 | } |
900 | out: | 900 | out: |
901 | f2fs_fname_crypto_free_buffer(&fstr); | 901 | fscrypt_fname_free_buffer(&fstr); |
902 | return err; | 902 | return err; |
903 | } | 903 | } |
904 | 904 | ||
905 | static int f2fs_dir_open(struct inode *inode, struct file *filp) | 905 | static int f2fs_dir_open(struct inode *inode, struct file *filp) |
906 | { | 906 | { |
907 | if (f2fs_encrypted_inode(inode)) | 907 | if (f2fs_encrypted_inode(inode)) |
908 | return f2fs_get_encryption_info(inode) ? -EACCES : 0; | 908 | return fscrypt_get_encryption_info(inode) ? -EACCES : 0; |
909 | return 0; | 909 | return 0; |
910 | } | 910 | } |
911 | 911 | ||