Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a73f252 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: allocate blocks for pinned file



This patch allows fallocate to allocate physical blocks for pinned file.

Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent fd8ff0c6
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -744,3 +744,28 @@ algorithm.
In order to identify whether the data in the victim segment are valid or not,
F2FS manages a bitmap. Each bit represents the validity of a block, and the
bitmap is composed of a bit stream covering whole blocks in main area.

Fallocate(2) Policy
-------------------

The default policy follows the below posix rule.

Allocating disk space
    The default operation (i.e., mode is zero) of fallocate() allocates
    the disk space within the range specified by offset and len.  The
    file size (as reported by stat(2)) will be changed if offset+len is
    greater than the file size.  Any subregion within the range specified
    by offset and len that did not contain data before the call will be
    initialized to zero.  This default behavior closely resembles the
    behavior of the posix_fallocate(3) library function, and is intended
    as a method of optimally implementing that function.

However, once F2FS receives ioctl(fd, F2FS_IOC_SET_PIN_FILE) in prior to
fallocate(fd, DEFAULT_MODE), it allocates on-disk blocks addressess having
zero or random data, which is useful to the below scenario where:
 1. create(fd)
 2. ioctl(fd, F2FS_IOC_SET_PIN_FILE)
 3. fallocate(fd, 0, 0, size)
 4. address = fibmap(fd, offset)
 5. open(blkdev)
 6. write(blkdev, address)
+6 −1
Original line number Diff line number Diff line
@@ -1531,7 +1531,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;