]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
f2fs: still write data if preallocate only partial blocks
authorSheng Yong <shengyong1@huawei.com>
Wed, 22 Nov 2017 10:23:39 +0000 (18:23 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 3 Jan 2018 03:27:27 +0000 (19:27 -0800)
If there is not enough space left, f2fs_preallocate_blocks may only
preallocte partial blocks. As a result, the write operation fails
but i_blocks is not 0.  To avoid this, f2fs should write data in
non-preallocation way and write as many data as the size of i_blocks.

Signed-off-by: Sheng Yong <shengyong1@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c

index 516fa0d3ff9c944c9d2c49d93dde87b8f1ea8be0..3fa20a932dd77ac8801d0179f2efb35cd54f5cfc 100644 (file)
@@ -862,8 +862,14 @@ int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from)
                if (err)
                        return err;
        }
-       if (!f2fs_has_inline_data(inode))
-               return f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+       if (!f2fs_has_inline_data(inode)) {
+               err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO);
+               if (map.m_len > 0 && err == -ENOSPC) {
+                       set_inode_flag(inode, FI_NO_PREALLOC);
+                       err = 0;
+               }
+               return err;
+       }
        return err;
 }