• Huajun Li's avatar
    f2fs: handle inline data operations · 9ffe0fb5
    Huajun Li authored
    Hook inline data read/write, truncate, fallocate, setattr, etc.
    
    Files need meet following 2 requirement to inline:
     1) file size is not greater than MAX_INLINE_DATA;
     2) file doesn't pre-allocate data blocks by fallocate().
    
    FI_INLINE_DATA will not be set while creating a new regular inode because
    most of the files are bigger than ~3.4K. Set FI_INLINE_DATA only when
    data is submitted to block layer, ranther than set it while creating a new
    inode, this also avoids converting data from inline to normal data block
    and vice versa.
    
    While writting inline data to inode block, the first data block should be
    released if the file has a block indexed by i_addr[0].
    
    On the other hand, when a file operation is appied to a file with inline
    data, we need to test if this file can remain inline by doing this
    operation, otherwise it should be convert into normal file by reserving
    a new data block, copying inline data to this new block and clear
    FI_INLINE_DATA flag. Because reserve a new data block here will make use
    of i_addr[0], if we save inline data in i_addr[0..872], then the first
    4 bytes would be overwriten. This problem can be avoided simply by
    not using i_addr[0] for inline data.
    Signed-off-by: default avatarHuajun Li <huajun.li@intel.com>
    Signed-off-by: default avatarHaicheng Li <haicheng.li@linux.intel.com>
    Signed-off-by: default avatarWeihong Xu <weihong.xu@intel.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
    9ffe0fb5
file.c 16.3 KB