f2fs: compress: fix reserve_cblocks counting error when out of space
[linux-2.6-microblaze.git] / fs / f2fs / file.c
index 74c5e48..dc9c6ba 100644 (file)
@@ -3624,10 +3624,10 @@ out:
        return ret;
 }
 
-static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
+static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,
+               unsigned int *reserved_blocks)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
-       unsigned int reserved_blocks = 0;
        int cluster_size = F2FS_I(dn->inode)->i_cluster_size;
        block_t blkaddr;
        int i;
@@ -3691,12 +3691,12 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
 
                f2fs_i_compr_blocks_update(dn->inode, compr_blocks, true);
 
-               reserved_blocks += reserved;
+               *reserved_blocks += reserved;
 next:
                count -= cluster_size;
        }
 
-       return reserved_blocks;
+       return 0;
 }
 
 static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
@@ -3757,7 +3757,7 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
                count = min(end_offset - dn.ofs_in_node, last_idx - page_idx);
                count = round_up(count, F2FS_I(inode)->i_cluster_size);
 
-               ret = reserve_compress_blocks(&dn, count);
+               ret = reserve_compress_blocks(&dn, count, &reserved_blocks);
 
                f2fs_put_dnode(&dn);
 
@@ -3765,13 +3765,12 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
                        break;
 
                page_idx += count;
-               reserved_blocks += ret;
        }
 
        filemap_invalidate_unlock(inode->i_mapping);
        f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
 
-       if (ret >= 0) {
+       if (!ret) {
                clear_inode_flag(inode, FI_COMPRESS_RELEASED);
                inode_set_ctime_current(inode);
                f2fs_mark_inode_dirty_sync(inode, true);
@@ -3780,7 +3779,7 @@ unlock_inode:
        inode_unlock(inode);
        mnt_drop_write_file(filp);
 
-       if (ret >= 0) {
+       if (!ret) {
                ret = put_user(reserved_blocks, (u64 __user *)arg);
        } else if (reserved_blocks &&
                        atomic_read(&F2FS_I(inode)->i_compr_blocks)) {