file.c (1d1df41c5a33359a00e919d54eaebfb789711fdc) file.c (e4544b63a7ee49e7fbebf35ece0a6acd3b9617ae)
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>

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

232 return ret;
233}
234
235static void try_to_fix_pino(struct inode *inode)
236{
237 struct f2fs_inode_info *fi = F2FS_I(inode);
238 nid_t pino;
239
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>

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

232 return ret;
233}
234
235static void try_to_fix_pino(struct inode *inode)
236{
237 struct f2fs_inode_info *fi = F2FS_I(inode);
238 nid_t pino;
239
240 down_write(&fi->i_sem);
240 f2fs_down_write(&fi->i_sem);
241 if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
242 get_parent_ino(inode, &pino)) {
243 f2fs_i_pino_write(inode, pino);
244 file_got_pino(inode);
245 }
241 if (file_wrong_pino(inode) && inode->i_nlink == 1 &&
242 get_parent_ino(inode, &pino)) {
243 f2fs_i_pino_write(inode, pino);
244 file_got_pino(inode);
245 }
246 up_write(&fi->i_sem);
246 f2fs_up_write(&fi->i_sem);
247}
248
249static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
250 int datasync, bool atomic)
251{
252 struct inode *inode = file->f_mapping->host;
253 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
254 nid_t ino = inode->i_ino;

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

313 FSYNC_MODE_STRICT && !atomic)
314 atomic = true;
315 }
316go_write:
317 /*
318 * Both of fdatasync() and fsync() are able to be recovered from
319 * sudden-power-off.
320 */
247}
248
249static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
250 int datasync, bool atomic)
251{
252 struct inode *inode = file->f_mapping->host;
253 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
254 nid_t ino = inode->i_ino;

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

313 FSYNC_MODE_STRICT && !atomic)
314 atomic = true;
315 }
316go_write:
317 /*
318 * Both of fdatasync() and fsync() are able to be recovered from
319 * sudden-power-off.
320 */
321 down_read(&F2FS_I(inode)->i_sem);
321 f2fs_down_read(&F2FS_I(inode)->i_sem);
322 cp_reason = need_do_checkpoint(inode);
322 cp_reason = need_do_checkpoint(inode);
323 up_read(&F2FS_I(inode)->i_sem);
323 f2fs_up_read(&F2FS_I(inode)->i_sem);
324
325 if (cp_reason) {
326 /* all the dirty node pages should be flushed for POR */
327 ret = f2fs_sync_fs(inode->i_sb, 1);
328
329 /*
330 * We've secured consistency through sync_fs. Following pino
331 * will be used only for fsynced inodes after checkpoint.

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

953 * should convert inline inode before i_size_write to
954 * keep smaller than inline_data size with inline flag.
955 */
956 err = f2fs_convert_inline_inode(inode);
957 if (err)
958 return err;
959 }
960
324
325 if (cp_reason) {
326 /* all the dirty node pages should be flushed for POR */
327 ret = f2fs_sync_fs(inode->i_sb, 1);
328
329 /*
330 * We've secured consistency through sync_fs. Following pino
331 * will be used only for fsynced inodes after checkpoint.

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

953 * should convert inline inode before i_size_write to
954 * keep smaller than inline_data size with inline flag.
955 */
956 err = f2fs_convert_inline_inode(inode);
957 if (err)
958 return err;
959 }
960
961 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
961 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
962 filemap_invalidate_lock(inode->i_mapping);
963
964 truncate_setsize(inode, attr->ia_size);
965
966 if (attr->ia_size <= old_size)
967 err = f2fs_truncate(inode);
968 /*
969 * do not trim all blocks after i_size if target size is
970 * larger than i_size.
971 */
972 filemap_invalidate_unlock(inode->i_mapping);
962 filemap_invalidate_lock(inode->i_mapping);
963
964 truncate_setsize(inode, attr->ia_size);
965
966 if (attr->ia_size <= old_size)
967 err = f2fs_truncate(inode);
968 /*
969 * do not trim all blocks after i_size if target size is
970 * larger than i_size.
971 */
972 filemap_invalidate_unlock(inode->i_mapping);
973 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
973 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
974 if (err)
975 return err;
976
977 spin_lock(&F2FS_I(inode)->i_size_lock);
978 inode->i_mtime = inode->i_ctime = current_time(inode);
979 F2FS_I(inode)->last_disk_size = i_size_read(inode);
980 spin_unlock(&F2FS_I(inode)->i_size_lock);
981 }

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

1107 loff_t blk_start, blk_end;
1108 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1109
1110 f2fs_balance_fs(sbi, true);
1111
1112 blk_start = (loff_t)pg_start << PAGE_SHIFT;
1113 blk_end = (loff_t)pg_end << PAGE_SHIFT;
1114
974 if (err)
975 return err;
976
977 spin_lock(&F2FS_I(inode)->i_size_lock);
978 inode->i_mtime = inode->i_ctime = current_time(inode);
979 F2FS_I(inode)->last_disk_size = i_size_read(inode);
980 spin_unlock(&F2FS_I(inode)->i_size_lock);
981 }

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

1107 loff_t blk_start, blk_end;
1108 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1109
1110 f2fs_balance_fs(sbi, true);
1111
1112 blk_start = (loff_t)pg_start << PAGE_SHIFT;
1113 blk_end = (loff_t)pg_end << PAGE_SHIFT;
1114
1115 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1115 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1116 filemap_invalidate_lock(inode->i_mapping);
1117
1118 truncate_pagecache_range(inode, blk_start, blk_end - 1);
1119
1120 f2fs_lock_op(sbi);
1121 ret = f2fs_truncate_hole(inode, pg_start, pg_end);
1122 f2fs_unlock_op(sbi);
1123
1124 filemap_invalidate_unlock(inode->i_mapping);
1116 filemap_invalidate_lock(inode->i_mapping);
1117
1118 truncate_pagecache_range(inode, blk_start, blk_end - 1);
1119
1120 f2fs_lock_op(sbi);
1121 ret = f2fs_truncate_hole(inode, pg_start, pg_end);
1122 f2fs_unlock_op(sbi);
1123
1124 filemap_invalidate_unlock(inode->i_mapping);
1125 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1125 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1126 }
1127 }
1128
1129 return ret;
1130}
1131
1132static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
1133 int *do_replace, pgoff_t off, pgoff_t len)

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

