diff options
Diffstat (limited to 'fs/ecryptfs/inode.c')
-rw-r--r-- | fs/ecryptfs/inode.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 2717329..28f09c7 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -269,10 +269,43 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry) ecryptfs_dentry->d_name.name, rc); goto out; } +#ifdef CONFIG_WTL_ENCRYPTION_FILTER + mutex_lock(&crypt_stat->cs_mutex); + if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { + struct dentry *fp_dentry = + ecryptfs_inode_to_private(ecryptfs_dentry->d_inode) + ->lower_file->f_dentry; + struct ecryptfs_mount_crypt_stat *mount_crypt_stat = + &ecryptfs_superblock_to_private(ecryptfs_dentry->d_sb) + ->mount_crypt_stat; + char filename[NAME_MAX+1] = {0}; + if (fp_dentry->d_name.len <= NAME_MAX) + memcpy(filename, fp_dentry->d_name.name, + fp_dentry->d_name.len + 1); + + if ((mount_crypt_stat->flags & ECRYPTFS_ENABLE_NEW_PASSTHROUGH) + || ((mount_crypt_stat->flags & ECRYPTFS_ENABLE_FILTERING) && + (is_file_name_match(mount_crypt_stat, fp_dentry) || + is_file_ext_match(mount_crypt_stat, filename)))) { + crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED + | ECRYPTFS_ENCRYPTED); + ecryptfs_put_lower_file(ecryptfs_dentry->d_inode); + } else { + rc = ecryptfs_write_metadata(ecryptfs_dentry); + if (rc) + printk( + KERN_ERR "Error writing headers; rc = [%d]\n" + , rc); + ecryptfs_put_lower_file(ecryptfs_dentry->d_inode); + } + } + mutex_unlock(&crypt_stat->cs_mutex); +#else rc = ecryptfs_write_metadata(ecryptfs_dentry); if (rc) printk(KERN_ERR "Error writing headers; rc = [%d]\n", rc); ecryptfs_put_lower_file(ecryptfs_dentry->d_inode); +#endif out: return rc; } |