data.c (0b8fc00601c0d8bea19667bbc66f00e13d954e4a) data.c (859fca6b706e005f7cf19aa2ce7bb4005bcef427)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/data.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 2458 unchanged lines hidden (view full) ---

2467 !f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
2468 return true;
2469
2470 return false;
2471}
2472
2473bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio)
2474{
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/data.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 2458 unchanged lines hidden (view full) ---

2467 !f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
2468 return true;
2469
2470 return false;
2471}
2472
2473bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio)
2474{
2475 /* swap file is migrating in aligned write mode */
2476 if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
2477 return false;
2478
2475 if (f2fs_is_pinned_file(inode))
2476 return true;
2477
2478 /* if this is cold file, we should overwrite to avoid fragmentation */
2479 if (file_is_cold(inode))
2480 return true;
2481
2482 return check_inplace_update_policy(inode, fio);

--- 6 unchanged lines hidden (view full) ---

2489 if (f2fs_lfs_mode(sbi))
2490 return true;
2491 if (S_ISDIR(inode->i_mode))
2492 return true;
2493 if (IS_NOQUOTA(inode))
2494 return true;
2495 if (f2fs_is_atomic_file(inode))
2496 return true;
2479 if (f2fs_is_pinned_file(inode))
2480 return true;
2481
2482 /* if this is cold file, we should overwrite to avoid fragmentation */
2483 if (file_is_cold(inode))
2484 return true;
2485
2486 return check_inplace_update_policy(inode, fio);

--- 6 unchanged lines hidden (view full) ---

2493 if (f2fs_lfs_mode(sbi))
2494 return true;
2495 if (S_ISDIR(inode->i_mode))
2496 return true;
2497 if (IS_NOQUOTA(inode))
2498 return true;
2499 if (f2fs_is_atomic_file(inode))
2500 return true;
2501
2502 /* swap file is migrating in aligned write mode */
2503 if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
2504 return true;
2505
2497 if (fio) {
2498 if (page_private_gcing(fio->page))
2499 return true;
2500 if (page_private_dummy(fio->page))
2501 return true;
2502 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
2503 f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
2504 return true;

--- 1320 unchanged lines hidden (view full) ---

3825 else
3826 migrate_page_states(newpage, page);
3827
3828 return MIGRATEPAGE_SUCCESS;
3829}
3830#endif
3831
3832#ifdef CONFIG_SWAP
2506 if (fio) {
2507 if (page_private_gcing(fio->page))
2508 return true;
2509 if (page_private_dummy(fio->page))
2510 return true;
2511 if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
2512 f2fs_is_checkpointed_data(sbi, fio->old_blkaddr)))
2513 return true;

--- 1320 unchanged lines hidden (view full) ---

