file.c (29583dfcd2dd72c766422bd05c16f06c6b1fb356) | file.c (41e8f85a75fc60e1543e4903428a1b481b672a17) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/file.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 557 unchanged lines hidden (view full) --- 566 bool released = !atomic_read(&F2FS_I(dn->inode)->i_compr_blocks); 567 568 if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode)) 569 base = get_extra_isize(dn->inode); 570 571 raw_node = F2FS_NODE(dn->node_page); 572 addr = blkaddr_in_node(raw_node) + base + ofs; 573 | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/file.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 557 unchanged lines hidden (view full) --- 566 bool released = !atomic_read(&F2FS_I(dn->inode)->i_compr_blocks); 567 568 if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode)) 569 base = get_extra_isize(dn->inode); 570 571 raw_node = F2FS_NODE(dn->node_page); 572 addr = blkaddr_in_node(raw_node) + base + ofs; 573 |
574 /* Assumption: truncateion starts with cluster */ | 574 /* Assumption: truncation starts with cluster */ |
575 for (; count > 0; count--, addr++, dn->ofs_in_node++, cluster_index++) { 576 block_t blkaddr = le32_to_cpu(*addr); 577 578 if (f2fs_compressed_file(dn->inode) && 579 !(cluster_index & (cluster_size - 1))) { 580 if (compressed_cluster) 581 f2fs_i_compr_blocks_update(dn->inode, 582 valid_blocks, false); --- 1327 unchanged lines hidden (view full) --- 1910 return -EINVAL; 1911 } 1912 1913 if ((iflags ^ masked_flags) & F2FS_COMPR_FL) { 1914 if (masked_flags & F2FS_COMPR_FL) { 1915 if (!f2fs_disable_compressed_file(inode)) 1916 return -EINVAL; 1917 } else { | 575 for (; count > 0; count--, addr++, dn->ofs_in_node++, cluster_index++) { 576 block_t blkaddr = le32_to_cpu(*addr); 577 578 if (f2fs_compressed_file(dn->inode) && 579 !(cluster_index & (cluster_size - 1))) { 580 if (compressed_cluster) 581 f2fs_i_compr_blocks_update(dn->inode, 582 valid_blocks, false); --- 1327 unchanged lines hidden (view full) --- 1910 return -EINVAL; 1911 } 1912 1913 if ((iflags ^ masked_flags) & F2FS_COMPR_FL) { 1914 if (masked_flags & F2FS_COMPR_FL) { 1915 if (!f2fs_disable_compressed_file(inode)) 1916 return -EINVAL; 1917 } else { |
1918 /* try to convert inline_data to support compression */ 1919 int err = f2fs_convert_inline_inode(inode); 1920 if (err) 1921 return err; |
|
1918 if (!f2fs_may_compress(inode)) 1919 return -EINVAL; 1920 if (S_ISREG(inode->i_mode) && F2FS_HAS_BLOCKS(inode)) 1921 return -EINVAL; 1922 if (set_compress_context(inode)) 1923 return -EOPNOTSUPP; 1924 } 1925 } --- 99 unchanged lines hidden (view full) --- 2025 2026static int f2fs_ioc_getversion(struct file *filp, unsigned long arg) 2027{ 2028 struct inode *inode = file_inode(filp); 2029 2030 return put_user(inode->i_generation, (int __user *)arg); 2031} 2032 | 1922 if (!f2fs_may_compress(inode)) 1923 return -EINVAL; 1924 if (S_ISREG(inode->i_mode) && F2FS_HAS_BLOCKS(inode)) 1925 return -EINVAL; 1926 if (set_compress_context(inode)) 1927 return -EOPNOTSUPP; 1928 } 1929 } --- 99 unchanged lines hidden (view full) --- 2029 2030static int f2fs_ioc_getversion(struct file *filp, unsigned long arg) 2031{ 2032 struct inode *inode = file_inode(filp); 2033 2034 return put_user(inode->i_generation, (int __user *)arg); 2035} 2036 |
2033static int f2fs_ioc_start_atomic_write(struct file *filp) | 2037static int f2fs_ioc_start_atomic_write(struct file *filp, bool truncate) |
2034{ 2035 struct inode *inode = file_inode(filp); 2036 struct user_namespace *mnt_userns = file_mnt_user_ns(filp); 2037 struct f2fs_inode_info *fi = F2FS_I(inode); 2038 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 2039 struct inode *pinode; | 2038{ 2039 struct inode *inode = file_inode(filp); 2040 struct user_namespace *mnt_userns = file_mnt_user_ns(filp); 2041 struct f2fs_inode_info *fi = F2FS_I(inode); 2042 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 2043 struct inode *pinode; |
2044 loff_t isize; |
|
2040 int ret; 2041 2042 if (!inode_owner_or_capable(mnt_userns, inode)) 2043 return -EACCES; 2044 2045 if (!S_ISREG(inode->i_mode)) 2046 return -EINVAL; 2047 --- 42 unchanged lines hidden (view full) --- 2090 } 2091 2092 ret = f2fs_get_tmpfile(mnt_userns, pinode, &fi->cow_inode); 2093 iput(pinode); 2094 if (ret) { 2095 f2fs_up_write(&fi->i_gc_rwsem[WRITE]); 2096 goto out; 2097 } | 2045 int ret; 2046 2047 if (!inode_owner_or_capable(mnt_userns, inode)) 2048 return -EACCES; 2049 2050 if (!S_ISREG(inode->i_mode)) 2051 return -EINVAL; 2052 --- 42 unchanged lines hidden (view full) --- 2095 } 2096 2097 ret = f2fs_get_tmpfile(mnt_userns, pinode, &fi->cow_inode); 2098 iput(pinode); 2099 if (ret) { 2100 f2fs_up_write(&fi->i_gc_rwsem[WRITE]); 2101 goto out; 2102 } |
2098 f2fs_i_size_write(fi->cow_inode, i_size_read(inode)); | |
2099 | 2103 |
2104 f2fs_write_inode(inode, NULL); 2105 |
|
2100 stat_inc_atomic_inode(inode); 2101 2102 set_inode_flag(inode, FI_ATOMIC_FILE); 2103 set_inode_flag(fi->cow_inode, FI_COW_FILE); 2104 clear_inode_flag(fi->cow_inode, FI_INLINE_DATA); | 2106 stat_inc_atomic_inode(inode); 2107 2108 set_inode_flag(inode, FI_ATOMIC_FILE); 2109 set_inode_flag(fi->cow_inode, FI_COW_FILE); 2110 clear_inode_flag(fi->cow_inode, FI_INLINE_DATA); |
2111 2112 isize = i_size_read(inode); 2113 fi->original_i_size = isize; 2114 if (truncate) { 2115 set_inode_flag(inode, FI_ATOMIC_REPLACE); 2116 truncate_inode_pages_final(inode->i_mapping); 2117 f2fs_i_size_write(inode, 0); 2118 isize = 0; 2119 } 2120 f2fs_i_size_write(fi->cow_inode, isize); 2121 |
|
2105 f2fs_up_write(&fi->i_gc_rwsem[WRITE]); 2106 2107 f2fs_update_time(sbi, REQ_TIME); 2108 fi->atomic_write_task = current; 2109 stat_update_max_atomic_write(inode); 2110 fi->atomic_write_cnt = 0; 2111out: 2112 inode_unlock(inode); --- 15 unchanged lines hidden (view full) --- 2128 return ret; 2129 2130 f2fs_balance_fs(F2FS_I_SB(inode), true); 2131 2132 inode_lock(inode); 2133 2134 if (f2fs_is_atomic_file(inode)) { 2135 ret = f2fs_commit_atomic_write(inode); | 2122 f2fs_up_write(&fi->i_gc_rwsem[WRITE]); 2123 2124 f2fs_update_time(sbi, REQ_TIME); 2125 fi->atomic_write_task = current; 2126 stat_update_max_atomic_write(inode); 2127 fi->atomic_write_cnt = 0; 2128out: 2129 inode_unlock(inode); --- 15 unchanged lines hidden (view full) --- 2145 return ret; 2146 2147 f2fs_balance_fs(F2FS_I_SB(inode), true); 2148 2149 inode_lock(inode); 2150 2151 if (f2fs_is_atomic_file(inode)) { 2152 ret = f2fs_commit_atomic_write(inode); |
2136 if (ret) 2137 goto unlock_out; 2138 2139 ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | |
2140 if (!ret) | 2153 if (!ret) |
2141 f2fs_abort_atomic_write(inode, false); | 2154 ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); 2155 2156 f2fs_abort_atomic_write(inode, ret); |
2142 } else { 2143 ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false); 2144 } | 2157 } else { 2158 ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 1, false); 2159 } |
2145unlock_out: | 2160 |
2146 inode_unlock(inode); 2147 mnt_drop_write_file(filp); 2148 return ret; 2149} 2150 2151static int f2fs_ioc_abort_atomic_write(struct file *filp) 2152{ 2153 struct inode *inode = file_inode(filp); --- 1972 unchanged lines hidden (view full) --- 4126} 4127 4128static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 4129{ 4130 switch (cmd) { 4131 case FS_IOC_GETVERSION: 4132 return f2fs_ioc_getversion(filp, arg); 4133 case F2FS_IOC_START_ATOMIC_WRITE: | 2161 inode_unlock(inode); 2162 mnt_drop_write_file(filp); 2163 return ret; 2164} 2165 2166static int f2fs_ioc_abort_atomic_write(struct file *filp) 2167{ 2168 struct inode *inode = file_inode(filp); --- 1972 unchanged lines hidden (view full) --- 4141} 4142 4143static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 4144{ 4145 switch (cmd) { 4146 case FS_IOC_GETVERSION: 4147 return f2fs_ioc_getversion(filp, arg); 4148 case F2FS_IOC_START_ATOMIC_WRITE: |
4134 return f2fs_ioc_start_atomic_write(filp); | 4149 return f2fs_ioc_start_atomic_write(filp, false); 4150 case F2FS_IOC_START_ATOMIC_REPLACE: 4151 return f2fs_ioc_start_atomic_write(filp, true); |
4135 case F2FS_IOC_COMMIT_ATOMIC_WRITE: 4136 return f2fs_ioc_commit_atomic_write(filp); 4137 case F2FS_IOC_ABORT_ATOMIC_WRITE: 4138 return f2fs_ioc_abort_atomic_write(filp); 4139 case F2FS_IOC_START_VOLATILE_WRITE: 4140 case F2FS_IOC_RELEASE_VOLATILE_WRITE: 4141 return -EOPNOTSUPP; 4142 case F2FS_IOC_SHUTDOWN: --- 728 unchanged lines hidden --- | 4152 case F2FS_IOC_COMMIT_ATOMIC_WRITE: 4153 return f2fs_ioc_commit_atomic_write(filp); 4154 case F2FS_IOC_ABORT_ATOMIC_WRITE: 4155 return f2fs_ioc_abort_atomic_write(filp); 4156 case F2FS_IOC_START_VOLATILE_WRITE: 4157 case F2FS_IOC_RELEASE_VOLATILE_WRITE: 4158 return -EOPNOTSUPP; 4159 case F2FS_IOC_SHUTDOWN: --- 728 unchanged lines hidden --- |