f2fs: convert inline_data when i_size becomes large
authorJaegeuk Kim <jaegeuk@kernel.org>
Tue, 11 Nov 2014 22:10:01 +0000 (14:10 -0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 11 Nov 2014 22:16:12 +0000 (14:16 -0800)
If i_size becomes large outside of MAX_INLINE_DATA, we shoud convert the inode.
Otherwise, we can make some dirty pages during the truncation, and those pages
will be written through f2fs_write_data_page.
At that moment, the inode has still inline_data, so that it tries to write non-
zero pages into inline_data area.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c
fs/f2fs/inline.c

index edc3ce867e9c12430948ddc3f40f33a4cbaed00e..7c2ec3ebebe00f00c9f01fa112b87a37ac3b9720 100644 (file)
@@ -522,6 +522,12 @@ void f2fs_truncate(struct inode *inode)
 
        trace_f2fs_truncate(inode);
 
+       /* we should check inline_data size */
+       if (f2fs_has_inline_data(inode) && !f2fs_may_inline(inode)) {
+               if (f2fs_convert_inline_inode(inode))
+                       return;
+       }
+
        if (!truncate_blocks(inode, i_size_read(inode), true)) {
                inode->i_mtime = inode->i_ctime = CURRENT_TIME;
                mark_inode_dirty(inode);
index 231067027745eef540990a37b0e35d0996b18f13..053d114f0528d1104dcc8d384f1fcf9cb578519a 100644 (file)
@@ -24,6 +24,9 @@ bool f2fs_may_inline(struct inode *inode)
        if (!S_ISREG(inode->i_mode))
                return false;
 
+       if (i_size_read(inode) > MAX_INLINE_DATA)
+               return false;
+
        return true;
 }
 
This page took 0.03007 seconds and 5 git commands to generate.