f2fs: should put a page beyond EOF when preparing a write
[linux-2.6-microblaze.git] / fs / f2fs / file.c
index d4fc5e0..f30b841 100644 (file)
@@ -31,6 +31,7 @@
 #include "xattr.h"
 #include "acl.h"
 #include "gc.h"
+#include "iostat.h"
 #include <trace/events/f2fs.h>
 #include <uapi/linux/f2fs.h>
 
@@ -262,8 +263,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
        };
        unsigned int seq_id = 0;
 
-       if (unlikely(f2fs_readonly(inode->i_sb) ||
-                               is_sbi_flag_set(sbi, SBI_CP_DISABLED)))
+       if (unlikely(f2fs_readonly(inode->i_sb)))
                return 0;
 
        trace_f2fs_sync_file_enter(inode);
@@ -277,7 +277,7 @@ static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
        ret = file_write_and_wait_range(file, start, end);
        clear_inode_flag(inode, FI_NEED_IPU);
 
-       if (ret) {
+       if (ret || is_sbi_flag_set(sbi, SBI_CP_DISABLED)) {
                trace_f2fs_sync_file_exit(inode, cp_reason, datasync, ret);
                return ret;
        }
@@ -1106,7 +1106,6 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
                }
 
                if (pg_start < pg_end) {
-                       struct address_space *mapping = inode->i_mapping;
                        loff_t blk_start, blk_end;
                        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
 
@@ -1118,8 +1117,7 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
                        down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
                        down_write(&F2FS_I(inode)->i_mmap_sem);
 
-                       truncate_inode_pages_range(mapping, blk_start,
-                                       blk_end - 1);
+                       truncate_pagecache_range(inode, blk_start, blk_end - 1);
 
                        f2fs_lock_op(sbi);
                        ret = f2fs_truncate_hole(inode, pg_start, pg_end);
@@ -3496,8 +3494,8 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
                released_blocks += ret;
        }
 
-       up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
        up_write(&F2FS_I(inode)->i_mmap_sem);
+       up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 out:
        inode_unlock(inode);
 
@@ -3649,8 +3647,8 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
                reserved_blocks += ret;
        }
 
-       up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
        up_write(&F2FS_I(inode)->i_mmap_sem);
+       up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 
        if (ret >= 0) {
                clear_inode_flag(inode, FI_COMPRESS_RELEASED);