summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJan Kara <jack@suse.com>2015-12-07 15:09:35 -0500
committerTheodore Ts'o <tytso@mit.edu>2015-12-07 15:09:35 -0500
commit53085fac02d12fcd29a9cb074ec480ff0f77ae5c (patch)
tree52b3a182a397ee36470e44b5deb4633f67c1478b /fs
parent2dcba4781fa3842e28f47ab23056d58cd283fca6 (diff)
ext4: provide ext4_issue_zeroout()
Create new function ext4_issue_zeroout() to zeroout contiguous (both logically and physically) part of inode data. We will need to issue zeroout when extent structure is not readily available and this function will allow us to do it without making up fake extent structures. Signed-off-by: Jan Kara <jack@suse.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/crypto.c6
-rw-r--r--fs/ext4/ext4.h5
-rw-r--r--fs/ext4/extents.c12
-rw-r--r--fs/ext4/inode.c15
4 files changed, 23 insertions, 15 deletions
diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c
index 1a0835073663..c8021208a7eb 100644
--- a/fs/ext4/crypto.c
+++ b/fs/ext4/crypto.c
@@ -384,14 +384,12 @@ int ext4_decrypt(struct page *page)
384 EXT4_DECRYPT, page->index, page, page); 384 EXT4_DECRYPT, page->index, page, page);
385} 385}
386 386
387int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex) 387int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk,
388 ext4_fsblk_t pblk, ext4_lblk_t len)
388{ 389{
389 struct ext4_crypto_ctx *ctx; 390 struct ext4_crypto_ctx *ctx;
390 struct page *ciphertext_page = NULL; 391 struct page *ciphertext_page = NULL;
391 struct bio *bio; 392 struct bio *bio;
392 ext4_lblk_t lblk = le32_to_cpu(ex->ee_block);
393 ext4_fsblk_t pblk = ext4_ext_pblock(ex);
394 unsigned int len = ext4_ext_get_actual_len(ex);
395 int ret, err = 0; 393 int ret, err = 0;
396 394
397#if 0 395#if 0
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 1008caf3136d..ffc6ab000c78 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2241,7 +2241,8 @@ void ext4_restore_control_page(struct page *data_page);
2241struct page *ext4_encrypt(struct inode *inode, 2241struct page *ext4_encrypt(struct inode *inode,
2242 struct page *plaintext_page); 2242 struct page *plaintext_page);
2243int ext4_decrypt(struct page *page); 2243int ext4_decrypt(struct page *page);
2244int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex); 2244int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk,
2245 ext4_fsblk_t pblk, ext4_lblk_t len);
2245 2246
2246#ifdef CONFIG_EXT4_FS_ENCRYPTION 2247#ifdef CONFIG_EXT4_FS_ENCRYPTION
2247int ext4_init_crypto(void); 2248int ext4_init_crypto(void);
@@ -2495,6 +2496,8 @@ extern int ext4_filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
2495extern qsize_t *ext4_get_reserved_space(struct inode *inode); 2496extern qsize_t *ext4_get_reserved_space(struct inode *inode);
2496extern void ext4_da_update_reserve_space(struct inode *inode, 2497extern void ext4_da_update_reserve_space(struct inode *inode,
2497 int used, int quota_claim); 2498 int used, int quota_claim);
2499extern int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk,
2500 ext4_fsblk_t pblk, ext4_lblk_t len);
2498 2501
2499/* indirect.c */ 2502/* indirect.c */
2500extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, 2503extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 3578b25fccfd..867e98b6bc6c 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3119,19 +3119,11 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex)
3119{ 3119{
3120 ext4_fsblk_t ee_pblock; 3120 ext4_fsblk_t ee_pblock;
3121 unsigned int ee_len; 3121 unsigned int ee_len;
3122 int ret;
3123 3122
3124 ee_len = ext4_ext_get_actual_len(ex); 3123 ee_len = ext4_ext_get_actual_len(ex);
3125 ee_pblock = ext4_ext_pblock(ex); 3124 ee_pblock = ext4_ext_pblock(ex);
3126 3125 return ext4_issue_zeroout(inode, le32_to_cpu(ex->ee_block), ee_pblock,
3127 if (ext4_encrypted_inode(inode)) 3126 ee_len);
3128 return ext4_encrypted_zeroout(inode, ex);
3129
3130 ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS);
3131 if (ret > 0)
3132 ret = 0;
3133
3134 return ret;
3135} 3127}
3136 3128
3137/* 3129/*
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index f100c1780e03..0c9a5ee3e106 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -383,6 +383,21 @@ static int __check_block_validity(struct inode *inode, const char *func,
383 return 0; 383 return 0;
384} 384}
385 385
386int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk,
387 ext4_lblk_t len)
388{
389 int ret;
390
391 if (ext4_encrypted_inode(inode))
392 return ext4_encrypted_zeroout(inode, lblk, pblk, len);
393
394 ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS);
395 if (ret > 0)
396 ret = 0;
397
398 return ret;
399}
400
386#define check_block_validity(inode, map) \ 401#define check_block_validity(inode, map) \
387 __check_block_validity((inode), __func__, __LINE__, (map)) 402 __check_block_validity((inode), __func__, __LINE__, (map))
388 403