Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
[deliverable/linux.git] / fs / ext4 / symlink.c
index 75ed5c2f0c167b1169a9008fbfdd2e33fd80eb83..4d83d9e05f2e84197640b2aaa0215cfea8214381 100644 (file)
 #include "ext4.h"
 #include "xattr.h"
 
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
 static const char *ext4_encrypted_get_link(struct dentry *dentry,
                                           struct inode *inode,
                                           struct delayed_call *done)
 {
        struct page *cpage = NULL;
        char *caddr, *paddr = NULL;
-       struct ext4_str cstr, pstr;
-       struct ext4_encrypted_symlink_data *sd;
+       struct fscrypt_str cstr, pstr;
+       struct fscrypt_symlink_data *sd;
        loff_t size = min_t(loff_t, i_size_read(inode), PAGE_SIZE - 1);
        int res;
-       u32 plen, max_size = inode->i_sb->s_blocksize;
+       u32 max_size = inode->i_sb->s_blocksize;
 
        if (!dentry)
                return ERR_PTR(-ECHILD);
 
-       res = ext4_get_encryption_info(inode);
+       res = fscrypt_get_encryption_info(inode);
        if (res)
                return ERR_PTR(res);
 
@@ -54,30 +53,27 @@ static const char *ext4_encrypted_get_link(struct dentry *dentry,
        }
 
        /* Symlink is encrypted */
-       sd = (struct ext4_encrypted_symlink_data *)caddr;
+       sd = (struct fscrypt_symlink_data *)caddr;
        cstr.name = sd->encrypted_path;
        cstr.len  = le16_to_cpu(sd->len);
-       if ((cstr.len +
-            sizeof(struct ext4_encrypted_symlink_data) - 1) >
-           max_size) {
+       if ((cstr.len + sizeof(struct fscrypt_symlink_data) - 1) > max_size) {
                /* Symlink data on the disk is corrupted */
                res = -EFSCORRUPTED;
                goto errout;
        }
-       plen = (cstr.len < EXT4_FNAME_CRYPTO_DIGEST_SIZE*2) ?
-               EXT4_FNAME_CRYPTO_DIGEST_SIZE*2 : cstr.len;
-       paddr = kmalloc(plen + 1, GFP_NOFS);
-       if (!paddr) {
-               res = -ENOMEM;
+
+       res = fscrypt_fname_alloc_buffer(inode, cstr.len, &pstr);
+       if (res)
                goto errout;
-       }
-       pstr.name = paddr;
-       pstr.len = plen;
-       res = _ext4_fname_disk_to_usr(inode, NULL, &cstr, &pstr);
+
+       res = fscrypt_fname_disk_to_usr(inode, 0, 0, &cstr, &pstr);
        if (res < 0)
                goto errout;
+
+       paddr = pstr.name;
+
        /* Null-terminate the name */
-       if (res <= plen)
+       if (res <= pstr.len)
                paddr[res] = '\0';
        if (cpage)
                put_page(cpage);
@@ -99,7 +95,6 @@ const struct inode_operations ext4_encrypted_symlink_inode_operations = {
        .listxattr      = ext4_listxattr,
        .removexattr    = generic_removexattr,
 };
-#endif
 
 const struct inode_operations ext4_symlink_inode_operations = {
        .readlink       = generic_readlink,
This page took 0.026979 seconds and 5 git commands to generate.