From: Sheng Yong Date: Wed, 22 Nov 2017 10:23:39 +0000 (+0800) Subject: f2fs: still write data if preallocate only partial blocks X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=25006645d2e79422b6b3f26e5a82b6cbb5d49a0e;p=openwrt%2Fstaging%2Fblogic.git f2fs: still write data if preallocate only partial blocks 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 Reviewed-by: Chao Yu Signed-off-by: Jaegeuk Kim --- diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 516fa0d3ff9c..3fa20a932dd7 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -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; }