On 2019/6/28 10:15, Jaegeuk Kim wrote: > On 06/28, Chao Yu wrote: >> Hi Jaegeuk, >> >> On 2019/6/28 1:05, Jaegeuk Kim wrote: >>> This patch allows fallocate to allocate physical blocks for pinned file. >> >> Quoted from manual of fallocate(2): >> " >> Any subregion within the range specified by offset and len that did not >> contain >> data before the call will be initialized to zero. >> >> If the FALLOC_FL_KEEP_SIZE flag is specified in mode .... Preallocating >> zeroed blocks beyond the end of the file in this manner is useful for >> optimizing >> append workloads. >> " >> >> As quoted description, our change may break the rule of fallocate(, mode = >> 0), >> because with after this change, we can't guarantee that preallocated physical >> block contains zeroed data >> >> Should we introduce an additional ioctl for this case? Or maybe add one more >> flag in fallocate() for unzeroed block preallocation, not sure. > > I thought like that, but this is a very corner case for the pinned file only > in > f2fs. And, the pinned file is also indeed used by this purpose.
Okay, I think we need to find one place to document such behavior that is not matching regular poxis fallocate's sematic, user should be noticed about it. Thanks, > > Thanks, > >> >> Thanks, >> >>> >>> Signed-off-by: Jaegeuk Kim <[email protected]> >>> --- >>> fs/f2fs/file.c | 7 ++++++- >>> 1 file changed, 6 insertions(+), 1 deletion(-) >>> >>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c >>> index e7c368db8185..cdfd4338682d 100644 >>> --- a/fs/f2fs/file.c >>> +++ b/fs/f2fs/file.c >>> @@ -1528,7 +1528,12 @@ static int expand_inode_data(struct inode *inode, >>> loff_t offset, >>> if (off_end) >>> map.m_len++; >>> >>> - err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_AIO); >>> + if (f2fs_is_pinned_file(inode)) >>> + map.m_seg_type = CURSEG_COLD_DATA; >>> + >>> + err = f2fs_map_blocks(inode, &map, 1, (f2fs_is_pinned_file(inode) ? >>> + F2FS_GET_BLOCK_PRE_DIO : >>> + F2FS_GET_BLOCK_PRE_AIO)); >>> if (err) { >>> pgoff_t last_off; >>> >>> > . >