1350 pgoff_t nrpages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
1351 pgoff_t start = offset >> PAGE_SHIFT;
1352 pgoff_t end = (offset + len) >> PAGE_SHIFT;
1353 int ret;
1354
1355 f2fs_balance_fs(sbi, true);
1356
1357 /* avoid gc operation during block exchange */
1126 }
1127 }
1128
1129 return ret;
1130}
1131
1132static int __read_out_blkaddrs(struct inode *inode, block_t *blkaddr,
1133 int *do_replace, pgoff_t off, pgoff_t len)

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

1350 pgoff_t nrpages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
1351 pgoff_t start = offset >> PAGE_SHIFT;
1352 pgoff_t end = (offset + len) >> PAGE_SHIFT;
1353 int ret;
1354
1355 f2fs_balance_fs(sbi, true);
1356
1357 /* avoid gc operation during block exchange */
1358 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1358 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1359 filemap_invalidate_lock(inode->i_mapping);
1360
1361 f2fs_lock_op(sbi);
1362 f2fs_drop_extent_tree(inode);
1363 truncate_pagecache(inode, offset);
1364 ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true);
1365 f2fs_unlock_op(sbi);
1366
1367 filemap_invalidate_unlock(inode->i_mapping);
1359 filemap_invalidate_lock(inode->i_mapping);
1360
1361 f2fs_lock_op(sbi);
1362 f2fs_drop_extent_tree(inode);
1363 truncate_pagecache(inode, offset);
1364 ret = __exchange_data_block(inode, inode, end, start, nrpages - end, true);
1365 f2fs_unlock_op(sbi);
1366
1367 filemap_invalidate_unlock(inode->i_mapping);
1368 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1368 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1369 return ret;
1370}
1371
1372static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
1373{
1374 loff_t new_size;
1375 int ret;
1376

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

1495 (loff_t)pg_start << PAGE_SHIFT);
1496 }
1497
1498 for (index = pg_start; index < pg_end;) {
1499 struct dnode_of_data dn;
1500 unsigned int end_offset;
1501 pgoff_t end;
1502
1369 return ret;
1370}
1371
1372static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len)
1373{
1374 loff_t new_size;
1375 int ret;
1376

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

1495 (loff_t)pg_start << PAGE_SHIFT);
1496 }
1497
1498 for (index = pg_start; index < pg_end;) {
1499 struct dnode_of_data dn;
1500 unsigned int end_offset;
1501 pgoff_t end;
1502
1503 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1503 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1504 filemap_invalidate_lock(mapping);
1505
1506 truncate_pagecache_range(inode,
1507 (loff_t)index << PAGE_SHIFT,
1508 ((loff_t)pg_end << PAGE_SHIFT) - 1);
1509
1510 f2fs_lock_op(sbi);
1511
1512 set_new_dnode(&dn, inode, NULL, NULL, 0);
1513 ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE);
1514 if (ret) {
1515 f2fs_unlock_op(sbi);
1516 filemap_invalidate_unlock(mapping);
1504 filemap_invalidate_lock(mapping);
1505
1506 truncate_pagecache_range(inode,
1507 (loff_t)index << PAGE_SHIFT,
1508 ((loff_t)pg_end << PAGE_SHIFT) - 1);
1509
1510 f2fs_lock_op(sbi);
1511
1512 set_new_dnode(&dn, inode, NULL, NULL, 0);
1513 ret = f2fs_get_dnode_of_data(&dn, index, ALLOC_NODE);
1514 if (ret) {
1515 f2fs_unlock_op(sbi);
1516 filemap_invalidate_unlock(mapping);
1517 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1517 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1518 goto out;
1519 }
1520
1521 end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
1522 end = min(pg_end, end_offset - dn.ofs_in_node + index);
1523
1524 ret = f2fs_do_zero_range(&dn, index, end);
1525 f2fs_put_dnode(&dn);
1526
1527 f2fs_unlock_op(sbi);
1528 filemap_invalidate_unlock(mapping);
1518 goto out;
1519 }
1520
1521 end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
1522 end = min(pg_end, end_offset - dn.ofs_in_node + index);
1523
1524 ret = f2fs_do_zero_range(&dn, index, end);
1525 f2fs_put_dnode(&dn);
1526
1527 f2fs_unlock_op(sbi);
1528 filemap_invalidate_unlock(mapping);
1529 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1529 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1530
1531 f2fs_balance_fs(sbi, dn.node_changed);
1532
1533 if (ret)
1534 goto out;
1535
1536 index = end;
1537 new_size = max_t(loff_t, new_size,

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

1595 return ret;
1596
1597 pg_start = offset >> PAGE_SHIFT;
1598 pg_end = (offset + len) >> PAGE_SHIFT;
1599 delta = pg_end - pg_start;
1600 idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
1601
1602 /* avoid gc operation during block exchange */
1530
1531 f2fs_balance_fs(sbi, dn.node_changed);
1532
1533 if (ret)
1534 goto out;
1535
1536 index = end;
1537 new_size = max_t(loff_t, new_size,

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

1595 return ret;
1596
1597 pg_start = offset >> PAGE_SHIFT;
1598 pg_end = (offset + len) >> PAGE_SHIFT;
1599 delta = pg_end - pg_start;
1600 idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
1601
1602 /* avoid gc operation during block exchange */
1603 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1603 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1604 filemap_invalidate_lock(mapping);
1605 truncate_pagecache(inode, offset);
1606
1607 while (!ret && idx > pg_start) {
1608 nr = idx - pg_start;
1609 if (nr > delta)
1610 nr = delta;
1611 idx -= nr;
1612
1613 f2fs_lock_op(sbi);
1614 f2fs_drop_extent_tree(inode);
1615
1616 ret = __exchange_data_block(inode, inode, idx,
1617 idx + delta, nr, false);
1618 f2fs_unlock_op(sbi);
1619 }
1620 filemap_invalidate_unlock(mapping);
1604 filemap_invalidate_lock(mapping);
1605 truncate_pagecache(inode, offset);
1606
1607 while (!ret && idx > pg_start) {
1608 nr = idx - pg_start;
1609 if (nr > delta)
1610 nr = delta;
1611 idx -= nr;
1612
1613 f2fs_lock_op(sbi);
1614 f2fs_drop_extent_tree(inode);
1615
1616 ret = __exchange_data_block(inode, inode, idx,
1617 idx + delta, nr, false);
1618 f2fs_unlock_op(sbi);
1619 }
1620 filemap_invalidate_unlock(mapping);
1621 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1621 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
1622
1623 /* write out all moved pages, if possible */
1624 filemap_invalidate_lock(mapping);
1625 filemap_write_and_wait_range(mapping, offset, LLONG_MAX);
1626 truncate_pagecache(inode, offset);
1627 filemap_invalidate_unlock(mapping);
1628
1629 if (!ret)

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

1669 if (f2fs_is_pinned_file(inode)) {
1670 block_t sec_blks = BLKS_PER_SEC(sbi);
1671 block_t sec_len = roundup(map.m_len, sec_blks);
1672
1673 map.m_len = sec_blks;
1674next_alloc:
1675 if (has_not_enough_free_secs(sbi, 0,
1676 GET_SEC_FROM_SEG(sbi, overprovision_segments(sbi)))) {
1622
1623 /* write out all moved pages, if possible */
1624 filemap_invalidate_lock(mapping);
1625 filemap_write_and_wait_range(mapping, offset, LLONG_MAX);
1626 truncate_pagecache(inode, offset);
1627 filemap_invalidate_unlock(mapping);
1628
1629 if (!ret)

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

1669 if (f2fs_is_pinned_file(inode)) {
1670 block_t sec_blks = BLKS_PER_SEC(sbi);
1671 block_t sec_len = roundup(map.m_len, sec_blks);
1672
1673 map.m_len = sec_blks;
1674next_alloc:
1675 if (has_not_enough_free_secs(sbi, 0,
1676 GET_SEC_FROM_SEG(sbi, overprovision_segments(sbi)))) {
1677 down_write(&sbi->gc_lock);
1677 f2fs_down_write(&sbi->gc_lock);
1678 err = f2fs_gc(sbi, true, false, false, NULL_SEGNO);
1679 if (err && err != -ENODATA && err != -EAGAIN)
1680 goto out_err;
1681 }
1682
1678 err = f2fs_gc(sbi, true, false, false, NULL_SEGNO);
1679 if (err && err != -ENODATA && err != -EAGAIN)
1680 goto out_err;
1681 }
1682
1683 down_write(&sbi->pin_sem);
1683 f2fs_down_write(&sbi->pin_sem);
1684
1685 f2fs_lock_op(sbi);
1686 f2fs_allocate_new_section(sbi, CURSEG_COLD_DATA_PINNED, false);
1687 f2fs_unlock_op(sbi);
1688
1689 map.m_seg_type = CURSEG_COLD_DATA_PINNED;
1690 err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
1691 file_dont_truncate(inode);
1692
1684
1685 f2fs_lock_op(sbi);
1686 f2fs_allocate_new_section(sbi, CURSEG_COLD_DATA_PINNED, false);
1687 f2fs_unlock_op(sbi);
1688
1689 map.m_seg_type = CURSEG_COLD_DATA_PINNED;
1690 err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
1691 file_dont_truncate(inode);
1692
1693 up_write(&sbi->pin_sem);
1693 f2fs_up_write(&sbi->pin_sem);
1694
1695 expanded += map.m_len;
1696 sec_len -= map.m_len;
1697 map.m_lblk += map.m_len;
1698 if (!err && sec_len)
1699 goto next_alloc;
1700
1701 map.m_len = expanded;

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

2015 ret = -EINVAL;
2016 goto out;
2017 }
2018
2019 ret = f2fs_convert_inline_inode(inode);
2020 if (ret)
2021 goto out;
2022
1694
1695 expanded += map.m_len;
1696 sec_len -= map.m_len;
1697 map.m_lblk += map.m_len;
1698 if (!err && sec_len)
1699 goto next_alloc;
1700
1701 map.m_len = expanded;

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

2015 ret = -EINVAL;
2016 goto out;
2017 }
2018
2019 ret = f2fs_convert_inline_inode(inode);
2020 if (ret)
2021 goto out;
2022
2023 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2023 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2024
2025 /*
2026 * Should wait end_io to count F2FS_WB_CP_DATA correctly by
2027 * f2fs_is_atomic_file.
2028 */
2029 if (get_dirty_pages(inode))
2030 f2fs_warn(F2FS_I_SB(inode), "Unexpected flush for atomic writes: ino=%lu, npages=%u",
2031 inode->i_ino, get_dirty_pages(inode));
2032 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
2033 if (ret) {
2024
2025 /*
2026 * Should wait end_io to count F2FS_WB_CP_DATA correctly by
2027 * f2fs_is_atomic_file.
2028 */
2029 if (get_dirty_pages(inode))
2030 f2fs_warn(F2FS_I_SB(inode), "Unexpected flush for atomic writes: ino=%lu, npages=%u",
2031 inode->i_ino, get_dirty_pages(inode));
2032 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
2033 if (ret) {
2034 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2034 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2035 goto out;
2036 }
2037
2038 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
2039 if (list_empty(&fi->inmem_ilist))
2040 list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]);
2041 sbi->atomic_files++;
2042 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
2043
2044 /* add inode in inmem_list first and set atomic_file */
2045 set_inode_flag(inode, FI_ATOMIC_FILE);
2046 clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
2035 goto out;
2036 }
2037
2038 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
2039 if (list_empty(&fi->inmem_ilist))
2040 list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]);
2041 sbi->atomic_files++;
2042 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
2043
2044 /* add inode in inmem_list first and set atomic_file */
2045 set_inode_flag(inode, FI_ATOMIC_FILE);
2046 clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
2047 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2047 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
2048
2049 f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2050 F2FS_I(inode)->inmem_task = current;
2051 stat_update_max_atomic_write(inode);
2052out:
2053 inode_unlock(inode);
2054 mnt_drop_write_file(filp);
2055 return ret;

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

