@@ -88,8 +88,6 @@ void ext4_free_crypt_info(struct ext4_crypt_info *ci)
8888 if (!ci )
8989 return ;
9090
91- if (ci -> ci_keyring_key )
92- key_put (ci -> ci_keyring_key );
9391 crypto_free_ablkcipher (ci -> ci_ctfm );
9492 kmem_cache_free (ext4_crypt_info_cachep , ci );
9593}
@@ -111,7 +109,7 @@ void ext4_free_encryption_info(struct inode *inode,
111109 ext4_free_crypt_info (ci );
112110}
113111
114- int _ext4_get_encryption_info (struct inode * inode )
112+ int ext4_get_encryption_info (struct inode * inode )
115113{
116114 struct ext4_inode_info * ei = EXT4_I (inode );
117115 struct ext4_crypt_info * crypt_info ;
@@ -128,22 +126,15 @@ int _ext4_get_encryption_info(struct inode *inode)
128126 char mode ;
129127 int res ;
130128
129+ if (ei -> i_crypt_info )
130+ return 0 ;
131+
131132 if (!ext4_read_workqueue ) {
132133 res = ext4_init_crypto ();
133134 if (res )
134135 return res ;
135136 }
136137
137- retry :
138- crypt_info = ACCESS_ONCE (ei -> i_crypt_info );
139- if (crypt_info ) {
140- if (!crypt_info -> ci_keyring_key ||
141- key_validate (crypt_info -> ci_keyring_key ) == 0 )
142- return 0 ;
143- ext4_free_encryption_info (inode , crypt_info );
144- goto retry ;
145- }
146-
147138 res = ext4_xattr_get (inode , EXT4_XATTR_INDEX_ENCRYPTION ,
148139 EXT4_XATTR_NAME_ENCRYPTION_CONTEXT ,
149140 & ctx , sizeof (ctx ));
@@ -166,7 +157,6 @@ int _ext4_get_encryption_info(struct inode *inode)
166157 crypt_info -> ci_data_mode = ctx .contents_encryption_mode ;
167158 crypt_info -> ci_filename_mode = ctx .filenames_encryption_mode ;
168159 crypt_info -> ci_ctfm = NULL ;
169- crypt_info -> ci_keyring_key = NULL ;
170160 memcpy (crypt_info -> ci_master_key , ctx .master_key_descriptor ,
171161 sizeof (crypt_info -> ci_master_key ));
172162 if (S_ISREG (inode -> i_mode ))
@@ -206,7 +196,6 @@ int _ext4_get_encryption_info(struct inode *inode)
206196 keyring_key = NULL ;
207197 goto out ;
208198 }
209- crypt_info -> ci_keyring_key = keyring_key ;
210199 if (keyring_key -> type != & key_type_logon ) {
211200 printk_once (KERN_WARNING
212201 "ext4: key type must be logon\n" );
@@ -253,16 +242,13 @@ int _ext4_get_encryption_info(struct inode *inode)
253242 ext4_encryption_key_size (mode ));
254243 if (res )
255244 goto out ;
256- memzero_explicit (raw_key , sizeof (raw_key ));
257- if (cmpxchg (& ei -> i_crypt_info , NULL , crypt_info ) != NULL ) {
258- ext4_free_crypt_info (crypt_info );
259- goto retry ;
260- }
261- return 0 ;
262245
246+ if (cmpxchg (& ei -> i_crypt_info , NULL , crypt_info ) == NULL )
247+ crypt_info = NULL ;
263248out :
264249 if (res == - ENOKEY )
265250 res = 0 ;
251+ key_put (keyring_key );
266252 ext4_free_crypt_info (crypt_info );
267253 memzero_explicit (raw_key , sizeof (raw_key ));
268254 return res ;
0 commit comments