diff options
Diffstat (limited to 'fs/f2fs/file.c')
-rw-r--r-- | fs/f2fs/file.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index ba5954f41e14..5742ab8b57dc 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -589,8 +589,7 @@ truncate_out: | |||
589 | return 0; | 589 | return 0; |
590 | } | 590 | } |
591 | 591 | ||
592 | int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock, | 592 | int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock) |
593 | bool buf_write) | ||
594 | { | 593 | { |
595 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 594 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
596 | struct dnode_of_data dn; | 595 | struct dnode_of_data dn; |
@@ -598,7 +597,6 @@ int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock, | |||
598 | int count = 0, err = 0; | 597 | int count = 0, err = 0; |
599 | struct page *ipage; | 598 | struct page *ipage; |
600 | bool truncate_page = false; | 599 | bool truncate_page = false; |
601 | int flag = buf_write ? F2FS_GET_BLOCK_PRE_AIO : F2FS_GET_BLOCK_PRE_DIO; | ||
602 | 600 | ||
603 | trace_f2fs_truncate_blocks_enter(inode, from); | 601 | trace_f2fs_truncate_blocks_enter(inode, from); |
604 | 602 | ||
@@ -608,7 +606,7 @@ int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock, | |||
608 | goto free_partial; | 606 | goto free_partial; |
609 | 607 | ||
610 | if (lock) | 608 | if (lock) |
611 | __do_map_lock(sbi, flag, true); | 609 | f2fs_lock_op(sbi); |
612 | 610 | ||
613 | ipage = f2fs_get_node_page(sbi, inode->i_ino); | 611 | ipage = f2fs_get_node_page(sbi, inode->i_ino); |
614 | if (IS_ERR(ipage)) { | 612 | if (IS_ERR(ipage)) { |
@@ -646,7 +644,7 @@ free_next: | |||
646 | err = f2fs_truncate_inode_blocks(inode, free_from); | 644 | err = f2fs_truncate_inode_blocks(inode, free_from); |
647 | out: | 645 | out: |
648 | if (lock) | 646 | if (lock) |
649 | __do_map_lock(sbi, flag, false); | 647 | f2fs_unlock_op(sbi); |
650 | free_partial: | 648 | free_partial: |
651 | /* lastly zero out the first data page */ | 649 | /* lastly zero out the first data page */ |
652 | if (!err) | 650 | if (!err) |
@@ -681,7 +679,7 @@ int f2fs_truncate(struct inode *inode) | |||
681 | return err; | 679 | return err; |
682 | } | 680 | } |
683 | 681 | ||
684 | err = f2fs_truncate_blocks(inode, i_size_read(inode), true, false); | 682 | err = f2fs_truncate_blocks(inode, i_size_read(inode), true); |
685 | if (err) | 683 | if (err) |
686 | return err; | 684 | return err; |
687 | 685 | ||
@@ -768,7 +766,6 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) | |||
768 | { | 766 | { |
769 | struct inode *inode = d_inode(dentry); | 767 | struct inode *inode = d_inode(dentry); |
770 | int err; | 768 | int err; |
771 | bool size_changed = false; | ||
772 | 769 | ||
773 | if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) | 770 | if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) |
774 | return -EIO; | 771 | return -EIO; |
@@ -843,8 +840,6 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) | |||
843 | down_write(&F2FS_I(inode)->i_sem); | 840 | down_write(&F2FS_I(inode)->i_sem); |
844 | F2FS_I(inode)->last_disk_size = i_size_read(inode); | 841 | F2FS_I(inode)->last_disk_size = i_size_read(inode); |
845 | up_write(&F2FS_I(inode)->i_sem); | 842 | up_write(&F2FS_I(inode)->i_sem); |
846 | |||
847 | size_changed = true; | ||
848 | } | 843 | } |
849 | 844 | ||
850 | __setattr_copy(inode, attr); | 845 | __setattr_copy(inode, attr); |
@@ -858,7 +853,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) | |||
858 | } | 853 | } |
859 | 854 | ||
860 | /* file size may changed here */ | 855 | /* file size may changed here */ |
861 | f2fs_mark_inode_dirty_sync(inode, size_changed); | 856 | f2fs_mark_inode_dirty_sync(inode, true); |
862 | 857 | ||
863 | /* inode change will produce dirty node pages flushed by checkpoint */ | 858 | /* inode change will produce dirty node pages flushed by checkpoint */ |
864 | f2fs_balance_fs(F2FS_I_SB(inode), true); | 859 | f2fs_balance_fs(F2FS_I_SB(inode), true); |
@@ -1262,7 +1257,7 @@ static int f2fs_collapse_range(struct inode *inode, loff_t offset, loff_t len) | |||
1262 | new_size = i_size_read(inode) - len; | 1257 | new_size = i_size_read(inode) - len; |
1263 | truncate_pagecache(inode, new_size); | 1258 | truncate_pagecache(inode, new_size); |
1264 | 1259 | ||
1265 | ret = f2fs_truncate_blocks(inode, new_size, true, false); | 1260 | ret = f2fs_truncate_blocks(inode, new_size, true); |
1266 | up_write(&F2FS_I(inode)->i_mmap_sem); | 1261 | up_write(&F2FS_I(inode)->i_mmap_sem); |
1267 | if (!ret) | 1262 | if (!ret) |
1268 | f2fs_i_size_write(inode, new_size); | 1263 | f2fs_i_size_write(inode, new_size); |
@@ -1447,7 +1442,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len) | |||
1447 | f2fs_balance_fs(sbi, true); | 1442 | f2fs_balance_fs(sbi, true); |
1448 | 1443 | ||
1449 | down_write(&F2FS_I(inode)->i_mmap_sem); | 1444 | down_write(&F2FS_I(inode)->i_mmap_sem); |
1450 | ret = f2fs_truncate_blocks(inode, i_size_read(inode), true, false); | 1445 | ret = f2fs_truncate_blocks(inode, i_size_read(inode), true); |
1451 | up_write(&F2FS_I(inode)->i_mmap_sem); | 1446 | up_write(&F2FS_I(inode)->i_mmap_sem); |
1452 | if (ret) | 1447 | if (ret) |
1453 | return ret; | 1448 | return ret; |
@@ -1651,6 +1646,8 @@ static int f2fs_ioc_getflags(struct file *filp, unsigned long arg) | |||
1651 | flags |= F2FS_ENCRYPT_FL; | 1646 | flags |= F2FS_ENCRYPT_FL; |
1652 | if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) | 1647 | if (f2fs_has_inline_data(inode) || f2fs_has_inline_dentry(inode)) |
1653 | flags |= F2FS_INLINE_DATA_FL; | 1648 | flags |= F2FS_INLINE_DATA_FL; |
1649 | if (is_inode_flag_set(inode, FI_PIN_FILE)) | ||
1650 | flags |= F2FS_NOCOW_FL; | ||
1654 | 1651 | ||
1655 | flags &= F2FS_FL_USER_VISIBLE; | 1652 | flags &= F2FS_FL_USER_VISIBLE; |
1656 | 1653 | ||
@@ -1750,10 +1747,12 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) | |||
1750 | 1747 | ||
1751 | down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); | 1748 | down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1752 | 1749 | ||
1753 | if (!get_dirty_pages(inode)) | 1750 | /* |
1754 | goto skip_flush; | 1751 | * Should wait end_io to count F2FS_WB_CP_DATA correctly by |
1755 | 1752 | * f2fs_is_atomic_file. | |
1756 | f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING, | 1753 | */ |
1754 | if (get_dirty_pages(inode)) | ||
1755 | f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING, | ||
1757 | "Unexpected flush for atomic writes: ino=%lu, npages=%u", | 1756 | "Unexpected flush for atomic writes: ino=%lu, npages=%u", |
1758 | inode->i_ino, get_dirty_pages(inode)); | 1757 | inode->i_ino, get_dirty_pages(inode)); |
1759 | ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX); | 1758 | ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX); |
@@ -1761,7 +1760,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) | |||
1761 | up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); | 1760 | up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
1762 | goto out; | 1761 | goto out; |
1763 | } | 1762 | } |
1764 | skip_flush: | 1763 | |
1765 | set_inode_flag(inode, FI_ATOMIC_FILE); | 1764 | set_inode_flag(inode, FI_ATOMIC_FILE); |
1766 | clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST); | 1765 | clear_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST); |
1767 | up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); | 1766 | up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]); |
@@ -1968,11 +1967,11 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) | |||
1968 | break; | 1967 | break; |
1969 | case F2FS_GOING_DOWN_NEED_FSCK: | 1968 | case F2FS_GOING_DOWN_NEED_FSCK: |
1970 | set_sbi_flag(sbi, SBI_NEED_FSCK); | 1969 | set_sbi_flag(sbi, SBI_NEED_FSCK); |
1970 | set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK); | ||
1971 | set_sbi_flag(sbi, SBI_IS_DIRTY); | ||
1971 | /* do checkpoint only */ | 1972 | /* do checkpoint only */ |
1972 | ret = f2fs_sync_fs(sb, 1); | 1973 | ret = f2fs_sync_fs(sb, 1); |
1973 | if (ret) | 1974 | goto out; |
1974 | goto out; | ||
1975 | break; | ||
1976 | default: | 1975 | default: |
1977 | ret = -EINVAL; | 1976 | ret = -EINVAL; |
1978 | goto out; | 1977 | goto out; |
@@ -1988,6 +1987,9 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) | |||
1988 | out: | 1987 | out: |
1989 | if (in != F2FS_GOING_DOWN_FULLSYNC) | 1988 | if (in != F2FS_GOING_DOWN_FULLSYNC) |
1990 | mnt_drop_write_file(filp); | 1989 | mnt_drop_write_file(filp); |
1990 | |||
1991 | trace_f2fs_shutdown(sbi, in, ret); | ||
1992 | |||
1991 | return ret; | 1993 | return ret; |
1992 | } | 1994 | } |
1993 | 1995 | ||
@@ -2871,8 +2873,8 @@ static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg) | |||
2871 | __u32 pin; | 2873 | __u32 pin; |
2872 | int ret = 0; | 2874 | int ret = 0; |
2873 | 2875 | ||
2874 | if (!inode_owner_or_capable(inode)) | 2876 | if (!capable(CAP_SYS_ADMIN)) |
2875 | return -EACCES; | 2877 | return -EPERM; |
2876 | 2878 | ||
2877 | if (get_user(pin, (__u32 __user *)arg)) | 2879 | if (get_user(pin, (__u32 __user *)arg)) |
2878 | return -EFAULT; | 2880 | return -EFAULT; |