ext4 crypto: implement the ext4 encryption write path
authorMichael Halcrow <mhalcrow@google.com>
Sun, 12 Apr 2015 04:55:10 +0000 (00:55 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 12 Apr 2015 04:55:10 +0000 (00:55 -0400)
Pulls block_write_begin() into fs/ext4/inode.c because it might need
to do a low-level read of the existing data, in which case we need to
decrypt it.

Signed-off-by: Michael Halcrow <mhalcrow@google.com>
Signed-off-by: Ildar Muslukhov <ildarm@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/extents.c
fs/ext4/ialloc.c
fs/ext4/inode.c
fs/ext4/page-io.c

index 74580ea..973816b 100644 (file)
@@ -3122,6 +3122,9 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex)
        ee_len    = ext4_ext_get_actual_len(ex);
        ee_pblock = ext4_ext_pblock(ex);
 
+       if (ext4_encrypted_inode(inode))
+               return ext4_encrypted_zeroout(inode, ex);
+
        ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS);
        if (ret > 0)
                ret = 0;
@@ -4898,6 +4901,20 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
        ext4_lblk_t lblk;
        unsigned int blkbits = inode->i_blkbits;
 
+       /*
+        * Encrypted inodes can't handle collapse range or insert
+        * range since we would need to re-encrypt blocks with a
+        * different IV or XTS tweak (which are based on the logical
+        * block number).
+        *
+        * XXX It's not clear why zero range isn't working, but we'll
+        * leave it disabled for encrypted inodes for now.  This is a
+        * bug we should fix....
+        */
+       if (ext4_encrypted_inode(inode) &&
+           (mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)))
+               return -EOPNOTSUPP;
+
        /* Return error if mode is not supported */
        if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE |
                     FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE))
Simple merge
diff --cc fs/ext4/inode.c
Simple merge
Simple merge