Commit ca298241 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: avoid swapon failure by giving a warning first



The final solution can be migrating blocks to form a section-aligned file
internally. Meanwhile, let's ask users to do that when preparing the swap
file initially like:
1) create()
2) ioctl(F2FS_IOC_SET_PIN_FILE)
3) fallocate()

Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
Fixes: 36e4d958 ("f2fs: check if swapfile is section-alligned")
Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 8bfbfb0d
Loading
Loading
Loading
Loading
+23 −6
Original line number Diff line number Diff line
@@ -3801,6 +3801,7 @@ static int f2fs_is_file_aligned(struct inode *inode)
	block_t pblock;
	unsigned long nr_pblocks;
	unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
	unsigned int not_aligned = 0;
	int ret = 0;

	cur_lblock = 0;
@@ -3833,13 +3834,20 @@ static int f2fs_is_file_aligned(struct inode *inode)

		if ((pblock - main_blkaddr) & (blocks_per_sec - 1) ||
			nr_pblocks & (blocks_per_sec - 1)) {
			if (f2fs_is_pinned_file(inode)) {
				f2fs_err(sbi, "Swapfile does not align to section");
				ret = -EINVAL;
				goto out;
			}
			not_aligned++;
		}

		cur_lblock += nr_pblocks;
	}
	if (not_aligned)
		f2fs_warn(sbi, "Swapfile (%u) is not align to section: \n"
			"\t1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate()",
			not_aligned);
out:
	return ret;
}
@@ -3858,6 +3866,7 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
	int nr_extents = 0;
	unsigned long nr_pblocks;
	unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
	unsigned int not_aligned = 0;
	int ret = 0;

	/*
@@ -3896,10 +3905,13 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,

		if ((pblock - SM_I(sbi)->main_blkaddr) & (blocks_per_sec - 1) ||
				nr_pblocks & (blocks_per_sec - 1)) {
			if (f2fs_is_pinned_file(inode)) {
				f2fs_err(sbi, "Swapfile does not align to section");
				ret = -EINVAL;
				goto out;
			}
			not_aligned++;
		}

		if (cur_lblock + nr_pblocks >= sis->max)
			nr_pblocks = sis->max - cur_lblock;
@@ -3927,6 +3939,11 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
	sis->max = cur_lblock;
	sis->pages = cur_lblock - 1;
	sis->highest_bit = cur_lblock - 1;

	if (not_aligned)
		f2fs_warn(sbi, "Swapfile (%u) is not align to section: \n"
			"\t1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate()",
			not_aligned);
out:
	return ret;
}