Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

f2fs: kill volatile write support

There's no user, since all can use atomic writes simply.
Let's kill it.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

+10 -157
+1 -3
fs/f2fs/checkpoint.c
··· 1004 1004 return; 1005 1005 1006 1006 set_inode_flag(inode, flag); 1007 - if (!f2fs_is_volatile_file(inode)) 1008 - list_add_tail(&F2FS_I(inode)->dirty_list, 1009 - &sbi->inode_list[type]); 1007 + list_add_tail(&F2FS_I(inode)->dirty_list, &sbi->inode_list[type]); 1010 1008 stat_inc_dirty_inode(sbi, type); 1011 1009 } 1012 1010
-5
fs/f2fs/data.c
··· 2741 2741 write: 2742 2742 if (f2fs_is_drop_cache(inode)) 2743 2743 goto out; 2744 - /* we should not write 0'th page having journal header */ 2745 - if (f2fs_is_volatile_file(inode) && (!page->index || 2746 - (!wbc->for_reclaim && 2747 - f2fs_available_free_memory(sbi, BASE_CHECK)))) 2748 - goto redirty_out; 2749 2744 2750 2745 /* Dentry/quota blocks are controlled by checkpoint */ 2751 2746 if (S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) {
+2 -8
fs/f2fs/debug.c
··· 92 92 si->nquota_files = sbi->nquota_files; 93 93 si->ndirty_all = sbi->ndirty_inode[DIRTY_META]; 94 94 si->aw_cnt = sbi->atomic_files; 95 - si->vw_cnt = atomic_read(&sbi->vw_cnt); 96 95 si->max_aw_cnt = atomic_read(&sbi->max_aw_cnt); 97 - si->max_vw_cnt = atomic_read(&sbi->max_vw_cnt); 98 96 si->nr_dio_read = get_pages(sbi, F2FS_DIO_READ); 99 97 si->nr_dio_write = get_pages(sbi, F2FS_DIO_WRITE); 100 98 si->nr_wb_cp_data = get_pages(sbi, F2FS_WB_CP_DATA); ··· 509 511 si->flush_list_empty, 510 512 si->nr_discarding, si->nr_discarded, 511 513 si->nr_discard_cmd, si->undiscard_blks); 512 - seq_printf(s, " - atomic IO: %4d (Max. %4d), " 513 - "volatile IO: %4d (Max. %4d)\n", 514 - si->aw_cnt, si->max_aw_cnt, 515 - si->vw_cnt, si->max_vw_cnt); 514 + seq_printf(s, " - atomic IO: %4d (Max. %4d)\n", 515 + si->aw_cnt, si->max_aw_cnt); 516 516 seq_printf(s, " - compress: %4d, hit:%8d\n", si->compress_pages, si->compress_page_hit); 517 517 seq_printf(s, " - nodes: %4d in %4d\n", 518 518 si->ndirty_node, si->node_pages); ··· 611 615 for (i = META_CP; i < META_MAX; i++) 612 616 atomic_set(&sbi->meta_count[i], 0); 613 617 614 - atomic_set(&sbi->vw_cnt, 0); 615 618 atomic_set(&sbi->max_aw_cnt, 0); 616 - atomic_set(&sbi->max_vw_cnt, 0); 617 619 618 620 raw_spin_lock_irqsave(&f2fs_stat_lock, flags); 619 621 list_add_tail(&si->stat_list, &f2fs_stat_list);
+2 -25
fs/f2fs/f2fs.h
··· 737 737 FI_UPDATE_WRITE, /* inode has in-place-update data */ 738 738 FI_NEED_IPU, /* used for ipu per file */ 739 739 FI_ATOMIC_FILE, /* indicate atomic file */ 740 - FI_VOLATILE_FILE, /* indicate volatile file */ 741 740 FI_FIRST_BLOCK_WRITTEN, /* indicate #0 data block was written */ 742 741 FI_DROP_CACHE, /* drop dirty page cache */ 743 742 FI_DATA_EXIST, /* indicate data exists */ ··· 1737 1738 atomic_t inline_dir; /* # of inline_dentry inodes */ 1738 1739 atomic_t compr_inode; /* # of compressed inodes */ 1739 1740 atomic64_t compr_blocks; /* # of compressed blocks */ 1740 - atomic_t vw_cnt; /* # of volatile writes */ 1741 1741 atomic_t max_aw_cnt; /* max # of atomic writes */ 1742 - atomic_t max_vw_cnt; /* max # of volatile writes */ 1743 1742 unsigned int io_skip_bggc; /* skip background gc for in-flight IO */ 1744 1743 unsigned int other_skip_bggc; /* skip background gc for other reasons */ 1745 1744 unsigned int ndirty_inode[NR_INODE_TYPE]; /* # of dirty inodes */ ··· 3188 3191 return is_inode_flag_set(inode, FI_ATOMIC_FILE); 3189 3192 } 3190 3193 3191 - static inline bool f2fs_is_volatile_file(struct inode *inode) 3192 - { 3193 - return is_inode_flag_set(inode, FI_VOLATILE_FILE); 3194 - } 3195 - 3196 3194 static inline bool f2fs_is_first_block_written(struct inode *inode) 3197 3195 { 3198 3196 return is_inode_flag_set(inode, FI_FIRST_BLOCK_WRITTEN); ··· 3807 3815 int inline_xattr, inline_inode, inline_dir, append, update, orphans; 3808 3816 int compr_inode; 3809 3817 unsigned long long compr_blocks; 3810 - int aw_cnt, max_aw_cnt, vw_cnt, max_vw_cnt; 3818 + int aw_cnt, max_aw_cnt; 3811 3819 unsigned int valid_count, valid_node_count, valid_inode_count, discard_blks; 3812 3820 unsigned int bimodal, avg_vblocks; 3813 3821 int util_free, util_valid, util_invalid; ··· 3918 3926 if (cur > max) \ 3919 3927 atomic_set(&F2FS_I_SB(inode)->max_aw_cnt, cur); \ 3920 3928 } while (0) 3921 - #define stat_inc_volatile_write(inode) \ 3922 - (atomic_inc(&F2FS_I_SB(inode)->vw_cnt)) 3923 - #define stat_dec_volatile_write(inode) \ 3924 - (atomic_dec(&F2FS_I_SB(inode)->vw_cnt)) 3925 - #define stat_update_max_volatile_write(inode) \ 3926 - do { \ 3927 - int cur = atomic_read(&F2FS_I_SB(inode)->vw_cnt); \ 3928 - int max = atomic_read(&F2FS_I_SB(inode)->max_vw_cnt); \ 3929 - if (cur > max) \ 3930 - atomic_set(&F2FS_I_SB(inode)->max_vw_cnt, cur); \ 3931 - } while (0) 3932 3929 #define stat_inc_seg_count(sbi, type, gc_type) \ 3933 3930 do { \ 3934 3931 struct f2fs_stat_info *si = F2FS_STAT(sbi); \ ··· 3979 3998 #define stat_add_compr_blocks(inode, blocks) do { } while (0) 3980 3999 #define stat_sub_compr_blocks(inode, blocks) do { } while (0) 3981 4000 #define stat_update_max_atomic_write(inode) do { } while (0) 3982 - #define stat_inc_volatile_write(inode) do { } while (0) 3983 - #define stat_dec_volatile_write(inode) do { } while (0) 3984 - #define stat_update_max_volatile_write(inode) do { } while (0) 3985 4001 #define stat_inc_meta_count(sbi, blkaddr) do { } while (0) 3986 4002 #define stat_inc_seg_type(sbi, curseg) do { } while (0) 3987 4003 #define stat_inc_block_count(sbi, curseg) do { } while (0) ··· 4381 4403 static inline bool f2fs_may_compress(struct inode *inode) 4382 4404 { 4383 4405 if (IS_SWAPFILE(inode) || f2fs_is_pinned_file(inode) || 4384 - f2fs_is_atomic_file(inode) || 4385 - f2fs_is_volatile_file(inode)) 4406 + f2fs_is_atomic_file(inode)) 4386 4407 return false; 4387 4408 return S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode); 4388 4409 }
+3 -113
fs/f2fs/file.c
··· 1815 1815 1816 1816 if (f2fs_is_atomic_file(inode)) 1817 1817 f2fs_abort_atomic_write(inode, true); 1818 - if (f2fs_is_volatile_file(inode)) { 1819 - set_inode_flag(inode, FI_DROP_CACHE); 1820 - filemap_fdatawrite(inode->i_mapping); 1821 - clear_inode_flag(inode, FI_DROP_CACHE); 1822 - clear_inode_flag(inode, FI_VOLATILE_FILE); 1823 - stat_dec_volatile_write(inode); 1824 - } 1825 1818 return 0; 1826 1819 } 1827 1820 ··· 2089 2096 2090 2097 inode_lock(inode); 2091 2098 2092 - if (f2fs_is_volatile_file(inode)) { 2093 - ret = -EINVAL; 2094 - goto err_out; 2095 - } 2096 - 2097 2099 if (f2fs_is_atomic_file(inode)) { 2098 2100 ret = f2fs_commit_atomic_write(inode); 2099 2101 if (ret) 2100 - goto err_out; 2102 + goto unlock_out; 2101 2103 2102 2104 ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); 2103 2105 if (!ret) ··· 2100 2112 } else { 2101 2113 ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false); 2102 2114 } 2103 - err_out: 2115 + unlock_out: 2104 2116 inode_unlock(inode); 2105 2117 mnt_drop_write_file(filp); 2106 - return ret; 2107 - } 2108 - 2109 - static int f2fs_ioc_start_volatile_write(struct file *filp) 2110 - { 2111 - struct inode *inode = file_inode(filp); 2112 - struct user_namespace *mnt_userns = file_mnt_user_ns(filp); 2113 - int ret; 2114 - 2115 - if (!inode_owner_or_capable(mnt_userns, inode)) 2116 - return -EACCES; 2117 - 2118 - if (!S_ISREG(inode->i_mode)) 2119 - return -EINVAL; 2120 - 2121 - ret = mnt_want_write_file(filp); 2122 - if (ret) 2123 - return ret; 2124 - 2125 - inode_lock(inode); 2126 - 2127 - if (f2fs_is_volatile_file(inode)) 2128 - goto out; 2129 - 2130 - ret = f2fs_convert_inline_inode(inode); 2131 - if (ret) 2132 - goto out; 2133 - 2134 - stat_inc_volatile_write(inode); 2135 - stat_update_max_volatile_write(inode); 2136 - 2137 - set_inode_flag(inode, FI_VOLATILE_FILE); 2138 - f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); 2139 - out: 2140 - inode_unlock(inode); 2141 - mnt_drop_write_file(filp); 2142 - return ret; 2143 - } 2144 - 2145 - static int f2fs_ioc_release_volatile_write(struct file *filp) 2146 - { 2147 - struct inode *inode = file_inode(filp); 2148 - struct user_namespace *mnt_userns = file_mnt_user_ns(filp); 2149 - int ret; 2150 - 2151 - if (!inode_owner_or_capable(mnt_userns, inode)) 2152 - return -EACCES; 2153 - 2154 - ret = mnt_want_write_file(filp); 2155 - if (ret) 2156 - return ret; 2157 - 2158 - inode_lock(inode); 2159 - 2160 - if (!f2fs_is_volatile_file(inode)) 2161 - goto out; 2162 - 2163 - if (!f2fs_is_first_block_written(inode)) { 2164 - ret = truncate_partial_data_page(inode, 0, true); 2165 - goto out; 2166 - } 2167 - 2168 - ret = punch_hole(inode, 0, F2FS_BLKSIZE); 2169 - out: 2170 - inode_unlock(inode); 2171 - mnt_drop_write_file(filp); 2172 - return ret; 2173 - } 2174 - 2175 - static int f2fs_ioc_abort_volatile_write(struct file *filp) 2176 - { 2177 - struct inode *inode = file_inode(filp); 2178 - struct user_namespace *mnt_userns = file_mnt_user_ns(filp); 2179 - int ret; 2180 - 2181 - if (!inode_owner_or_capable(mnt_userns, inode)) 2182 - return -EACCES; 2183 - 2184 - ret = mnt_want_write_file(filp); 2185 - if (ret) 2186 - return ret; 2187 - 2188 - inode_lock(inode); 2189 - 2190 - if (f2fs_is_atomic_file(inode)) 2191 - f2fs_abort_atomic_write(inode, true); 2192 - if (f2fs_is_volatile_file(inode)) { 2193 - clear_inode_flag(inode, FI_VOLATILE_FILE); 2194 - stat_dec_volatile_write(inode); 2195 - ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); 2196 - } 2197 - 2198 - inode_unlock(inode); 2199 - 2200 - mnt_drop_write_file(filp); 2201 - f2fs_update_time(F2FS_I_SB(inode), REQ_TIME); 2202 2118 return ret; 2203 2119 } 2204 2120 ··· 4043 4151 case F2FS_IOC_COMMIT_ATOMIC_WRITE: 4044 4152 return f2fs_ioc_commit_atomic_write(filp); 4045 4153 case F2FS_IOC_START_VOLATILE_WRITE: 4046 - return f2fs_ioc_start_volatile_write(filp); 4047 4154 case F2FS_IOC_RELEASE_VOLATILE_WRITE: 4048 - return f2fs_ioc_release_volatile_write(filp); 4049 4155 case F2FS_IOC_ABORT_VOLATILE_WRITE: 4050 - return f2fs_ioc_abort_volatile_write(filp); 4156 + return -EOPNOTSUPP; 4051 4157 case F2FS_IOC_SHUTDOWN: 4052 4158 return f2fs_ioc_shutdown(filp, arg); 4053 4159 case FITRIM:
+1 -2
fs/f2fs/segment.c
··· 3166 3166 return CURSEG_COLD_DATA; 3167 3167 if (file_is_hot(inode) || 3168 3168 is_inode_flag_set(inode, FI_HOT_DATA) || 3169 - f2fs_is_atomic_file(inode) || 3170 - f2fs_is_volatile_file(inode)) 3169 + f2fs_is_atomic_file(inode)) 3171 3170 return CURSEG_HOT_DATA; 3172 3171 return f2fs_rw_hint_to_seg_type(inode->i_write_hint); 3173 3172 } else {
+1 -1
fs/f2fs/verity.c
··· 128 128 if (f2fs_verity_in_progress(inode)) 129 129 return -EBUSY; 130 130 131 - if (f2fs_is_atomic_file(inode) || f2fs_is_volatile_file(inode)) 131 + if (f2fs_is_atomic_file(inode)) 132 132 return -EOPNOTSUPP; 133 133 134 134 /*