2346
2347 if (!f2fs_sb_has_encrypt(sbi))
2348 return -EOPNOTSUPP;
2349
2350 err = mnt_want_write_file(filp);
2351 if (err)
2352 return err;
2353
2048
2049 f2fs_update_time(F2FS_I_SB(inode), REQ_TIME);
2050 F2FS_I(inode)->inmem_task = current;
2051 stat_update_max_atomic_write(inode);
2052out:
2053 inode_unlock(inode);
2054 mnt_drop_write_file(filp);
2055 return ret;

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

2346
2347 if (!f2fs_sb_has_encrypt(sbi))
2348 return -EOPNOTSUPP;
2349
2350 err = mnt_want_write_file(filp);
2351 if (err)
2352 return err;
2353
2354 down_write(&sbi->sb_lock);
2354 f2fs_down_write(&sbi->sb_lock);
2355
2356 if (uuid_is_nonzero(sbi->raw_super->encrypt_pw_salt))
2357 goto got_it;
2358
2359 /* update superblock with uuid */
2360 generate_random_uuid(sbi->raw_super->encrypt_pw_salt);
2361
2362 err = f2fs_commit_super(sbi, false);
2363 if (err) {
2364 /* undo new data */
2365 memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
2366 goto out_err;
2367 }
2368got_it:
2369 if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
2370 16))
2371 err = -EFAULT;
2372out_err:
2355
2356 if (uuid_is_nonzero(sbi->raw_super->encrypt_pw_salt))
2357 goto got_it;
2358
2359 /* update superblock with uuid */
2360 generate_random_uuid(sbi->raw_super->encrypt_pw_salt);
2361
2362 err = f2fs_commit_super(sbi, false);
2363 if (err) {
2364 /* undo new data */
2365 memset(sbi->raw_super->encrypt_pw_salt, 0, 16);
2366 goto out_err;
2367 }
2368got_it:
2369 if (copy_to_user((__u8 __user *)arg, sbi->raw_super->encrypt_pw_salt,
2370 16))
2371 err = -EFAULT;
2372out_err:
2373 up_write(&sbi->sb_lock);
2373 f2fs_up_write(&sbi->sb_lock);
2374 mnt_drop_write_file(filp);
2375 return err;
2376}
2377
2378static int f2fs_ioc_get_encryption_policy_ex(struct file *filp,
2379 unsigned long arg)
2380{
2381 if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))

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