3834 else
3835 migrate_page_states(newpage, page);
3836
3837 return MIGRATEPAGE_SUCCESS;
3838}
3839#endif
3840
3841#ifdef CONFIG_SWAP
3842static int f2fs_migrate_blocks(struct inode *inode, block_t start_blk,
3843 unsigned int blkcnt)
3844{
3845 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3846 unsigned int blkofs;
3847 unsigned int blk_per_sec = BLKS_PER_SEC(sbi);
3848 unsigned int secidx = start_blk / blk_per_sec;
3849 unsigned int end_sec = secidx + blkcnt / blk_per_sec;
3850 int ret = 0;
3851
3852 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3853 down_write(&F2FS_I(inode)->i_mmap_sem);
3854
3855 set_inode_flag(inode, FI_ALIGNED_WRITE);
3856
3857 for (; secidx < end_sec; secidx++) {
3858 down_write(&sbi->pin_sem);
3859
3860 f2fs_lock_op(sbi);
3861 f2fs_allocate_new_section(sbi, CURSEG_COLD_DATA_PINNED, false);
3862 f2fs_unlock_op(sbi);
3863
3864 set_inode_flag(inode, FI_DO_DEFRAG);
3865
3866 for (blkofs = 0; blkofs < blk_per_sec; blkofs++) {
3867 struct page *page;
3868 unsigned int blkidx = secidx * blk_per_sec + blkofs;
3869
3870 page = f2fs_get_lock_data_page(inode, blkidx, true);
3871 if (IS_ERR(page)) {
3872 up_write(&sbi->pin_sem);
3873 ret = PTR_ERR(page);
3874 goto done;
3875 }
3876
3877 set_page_dirty(page);
3878 f2fs_put_page(page, 1);
3879 }
3880
3881 clear_inode_flag(inode, FI_DO_DEFRAG);
3882
3883 ret = filemap_fdatawrite(inode->i_mapping);
3884
3885 up_write(&sbi->pin_sem);
3886
3887 if (ret)
3888 break;
3889 }
3890
3891done:
3892 clear_inode_flag(inode, FI_DO_DEFRAG);
3893 clear_inode_flag(inode, FI_ALIGNED_WRITE);
3894
3895 up_write(&F2FS_I(inode)->i_mmap_sem);
3896 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3897
3898 return ret;
3899}
3900
3833static int check_swap_activate(struct swap_info_struct *sis,
3834 struct file *swap_file, sector_t *span)
3835{
3836 struct address_space *mapping = swap_file->f_mapping;
3837 struct inode *inode = mapping->host;
3838 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3839 sector_t cur_lblock;
3840 sector_t last_lblock;
3841 sector_t pblock;
3842 sector_t lowest_pblock = -1;
3843 sector_t highest_pblock = 0;
3844 int nr_extents = 0;
3845 unsigned long nr_pblocks;
3901static int check_swap_activate(struct swap_info_struct *sis,
3902 struct file *swap_file, sector_t *span)
3903{
3904 struct address_space *mapping = swap_file->f_mapping;
3905 struct inode *inode = mapping->host;
3906 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3907 sector_t cur_lblock;
3908 sector_t last_lblock;
3909 sector_t pblock;
3910 sector_t lowest_pblock = -1;
3911 sector_t highest_pblock = 0;
3912 int nr_extents = 0;
3913 unsigned long nr_pblocks;
3846 unsigned int blocks_per_sec = BLKS_PER_SEC(sbi);
3914 unsigned int blks_per_sec = BLKS_PER_SEC(sbi);
3915 unsigned int sec_blks_mask = BLKS_PER_SEC(sbi) - 1;
3847 unsigned int not_aligned = 0;
3848 int ret = 0;
3849
3850 /*
3851 * Map all the blocks into the extent list. This code doesn't try
3852 * to be very smart.
3853 */
3854 cur_lblock = 0;
3855 last_lblock = bytes_to_blks(inode, i_size_read(inode));
3856
3857 while (cur_lblock < last_lblock && cur_lblock < sis->max) {
3858 struct f2fs_map_blocks map;
3916 unsigned int not_aligned = 0;
3917 int ret = 0;
3918
3919 /*
3920 * Map all the blocks into the extent list. This code doesn't try
3921 * to be very smart.
3922 */
3923 cur_lblock = 0;
3924 last_lblock = bytes_to_blks(inode, i_size_read(inode));
3925
3926 while (cur_lblock < last_lblock && cur_lblock < sis->max) {
3927 struct f2fs_map_blocks map;
3859
3928retry:
3860 cond_resched();
3861
3862 memset(&map, 0, sizeof(map));
3863 map.m_lblk = cur_lblock;
3864 map.m_len = last_lblock - cur_lblock;
3865 map.m_next_pgofs = NULL;
3866 map.m_next_extent = NULL;
3867 map.m_seg_type = NO_CHECK_TYPE;

--- 8 unchanged lines hidden (view full) ---

3876 f2fs_err(sbi, "Swapfile has holes");
3877 ret = -EINVAL;
3878 goto out;
3879 }
3880
3881 pblock = map.m_pblk;
3882 nr_pblocks = map.m_len;
3883
3929 cond_resched();
3930
3931 memset(&map, 0, sizeof(map));
3932 map.m_lblk = cur_lblock;
3933 map.m_len = last_lblock - cur_lblock;
3934 map.m_next_pgofs = NULL;
3935 map.m_next_extent = NULL;
3936 map.m_seg_type = NO_CHECK_TYPE;

--- 8 unchanged lines hidden (view full) ---

3945 f2fs_err(sbi, "Swapfile has holes");
3946 ret = -EINVAL;
3947 goto out;
3948 }
3949
3950 pblock = map.m_pblk;
3951 nr_pblocks = map.m_len;
3952
3884 if ((pblock - SM_I(sbi)->main_blkaddr) & (blocks_per_sec - 1) ||
3885 nr_pblocks & (blocks_per_sec - 1)) {
3886 if (f2fs_is_pinned_file(inode)) {
3887 f2fs_err(sbi, "Swapfile does not align to section");
3888 ret = -EINVAL;
3889 goto out;
3890 }
3953 if ((pblock - SM_I(sbi)->main_blkaddr) & sec_blks_mask ||
3954 nr_pblocks & sec_blks_mask) {
3891 not_aligned++;
3955 not_aligned++;
3892 }
3893
3956
3957 nr_pblocks = roundup(nr_pblocks, blks_per_sec);
3958 if (cur_lblock + nr_pblocks > sis->max)
3959 nr_pblocks -= blks_per_sec;
3960
3961 if (!nr_pblocks) {
3962 /* this extent is last one */
3963 nr_pblocks = map.m_len;
3964 f2fs_warn(sbi, "Swapfile: last extent is not aligned to section");
3965 goto next;
3966 }
3967
3968 ret = f2fs_migrate_blocks(inode, cur_lblock,
3969 nr_pblocks);
3970 if (ret)
3971 goto out;
3972 goto retry;
3973 }
3974next:
3894 if (cur_lblock + nr_pblocks >= sis->max)
3895 nr_pblocks = sis->max - cur_lblock;
3896
3897 if (cur_lblock) { /* exclude the header page */
3898 if (pblock < lowest_pblock)
3899 lowest_pblock = pblock;
3900 if (pblock + nr_pblocks - 1 > highest_pblock)
3901 highest_pblock = pblock + nr_pblocks - 1;

--- 10 unchanged lines hidden (view full) ---

3912 }
3913 ret = nr_extents;
3914 *span = 1 + highest_pblock - lowest_pblock;
3915 if (cur_lblock == 0)
3916 cur_lblock = 1; /* force Empty message */
3917 sis->max = cur_lblock;
3918 sis->pages = cur_lblock - 1;
3919 sis->highest_bit = cur_lblock - 1;
3975 if (cur_lblock + nr_pblocks >= sis->max)
3976 nr_pblocks = sis->max - cur_lblock;
3977
3978 if (cur_lblock) { /* exclude the header page */
3979 if (pblock < lowest_pblock)
3980 lowest_pblock = pblock;
3981 if (pblock + nr_pblocks - 1 > highest_pblock)
3982 highest_pblock = pblock + nr_pblocks - 1;

--- 10 unchanged lines hidden (view full) ---

3993 }
3994 ret = nr_extents;
3995 *span = 1 + highest_pblock - lowest_pblock;
3996 if (cur_lblock == 0)
3997 cur_lblock = 1; /* force Empty message */
3998 sis->max = cur_lblock;
3999 sis->pages = cur_lblock - 1;
4000 sis->highest_bit = cur_lblock - 1;
3920
3921 if (not_aligned)
3922 f2fs_warn(sbi, "Swapfile (%u) is not align to section: 1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate()",
3923 not_aligned);
3924out:
4001out:
4002 if (not_aligned)
4003 f2fs_warn(sbi, "Swapfile (%u) is not align to section: 1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate(%u * N)",
4004 not_aligned, blks_per_sec * F2FS_BLKSIZE);
3925 return ret;
3926}
3927
3928static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
3929 sector_t *span)
3930{
3931 struct inode *inode = file_inode(file);
3932 int ret;

--- 139 unchanged lines hidden ---
4005 return ret;
4006}
4007
4008static int f2fs_swap_activate(struct swap_info_struct *sis, struct file *file,
4009 sector_t *span)
4010{
4011 struct inode *inode = file_inode(file);
4012 int ret;

--- 139 unchanged lines hidden ---