f2fs: fix not to allocate unnecessary blocks during fallocate
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 13 Jun 2014 04:07:31 +0000 (13:07 +0900)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 23 Jun 2014 01:05:08 +0000 (10:05 +0900)
This patch fixes the fallocate bug like below. (See xfstests/255)

In fallocate(fd, 0, 20480),
expand_inode_data processes
for (index = pg_start; index <= pg_end; index++) {
f2fs_reserve_block();
...
}

So, even though fallocate requests 20480, 5 blocks, f2fs allocates 6 blocks
including pg_end.
So, this patch adds one condition to avoid block allocation.

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

index f6c4bdaaae86c2500b8dbf5e3cef348f2c9585df..7d8b96275092a1109b1bfcb6f4bd07ef7d738f82 100644 (file)
@@ -664,11 +664,14 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
        for (index = pg_start; index <= pg_end; index++) {
                struct dnode_of_data dn;
 
+               if (index == pg_end && !off_end)
+                       goto noalloc;
+
                set_new_dnode(&dn, inode, NULL, NULL, 0);
                ret = f2fs_reserve_block(&dn, index);
                if (ret)
                        break;
-
+noalloc:
                if (pg_start == pg_end)
                        new_size = offset + len;
                else if (index == pg_start && off_start)