2442 if (f2fs_readonly(sbi->sb))
2443 return -EROFS;
2444
2445 ret = mnt_want_write_file(filp);
2446 if (ret)
2447 return ret;
2448
2449 if (!sync) {
2374 mnt_drop_write_file(filp);
2375 return err;
2376}
2377
2378static int f2fs_ioc_get_encryption_policy_ex(struct file *filp,
2379 unsigned long arg)
2380{
2381 if (!f2fs_sb_has_encrypt(F2FS_I_SB(file_inode(filp))))

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

2442 if (f2fs_readonly(sbi->sb))
2443 return -EROFS;
2444
2445 ret = mnt_want_write_file(filp);
2446 if (ret)
2447 return ret;
2448
2449 if (!sync) {
2450 if (!down_write_trylock(&sbi->gc_lock)) {
2450 if (!f2fs_down_write_trylock(&sbi->gc_lock)) {
2451 ret = -EBUSY;
2452 goto out;
2453 }
2454 } else {
2451 ret = -EBUSY;
2452 goto out;
2453 }
2454 } else {
2455 down_write(&sbi->gc_lock);
2455 f2fs_down_write(&sbi->gc_lock);
2456 }
2457
2458 ret = f2fs_gc(sbi, sync, true, false, NULL_SEGNO);
2459out:
2460 mnt_drop_write_file(filp);
2461 return ret;
2462}
2463

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

2478 return -EINVAL;
2479
2480 ret = mnt_want_write_file(filp);
2481 if (ret)
2482 return ret;
2483
2484do_more:
2485 if (!range->sync) {
2456 }
2457
2458 ret = f2fs_gc(sbi, sync, true, false, NULL_SEGNO);
2459out:
2460 mnt_drop_write_file(filp);
2461 return ret;
2462}
2463

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

