mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 22:14:04 +02:00
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: kernel test robot <oliver.sang@intel.com>
Fixes: 36e4d95891 ("f2fs: check if swapfile is section-alligned")
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
4c4dcb8c24
commit
2f998899f3
|
|
@ -3812,6 +3812,7 @@ static int f2fs_is_file_aligned(struct inode *inode)
|
||||||
block_t pblock;
|
block_t pblock;
|
||||||
unsigned long nr_pblocks;
|
unsigned long nr_pblocks;
|
||||||
unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
|
unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
|
||||||
|
unsigned int not_aligned = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
cur_lblock = 0;
|
cur_lblock = 0;
|
||||||
|
|
@ -3844,13 +3845,20 @@ static int f2fs_is_file_aligned(struct inode *inode)
|
||||||
|
|
||||||
if ((pblock - main_blkaddr) & (blocks_per_sec - 1) ||
|
if ((pblock - main_blkaddr) & (blocks_per_sec - 1) ||
|
||||||
nr_pblocks & (blocks_per_sec - 1)) {
|
nr_pblocks & (blocks_per_sec - 1)) {
|
||||||
f2fs_err(sbi, "Swapfile does not align to section");
|
if (f2fs_is_pinned_file(inode)) {
|
||||||
ret = -EINVAL;
|
f2fs_err(sbi, "Swapfile does not align to section");
|
||||||
goto out;
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
not_aligned++;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_lblock += nr_pblocks;
|
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:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
@ -3869,6 +3877,7 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
|
||||||
int nr_extents = 0;
|
int nr_extents = 0;
|
||||||
unsigned long nr_pblocks;
|
unsigned long nr_pblocks;
|
||||||
unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
|
unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
|
||||||
|
unsigned int not_aligned = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -3907,9 +3916,12 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
|
||||||
|
|
||||||
if ((pblock - SM_I(sbi)->main_blkaddr) & (blocks_per_sec - 1) ||
|
if ((pblock - SM_I(sbi)->main_blkaddr) & (blocks_per_sec - 1) ||
|
||||||
nr_pblocks & (blocks_per_sec - 1)) {
|
nr_pblocks & (blocks_per_sec - 1)) {
|
||||||
f2fs_err(sbi, "Swapfile does not align to section");
|
if (f2fs_is_pinned_file(inode)) {
|
||||||
ret = -EINVAL;
|
f2fs_err(sbi, "Swapfile does not align to section");
|
||||||
goto out;
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
not_aligned++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur_lblock + nr_pblocks >= sis->max)
|
if (cur_lblock + nr_pblocks >= sis->max)
|
||||||
|
|
@ -3938,6 +3950,11 @@ static int check_swap_activate_fast(struct swap_info_struct *sis,
|
||||||
sis->max = cur_lblock;
|
sis->max = cur_lblock;
|
||||||
sis->pages = cur_lblock - 1;
|
sis->pages = cur_lblock - 1;
|
||||||
sis->highest_bit = 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:
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user