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 ---