2478 return -EINVAL;
2479
2480 ret = mnt_want_write_file(filp);
2481 if (ret)
2482 return ret;
2483
2484do_more:
2485 if (!range->sync) {
2486 if (!down_write_trylock(&sbi->gc_lock)) {
2486 if (!f2fs_down_write_trylock(&sbi->gc_lock)) {
2487 ret = -EBUSY;
2488 goto out;
2489 }
2490 } else {
2487 ret = -EBUSY;
2488 goto out;
2489 }
2490 } else {
2491 down_write(&sbi->gc_lock);
2491 f2fs_down_write(&sbi->gc_lock);
2492 }
2493
2494 ret = f2fs_gc(sbi, range->sync, true, false,
2495 GET_SEGNO(sbi, range->start));
2496 if (ret) {
2497 if (ret == -EBUSY)
2498 ret = -EAGAIN;
2499 goto out;

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

2815
2816 ret = filemap_write_and_wait_range(dst->i_mapping,
2817 pos_out, pos_out + len);
2818 if (ret)
2819 goto out_unlock;
2820
2821 f2fs_balance_fs(sbi, true);
2822
2492 }
2493
2494 ret = f2fs_gc(sbi, range->sync, true, false,
2495 GET_SEGNO(sbi, range->start));
2496 if (ret) {
2497 if (ret == -EBUSY)
2498 ret = -EAGAIN;
2499 goto out;

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

2815
2816 ret = filemap_write_and_wait_range(dst->i_mapping,
2817 pos_out, pos_out + len);
2818 if (ret)
2819 goto out_unlock;
2820
2821 f2fs_balance_fs(sbi, true);
2822
2823 down_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
2823 f2fs_down_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
2824 if (src != dst) {
2825 ret = -EBUSY;
2824 if (src != dst) {
2825 ret = -EBUSY;
2826 if (!down_write_trylock(&F2FS_I(dst)->i_gc_rwsem[WRITE]))
2826 if (!f2fs_down_write_trylock(&F2FS_I(dst)->i_gc_rwsem[WRITE]))
2827 goto out_src;
2828 }
2829
2830 f2fs_lock_op(sbi);
2831 ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS,
2832 pos_out >> F2FS_BLKSIZE_BITS,
2833 len >> F2FS_BLKSIZE_BITS, false);
2834
2835 if (!ret) {
2836 if (dst_max_i_size)
2837 f2fs_i_size_write(dst, dst_max_i_size);
2838 else if (dst_osize != dst->i_size)
2839 f2fs_i_size_write(dst, dst_osize);
2840 }
2841 f2fs_unlock_op(sbi);
2842
2843 if (src != dst)
2827 goto out_src;
2828 }
2829
2830 f2fs_lock_op(sbi);
2831 ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS,
2832 pos_out >> F2FS_BLKSIZE_BITS,
2833 len >> F2FS_BLKSIZE_BITS, false);
2834
2835 if (!ret) {
2836 if (dst_max_i_size)
2837 f2fs_i_size_write(dst, dst_max_i_size);
2838 else if (dst_osize != dst->i_size)
2839 f2fs_i_size_write(dst, dst_osize);
2840 }
2841 f2fs_unlock_op(sbi);
2842
2843 if (src != dst)
2844 up_write(&F2FS_I(dst)->i_gc_rwsem[WRITE]);
2844 f2fs_up_write(&F2FS_I(dst)->i_gc_rwsem[WRITE]);
2845out_src:
2845out_src:
2846 up_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
2846 f2fs_up_write(&F2FS_I(src)->i_gc_rwsem[WRITE]);
2847out_unlock:
2848 if (src != dst)
2849 inode_unlock(dst);
2850out:
2851 inode_unlock(src);
2852 return ret;
2853}
2854

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

2933 dev_end_segno = GET_SEGNO(sbi, FDEV(range.dev_num).end_blk);
2934
2935 start_segno = sm->last_victim[FLUSH_DEVICE];
2936 if (start_segno < dev_start_segno || start_segno >= dev_end_segno)
2937 start_segno = dev_start_segno;
2938 end_segno = min(start_segno + range.segments, dev_end_segno);
2939
2940 while (start_segno < end_segno) {
2847out_unlock:
2848 if (src != dst)
2849 inode_unlock(dst);
2850out:
2851 inode_unlock(src);
2852 return ret;
2853}
2854

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

2933 dev_end_segno = GET_SEGNO(sbi, FDEV(range.dev_num).end_blk);
2934
2935 start_segno = sm->last_victim[FLUSH_DEVICE];
2936 if (start_segno < dev_start_segno || start_segno >= dev_end_segno)
2937 start_segno = dev_start_segno;
2938 end_segno = min(start_segno + range.segments, dev_end_segno);
2939
2940 while (start_segno < end_segno) {
2941 if (!down_write_trylock(&sbi->gc_lock)) {
2941 if (!f2fs_down_write_trylock(&sbi->gc_lock)) {
2942 ret = -EBUSY;
2943 goto out;
2944 }
2945 sm->last_victim[GC_CB] = end_segno + 1;
2946 sm->last_victim[GC_GREEDY] = end_segno + 1;
2947 sm->last_victim[ALLOC_NEXT] = end_segno + 1;
2948 ret = f2fs_gc(sbi, true, true, true, start_segno);
2949 if (ret == -EAGAIN)

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

3210 map.m_next_extent = &m_next_extent;
3211 map.m_seg_type = NO_CHECK_TYPE;
3212 map.m_may_create = false;
3213 end = max_file_blocks(inode);
3214
3215 while (map.m_lblk < end) {
3216 map.m_len = end - map.m_lblk;
3217
2942 ret = -EBUSY;
2943 goto out;
2944 }
2945 sm->last_victim[GC_CB] = end_segno + 1;
2946 sm->last_victim[GC_GREEDY] = end_segno + 1;
2947 sm->last_victim[ALLOC_NEXT] = end_segno + 1;
2948 ret = f2fs_gc(sbi, true, true, true, start_segno);
2949 if (ret == -EAGAIN)

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

3210 map.m_next_extent = &m_next_extent;
3211 map.m_seg_type = NO_CHECK_TYPE;
3212 map.m_may_create = false;
3213 end = max_file_blocks(inode);
3214
3215 while (map.m_lblk < end) {
3216 map.m_len = end - map.m_lblk;
3217
3218 down_write(&fi->i_gc_rwsem[WRITE]);
3218 f2fs_down_write(&fi->i_gc_rwsem[WRITE]);
3219 err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_PRECACHE);
3219 err = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_PRECACHE);
3220 up_write(&fi->i_gc_rwsem[WRITE]);
3220 f2fs_up_write(&fi->i_gc_rwsem[WRITE]);
3221 if (err)
3222 return err;
3223
3224 map.m_lblk = m_next_extent;
3225 }
3226
3227 return 0;
3228}

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

3289 char *vbuf;
3290 int count;
3291 int err = 0;
3292
3293 vbuf = f2fs_kzalloc(sbi, MAX_VOLUME_NAME, GFP_KERNEL);
3294 if (!vbuf)
3295 return -ENOMEM;
3296
3221 if (err)
3222 return err;
3223
3224 map.m_lblk = m_next_extent;
3225 }
3226
3227 return 0;
3228}

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

3289 char *vbuf;
3290 int count;
3291 int err = 0;
3292
3293 vbuf = f2fs_kzalloc(sbi, MAX_VOLUME_NAME, GFP_KERNEL);
3294 if (!vbuf)
3295 return -ENOMEM;
3296
3297 down_read(&sbi->sb_lock);
3297 f2fs_down_read(&sbi->sb_lock);
3298 count = utf16s_to_utf8s(sbi->raw_super->volume_name,
3299 ARRAY_SIZE(sbi->raw_super->volume_name),
3300 UTF16_LITTLE_ENDIAN, vbuf, MAX_VOLUME_NAME);
3298 count = utf16s_to_utf8s(sbi->raw_super->volume_name,
3299 ARRAY_SIZE(sbi->raw_super->volume_name),
3300 UTF16_LITTLE_ENDIAN, vbuf, MAX_VOLUME_NAME);
3301 up_read(&sbi->sb_lock);
3301 f2fs_up_read(&sbi->sb_lock);
3302
3303 if (copy_to_user((char __user *)arg, vbuf,
3304 min(FSLABEL_MAX, count)))
3305 err = -EFAULT;
3306
3307 kfree(vbuf);
3308 return err;
3309}

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

