aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs/file.c')
-rw-r--r--fs/f2fs/file.c46
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
592int f2fs_truncate_blocks(struct inode *inode, u64 from, bool lock, 592int 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);
647out: 645out:
648 if (lock) 646 if (lock)
649 __do_map_lock(sbi, flag, false); 647 f2fs_unlock_op(sbi);
650free_partial: 648free_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 }
1764skip_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)
1988out: 1987out:
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;