3321 vbuf = strndup_user((const char __user *)arg, FSLABEL_MAX);
3322 if (IS_ERR(vbuf))
3323 return PTR_ERR(vbuf);
3324
3325 err = mnt_want_write_file(filp);
3326 if (err)
3327 goto out;
3328
3302
3303 if (copy_to_user((char __user *)arg, vbuf,
3304 min(FSLABEL_MAX, count)))
3305 err = -EFAULT;
3306
3307 kfree(vbuf);
3308 return err;
3309}

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

3321 vbuf = strndup_user((const char __user *)arg, FSLABEL_MAX);
3322 if (IS_ERR(vbuf))
3323 return PTR_ERR(vbuf);
3324
3325 err = mnt_want_write_file(filp);
3326 if (err)
3327 goto out;
3328
3329 down_write(&sbi->sb_lock);
3329 f2fs_down_write(&sbi->sb_lock);
3330
3331 memset(sbi->raw_super->volume_name, 0,
3332 sizeof(sbi->raw_super->volume_name));
3333 utf8s_to_utf16s(vbuf, strlen(vbuf), UTF16_LITTLE_ENDIAN,
3334 sbi->raw_super->volume_name,
3335 ARRAY_SIZE(sbi->raw_super->volume_name));
3336
3337 err = f2fs_commit_super(sbi, false);
3338
3330
3331 memset(sbi->raw_super->volume_name, 0,
3332 sizeof(sbi->raw_super->volume_name));
3333 utf8s_to_utf16s(vbuf, strlen(vbuf), UTF16_LITTLE_ENDIAN,
3334 sbi->raw_super->volume_name,
3335 ARRAY_SIZE(sbi->raw_super->volume_name));
3336
3337 err = f2fs_commit_super(sbi, false);
3338
3339 up_write(&sbi->sb_lock);
3339 f2fs_up_write(&sbi->sb_lock);
3340
3341 mnt_drop_write_file(filp);
3342out:
3343 kfree(vbuf);
3344 return err;
3345}
3346
3347static int f2fs_get_compress_blocks(struct file *filp, unsigned long arg)

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

3457
3458 set_inode_flag(inode, FI_COMPRESS_RELEASED);
3459 inode->i_ctime = current_time(inode);
3460 f2fs_mark_inode_dirty_sync(inode, true);
3461
3462 if (!atomic_read(&F2FS_I(inode)->i_compr_blocks))
3463 goto out;
3464
3340
3341 mnt_drop_write_file(filp);
3342out:
3343 kfree(vbuf);
3344 return err;
3345}
3346
3347static int f2fs_get_compress_blocks(struct file *filp, unsigned long arg)

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

3457
3458 set_inode_flag(inode, FI_COMPRESS_RELEASED);
3459 inode->i_ctime = current_time(inode);
3460 f2fs_mark_inode_dirty_sync(inode, true);
3461
3462 if (!atomic_read(&F2FS_I(inode)->i_compr_blocks))
3463 goto out;
3464
3465 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3465 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3466 filemap_invalidate_lock(inode->i_mapping);
3467
3468 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
3469
3470 while (page_idx < last_idx) {
3471 struct dnode_of_data dn;
3472 pgoff_t end_offset, count;
3473

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

3494 if (ret < 0)
3495 break;
3496
3497 page_idx += count;
3498 released_blocks += ret;
3499 }
3500
3501 filemap_invalidate_unlock(inode->i_mapping);
3466 filemap_invalidate_lock(inode->i_mapping);
3467
3468 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
3469
3470 while (page_idx < last_idx) {
3471 struct dnode_of_data dn;
3472 pgoff_t end_offset, count;
3473

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

3494 if (ret < 0)
3495 break;
3496
3497 page_idx += count;
3498 released_blocks += ret;
3499 }
3500
3501 filemap_invalidate_unlock(inode->i_mapping);
3502 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3502 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3503out:
3504 inode_unlock(inode);
3505
3506 mnt_drop_write_file(filp);
3507
3508 if (ret >= 0) {
3509 ret = put_user(released_blocks, (u64 __user *)arg);
3510 } else if (released_blocks &&

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

3610
3611 inode_lock(inode);
3612
3613 if (!is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) {
3614 ret = -EINVAL;
3615 goto unlock_inode;
3616 }
3617
3503out:
3504 inode_unlock(inode);
3505
3506 mnt_drop_write_file(filp);
3507
3508 if (ret >= 0) {
3509 ret = put_user(released_blocks, (u64 __user *)arg);
3510 } else if (released_blocks &&

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

3610
3611 inode_lock(inode);
3612
3613 if (!is_inode_flag_set(inode, FI_COMPRESS_RELEASED)) {
3614 ret = -EINVAL;
3615 goto unlock_inode;
3616 }
3617
3618 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3618 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3619 filemap_invalidate_lock(inode->i_mapping);
3620
3621 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
3622
3623 while (page_idx < last_idx) {
3624 struct dnode_of_data dn;
3625 pgoff_t end_offset, count;
3626

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

3647 if (ret < 0)
3648 break;
3649
3650 page_idx += count;
3651 reserved_blocks += ret;
3652 }
3653
3654 filemap_invalidate_unlock(inode->i_mapping);
3619 filemap_invalidate_lock(inode->i_mapping);
3620
3621 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
3622
3623 while (page_idx < last_idx) {
3624 struct dnode_of_data dn;
3625 pgoff_t end_offset, count;
3626

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

3647 if (ret < 0)
3648 break;
3649
3650 page_idx += count;
3651 reserved_blocks += ret;
3652 }
3653
3654 filemap_invalidate_unlock(inode->i_mapping);
3655 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3655 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3656
3657 if (ret >= 0) {
3658 clear_inode_flag(inode, FI_COMPRESS_RELEASED);
3659 inode->i_ctime = current_time(inode);
3660 f2fs_mark_inode_dirty_sync(inode, true);
3661 }
3662unlock_inode:
3663 inode_unlock(inode);

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

3765
3766 index = F2FS_BYTES_TO_BLK(range.start);
3767 pg_end = DIV_ROUND_UP(end_addr, F2FS_BLKSIZE);
3768
3769 ret = f2fs_convert_inline_inode(inode);
3770 if (ret)
3771 goto err;
3772
3656
3657 if (ret >= 0) {
3658 clear_inode_flag(inode, FI_COMPRESS_RELEASED);
3659 inode->i_ctime = current_time(inode);
3660 f2fs_mark_inode_dirty_sync(inode, true);
3661 }
3662unlock_inode:
3663 inode_unlock(inode);

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

3765
3766 index = F2FS_BYTES_TO_BLK(range.start);
3767 pg_end = DIV_ROUND_UP(end_addr, F2FS_BLKSIZE);
3768
3769 ret = f2fs_convert_inline_inode(inode);
3770 if (ret)
3771 goto err;
3772
3773 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3773 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3774 filemap_invalidate_lock(mapping);
3775
3776 ret = filemap_write_and_wait_range(mapping, range.start,
3777 to_end ? LLONG_MAX : end_addr - 1);
3778 if (ret)
3779 goto out;
3780
3781 truncate_inode_pages_range(mapping, range.start,

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

3854 cond_resched();
3855 }
3856
3857 if (len)
3858 ret = f2fs_secure_erase(prev_bdev, inode, prev_index,
3859 prev_block, len, range.flags);
3860out:
3861 filemap_invalidate_unlock(mapping);
3774 filemap_invalidate_lock(mapping);
3775
3776 ret = filemap_write_and_wait_range(mapping, range.start,
3777 to_end ? LLONG_MAX : end_addr - 1);
3778 if (ret)
3779 goto out;
3780
3781 truncate_inode_pages_range(mapping, range.start,

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

3854 cond_resched();
3855 }
3856
3857 if (len)
3858 ret = f2fs_secure_erase(prev_bdev, inode, prev_index,
3859 prev_block, len, range.flags);
3860out:
3861 filemap_invalidate_unlock(mapping);
3862 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3862 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3863err:
3864 inode_unlock(inode);
3865 file_end_write(filp);
3866
3867 return ret;
3868}
3869
3870static int f2fs_ioc_get_compress_option(struct file *filp, unsigned long arg)

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

4286 ssize_t ret;
4287
4288 if (count == 0)
4289 return 0; /* skip atime update */
4290
4291 trace_f2fs_direct_IO_enter(inode, iocb, count, READ);
4292
4293 if (iocb->ki_flags & IOCB_NOWAIT) {
3863err:
3864 inode_unlock(inode);
3865 file_end_write(filp);
3866
3867 return ret;
3868}
3869
3870static int f2fs_ioc_get_compress_option(struct file *filp, unsigned long arg)

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

4286 ssize_t ret;
4287
4288 if (count == 0)
4289 return 0; /* skip atime update */
4290
4291 trace_f2fs_direct_IO_enter(inode, iocb, count, READ);
4292
4293 if (iocb->ki_flags & IOCB_NOWAIT) {
4294 if (!down_read_trylock(&fi->i_gc_rwsem[READ])) {
4294 if (!f2fs_down_read_trylock(&fi->i_gc_rwsem[READ])) {
4295 ret = -EAGAIN;
4296 goto out;
4297 }
4298 } else {
4295 ret = -EAGAIN;
4296 goto out;
4297 }
4298 } else {
4299 down_read(&fi->i_gc_rwsem[READ]);
4299 f2fs_down_read(&fi->i_gc_rwsem[READ]);
4300 }
4301
4302 /*
4303 * We have to use __iomap_dio_rw() and iomap_dio_complete() instead of
4304 * the higher-level function iomap_dio_rw() in order to ensure that the
4305 * F2FS_DIO_READ counter will be decremented correctly in all cases.
4306 */
4307 inc_page_count(sbi, F2FS_DIO_READ);
4308 dio = __iomap_dio_rw(iocb, to, &f2fs_iomap_ops,
4309 &f2fs_iomap_dio_read_ops, 0, 0);
4310 if (IS_ERR_OR_NULL(dio)) {
4311 ret = PTR_ERR_OR_ZERO(dio);
4312 if (ret != -EIOCBQUEUED)
4313 dec_page_count(sbi, F2FS_DIO_READ);
4314 } else {
4315 ret = iomap_dio_complete(dio);
4316 }
4317
4300 }
4301
4302 /*
4303 * We have to use __iomap_dio_rw() and iomap_dio_complete() instead of
4304 * the higher-level function iomap_dio_rw() in order to ensure that the
4305 * F2FS_DIO_READ counter will be decremented correctly in all cases.
4306 */
4307 inc_page_count(sbi, F2FS_DIO_READ);
4308 dio = __iomap_dio_rw(iocb, to, &f2fs_iomap_ops,
4309 &f2fs_iomap_dio_read_ops, 0, 0);
4310 if (IS_ERR_OR_NULL(dio)) {
4311 ret = PTR_ERR_OR_ZERO(dio);
4312 if (ret != -EIOCBQUEUED)
4313 dec_page_count(sbi, F2FS_DIO_READ);
4314 } else {
4315 ret = iomap_dio_complete(dio);
4316 }
4317
4318 up_read(&fi->i_gc_rwsem[READ]);
4318 f2fs_up_read(&fi->i_gc_rwsem[READ]);
4319
4320 file_accessed(file);
4321out:
4322 trace_f2fs_direct_IO_exit(inode, pos, count, READ, ret);
4323 return ret;
4324}
4325
4326static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)

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

4492 if (iocb->ki_flags & IOCB_NOWAIT) {
4493 /* f2fs_convert_inline_inode() and block allocation can block */
4494 if (f2fs_has_inline_data(inode) ||
4495 !f2fs_overwrite_io(inode, pos, count)) {
4496 ret = -EAGAIN;
4497 goto out;
4498 }
4499
4319
4320 file_accessed(file);
4321out:
4322 trace_f2fs_direct_IO_exit(inode, pos, count, READ, ret);
4323 return ret;
4324}
4325
4326static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)

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

4492 if (iocb->ki_flags & IOCB_NOWAIT) {
4493 /* f2fs_convert_inline_inode() and block allocation can block */
4494 if (f2fs_has_inline_data(inode) ||
4495 !f2fs_overwrite_io(inode, pos, count)) {
4496 ret = -EAGAIN;
4497 goto out;
4498 }
4499
4500 if (!down_read_trylock(&fi->i_gc_rwsem[WRITE])) {
4500 if (!f2fs_down_read_trylock(&fi->i_gc_rwsem[WRITE])) {
4501 ret = -EAGAIN;
4502 goto out;
4503 }
4501 ret = -EAGAIN;
4502 goto out;
4503 }
4504 if (do_opu && !down_read_trylock(&fi->i_gc_rwsem[READ])) {
4505 up_read(&fi->i_gc_rwsem[WRITE]);
4504 if (do_opu && !f2fs_down_read_trylock(&fi->i_gc_rwsem[READ])) {
4505 f2fs_up_read(&fi->i_gc_rwsem[WRITE]);
4506 ret = -EAGAIN;
4507 goto out;
4508 }
4509 } else {
4510 ret = f2fs_convert_inline_inode(inode);
4511 if (ret)
4512 goto out;
4513
4506 ret = -EAGAIN;
4507 goto out;
4508 }
4509 } else {
4510 ret = f2fs_convert_inline_inode(inode);
4511 if (ret)
4512 goto out;
4513
4514 down_read(&fi->i_gc_rwsem[WRITE]);
4514 f2fs_down_read(&fi->i_gc_rwsem[WRITE]);
4515 if (do_opu)
4515 if (do_opu)
4516 down_read(&fi->i_gc_rwsem[READ]);
4516 f2fs_down_read(&fi->i_gc_rwsem[READ]);
4517 }
4518 if (whint_mode == WHINT_MODE_OFF)
4519 iocb->ki_hint = WRITE_LIFE_NOT_SET;
4520
4521 /*
4522 * We have to use __iomap_dio_rw() and iomap_dio_complete() instead of
4523 * the higher-level function iomap_dio_rw() in order to ensure that the
4524 * F2FS_DIO_WRITE counter will be decremented correctly in all cases.

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

4537 dec_page_count(sbi, F2FS_DIO_WRITE);
4538 } else {
4539 ret = iomap_dio_complete(dio);
4540 }
4541
4542 if (whint_mode == WHINT_MODE_OFF)
4543 iocb->ki_hint = hint;
4544 if (do_opu)
4517 }
4518 if (whint_mode == WHINT_MODE_OFF)
4519 iocb->ki_hint = WRITE_LIFE_NOT_SET;
4520
4521 /*
4522 * We have to use __iomap_dio_rw() and iomap_dio_complete() instead of
4523 * the higher-level function iomap_dio_rw() in order to ensure that the
4524 * F2FS_DIO_WRITE counter will be decremented correctly in all cases.

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

4537 dec_page_count(sbi, F2FS_DIO_WRITE);
4538 } else {
4539 ret = iomap_dio_complete(dio);
4540 }
4541
4542 if (whint_mode == WHINT_MODE_OFF)
4543 iocb->ki_hint = hint;
4544 if (do_opu)
4545 up_read(&fi->i_gc_rwsem[READ]);
4546 up_read(&fi->i_gc_rwsem[WRITE]);
4545 f2fs_up_read(&fi->i_gc_rwsem[READ]);
4546 f2fs_up_read(&fi->i_gc_rwsem[WRITE]);
4547
4548 if (ret < 0)
4549 goto out;
4550 if (pos + ret > inode->i_size)
4551 f2fs_i_size_write(inode, pos + ret);
4552 if (!do_opu)
4553 set_inode_flag(inode, FI_UPDATE_WRITE);
4554

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

4639 else
4640 /* Do the actual write. */
4641 ret = dio ?
4642 f2fs_dio_write_iter(iocb, from, &may_need_sync):
4643 f2fs_buffered_write_iter(iocb, from);
4644
4645 /* Don't leave any preallocated blocks around past i_size. */
4646 if (preallocated && i_size_read(inode) < target_size) {
4547
4548 if (ret < 0)
4549 goto out;
4550 if (pos + ret > inode->i_size)
4551 f2fs_i_size_write(inode, pos + ret);
4552 if (!do_opu)
4553 set_inode_flag(inode, FI_UPDATE_WRITE);
4554

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

4639 else
4640 /* Do the actual write. */
4641 ret = dio ?
4642 f2fs_dio_write_iter(iocb, from, &may_need_sync):
4643 f2fs_buffered_write_iter(iocb, from);
4644
4645 /* Don't leave any preallocated blocks around past i_size. */
4646 if (preallocated && i_size_read(inode) < target_size) {
4647 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
4647 f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
4648 filemap_invalidate_lock(inode->i_mapping);
4649 if (!f2fs_truncate(inode))
4650 file_dont_truncate(inode);
4651 filemap_invalidate_unlock(inode->i_mapping);
4648 filemap_invalidate_lock(inode->i_mapping);
4649 if (!f2fs_truncate(inode))
4650 file_dont_truncate(inode);
4651 filemap_invalidate_unlock(inode->i_mapping);
4652 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
4652 f2fs_up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
4653 } else {
4654 file_dont_truncate(inode);
4655 }
4656
4657 clear_inode_flag(inode, FI_PREALLOCATED_ALL);
4658out_unlock:
4659 inode_unlock(inode);
4660out:

--- 170 unchanged lines hidden ---
4653 } else {
4654 file_dont_truncate(inode);
4655 }
4656
4657 clear_inode_flag(inode, FI_PREALLOCATED_ALL);
4658out_unlock:
4659 inode_unlock(inode);
4660out:

--- 170 unchanged lines hidden ---