file.c (8df22a4d6f5b81c9c1703579d4907b57002689ed) | file.c (88b88a66797159949cec32eaab12b4968f6fae2d) |
---|---|
1/* 2 * fs/f2fs/file.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 19 unchanged lines hidden (view full) --- 28#include "acl.h" 29#include <trace/events/f2fs.h> 30 31static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, 32 struct vm_fault *vmf) 33{ 34 struct page *page = vmf->page; 35 struct inode *inode = file_inode(vma->vm_file); | 1/* 2 * fs/f2fs/file.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 19 unchanged lines hidden (view full) --- 28#include "acl.h" 29#include <trace/events/f2fs.h> 30 31static int f2fs_vm_page_mkwrite(struct vm_area_struct *vma, 32 struct vm_fault *vmf) 33{ 34 struct page *page = vmf->page; 35 struct inode *inode = file_inode(vma->vm_file); |
36 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 36 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
37 struct dnode_of_data dn; 38 int err; 39 40 f2fs_balance_fs(sbi); 41 42 sb_start_pagefault(inode->i_sb); 43 44 /* force to convert with normal data indices */ --- 67 unchanged lines hidden (view full) --- 112 113 *pino = parent_ino(dentry); 114 dput(dentry); 115 return 1; 116} 117 118static inline bool need_do_checkpoint(struct inode *inode) 119{ | 37 struct dnode_of_data dn; 38 int err; 39 40 f2fs_balance_fs(sbi); 41 42 sb_start_pagefault(inode->i_sb); 43 44 /* force to convert with normal data indices */ --- 67 unchanged lines hidden (view full) --- 112 113 *pino = parent_ino(dentry); 114 dput(dentry); 115 return 1; 116} 117 118static inline bool need_do_checkpoint(struct inode *inode) 119{ |
120 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 120 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
121 bool need_cp = false; 122 123 if (!S_ISREG(inode->i_mode) || inode->i_nlink != 1) 124 need_cp = true; 125 else if (file_wrong_pino(inode)) 126 need_cp = true; 127 else if (!space_for_roll_forward(sbi)) 128 need_cp = true; --- 4 unchanged lines hidden (view full) --- 133 134 return need_cp; 135} 136 137int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 138{ 139 struct inode *inode = file->f_mapping->host; 140 struct f2fs_inode_info *fi = F2FS_I(inode); | 121 bool need_cp = false; 122 123 if (!S_ISREG(inode->i_mode) || inode->i_nlink != 1) 124 need_cp = true; 125 else if (file_wrong_pino(inode)) 126 need_cp = true; 127 else if (!space_for_roll_forward(sbi)) 128 need_cp = true; --- 4 unchanged lines hidden (view full) --- 133 134 return need_cp; 135} 136 137int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 138{ 139 struct inode *inode = file->f_mapping->host; 140 struct f2fs_inode_info *fi = F2FS_I(inode); |
141 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 141 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 142 nid_t ino = inode->i_ino; |
142 int ret = 0; 143 bool need_cp = false; 144 struct writeback_control wbc = { 145 .sync_mode = WB_SYNC_ALL, 146 .nr_to_write = LONG_MAX, 147 .for_reclaim = 0, 148 }; 149 150 if (unlikely(f2fs_readonly(inode->i_sb))) 151 return 0; 152 153 trace_f2fs_sync_file_enter(inode); 154 155 /* if fdatasync is triggered, let's do in-place-update */ | 143 int ret = 0; 144 bool need_cp = false; 145 struct writeback_control wbc = { 146 .sync_mode = WB_SYNC_ALL, 147 .nr_to_write = LONG_MAX, 148 .for_reclaim = 0, 149 }; 150 151 if (unlikely(f2fs_readonly(inode->i_sb))) 152 return 0; 153 154 trace_f2fs_sync_file_enter(inode); 155 156 /* if fdatasync is triggered, let's do in-place-update */ |
156 if (datasync) | 157 if (get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks) |
157 set_inode_flag(fi, FI_NEED_IPU); | 158 set_inode_flag(fi, FI_NEED_IPU); |
158 | |
159 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | 159 ret = filemap_write_and_wait_range(inode->i_mapping, start, end); |
160 if (datasync) 161 clear_inode_flag(fi, FI_NEED_IPU); | 160 clear_inode_flag(fi, FI_NEED_IPU); 161 |
162 if (ret) { 163 trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); 164 return ret; 165 } 166 167 /* 168 * if there is no written data, don't waste time to write recovery info. 169 */ 170 if (!is_inode_flag_set(fi, FI_APPEND_WRITE) && | 162 if (ret) { 163 trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); 164 return ret; 165 } 166 167 /* 168 * if there is no written data, don't waste time to write recovery info. 169 */ 170 if (!is_inode_flag_set(fi, FI_APPEND_WRITE) && |
171 !exist_written_data(sbi, inode->i_ino, APPEND_INO)) { | 171 !exist_written_data(sbi, ino, APPEND_INO)) { 172 struct page *i = find_get_page(NODE_MAPPING(sbi), ino); 173 174 /* But we need to avoid that there are some inode updates */ 175 if ((i && PageDirty(i)) || need_inode_block_update(sbi, ino)) { 176 f2fs_put_page(i, 0); 177 goto go_write; 178 } 179 f2fs_put_page(i, 0); 180 |
172 if (is_inode_flag_set(fi, FI_UPDATE_WRITE) || | 181 if (is_inode_flag_set(fi, FI_UPDATE_WRITE) || |
173 exist_written_data(sbi, inode->i_ino, UPDATE_INO)) | 182 exist_written_data(sbi, ino, UPDATE_INO)) |
174 goto flush_out; 175 goto out; 176 } | 183 goto flush_out; 184 goto out; 185 } |
177 | 186go_write: |
178 /* guarantee free sections for fsync */ 179 f2fs_balance_fs(sbi); 180 181 /* 182 * Both of fdatasync() and fsync() are able to be recovered from 183 * sudden-power-off. 184 */ 185 down_read(&fi->i_sem); --- 16 unchanged lines hidden (view full) --- 202 mark_inode_dirty_sync(inode); 203 ret = f2fs_write_inode(inode, NULL); 204 if (ret) 205 goto out; 206 } else { 207 up_write(&fi->i_sem); 208 } 209 } else { | 187 /* guarantee free sections for fsync */ 188 f2fs_balance_fs(sbi); 189 190 /* 191 * Both of fdatasync() and fsync() are able to be recovered from 192 * sudden-power-off. 193 */ 194 down_read(&fi->i_sem); --- 16 unchanged lines hidden (view full) --- 211 mark_inode_dirty_sync(inode); 212 ret = f2fs_write_inode(inode, NULL); 213 if (ret) 214 goto out; 215 } else { 216 up_write(&fi->i_sem); 217 } 218 } else { |
210 /* if there is no written node page, write its inode page */ 211 while (!sync_node_pages(sbi, inode->i_ino, &wbc)) { 212 if (fsync_mark_done(sbi, inode->i_ino)) 213 goto out; | 219sync_nodes: 220 sync_node_pages(sbi, ino, &wbc); 221 222 if (need_inode_block_update(sbi, ino)) { |
214 mark_inode_dirty_sync(inode); 215 ret = f2fs_write_inode(inode, NULL); 216 if (ret) 217 goto out; | 223 mark_inode_dirty_sync(inode); 224 ret = f2fs_write_inode(inode, NULL); 225 if (ret) 226 goto out; |
227 goto sync_nodes; |
|
218 } | 228 } |
219 ret = wait_on_node_pages_writeback(sbi, inode->i_ino); | 229 230 ret = wait_on_node_pages_writeback(sbi, ino); |
220 if (ret) 221 goto out; 222 223 /* once recovery info is written, don't need to tack this */ | 231 if (ret) 232 goto out; 233 234 /* once recovery info is written, don't need to tack this */ |
224 remove_dirty_inode(sbi, inode->i_ino, APPEND_INO); | 235 remove_dirty_inode(sbi, ino, APPEND_INO); |
225 clear_inode_flag(fi, FI_APPEND_WRITE); 226flush_out: | 236 clear_inode_flag(fi, FI_APPEND_WRITE); 237flush_out: |
227 remove_dirty_inode(sbi, inode->i_ino, UPDATE_INO); | 238 remove_dirty_inode(sbi, ino, UPDATE_INO); |
228 clear_inode_flag(fi, FI_UPDATE_WRITE); | 239 clear_inode_flag(fi, FI_UPDATE_WRITE); |
229 ret = f2fs_issue_flush(F2FS_SB(inode->i_sb)); | 240 ret = f2fs_issue_flush(F2FS_I_SB(inode)); |
230 } 231out: 232 trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); 233 return ret; 234} 235 236static pgoff_t __get_first_dirty_index(struct address_space *mapping, 237 pgoff_t pgofs, int whence) --- 110 unchanged lines hidden (view full) --- 348 switch (whence) { 349 case SEEK_SET: 350 case SEEK_CUR: 351 case SEEK_END: 352 return generic_file_llseek_size(file, offset, whence, 353 maxbytes, i_size_read(inode)); 354 case SEEK_DATA: 355 case SEEK_HOLE: | 241 } 242out: 243 trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); 244 return ret; 245} 246 247static pgoff_t __get_first_dirty_index(struct address_space *mapping, 248 pgoff_t pgofs, int whence) --- 110 unchanged lines hidden (view full) --- 359 switch (whence) { 360 case SEEK_SET: 361 case SEEK_CUR: 362 case SEEK_END: 363 return generic_file_llseek_size(file, offset, whence, 364 maxbytes, i_size_read(inode)); 365 case SEEK_DATA: 366 case SEEK_HOLE: |
367 if (offset < 0) 368 return -ENXIO; |
|
356 return f2fs_seek_block(file, offset, whence); 357 } 358 359 return -EINVAL; 360} 361 362static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) 363{ 364 file_accessed(file); 365 vma->vm_ops = &f2fs_file_vm_ops; 366 return 0; 367} 368 369int truncate_data_blocks_range(struct dnode_of_data *dn, int count) 370{ 371 int nr_free = 0, ofs = dn->ofs_in_node; | 369 return f2fs_seek_block(file, offset, whence); 370 } 371 372 return -EINVAL; 373} 374 375static int f2fs_file_mmap(struct file *file, struct vm_area_struct *vma) 376{ 377 file_accessed(file); 378 vma->vm_ops = &f2fs_file_vm_ops; 379 return 0; 380} 381 382int truncate_data_blocks_range(struct dnode_of_data *dn, int count) 383{ 384 int nr_free = 0, ofs = dn->ofs_in_node; |
372 struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb); | 385 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); |
373 struct f2fs_node *raw_node; 374 __le32 *addr; 375 376 raw_node = F2FS_NODE(dn->node_page); 377 addr = blkaddr_in_node(raw_node) + ofs; 378 379 for (; count > 0; count--, addr++, dn->ofs_in_node++) { 380 block_t blkaddr = le32_to_cpu(*addr); --- 46 unchanged lines hidden (view full) --- 427 set_page_dirty(page); 428 429out: 430 f2fs_put_page(page, 1); 431} 432 433int truncate_blocks(struct inode *inode, u64 from, bool lock) 434{ | 386 struct f2fs_node *raw_node; 387 __le32 *addr; 388 389 raw_node = F2FS_NODE(dn->node_page); 390 addr = blkaddr_in_node(raw_node) + ofs; 391 392 for (; count > 0; count--, addr++, dn->ofs_in_node++) { 393 block_t blkaddr = le32_to_cpu(*addr); --- 46 unchanged lines hidden (view full) --- 440 set_page_dirty(page); 441 442out: 443 f2fs_put_page(page, 1); 444} 445 446int truncate_blocks(struct inode *inode, u64 from, bool lock) 447{ |
435 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 448 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
436 unsigned int blocksize = inode->i_sb->s_blocksize; 437 struct dnode_of_data dn; 438 pgoff_t free_from; 439 int count = 0, err = 0; 440 441 trace_f2fs_truncate_blocks_enter(inode, from); 442 443 if (f2fs_has_inline_data(inode)) --- 14 unchanged lines hidden (view full) --- 458 f2fs_unlock_op(sbi); 459 trace_f2fs_truncate_blocks_exit(inode, err); 460 return err; 461 } 462 463 count = ADDRS_PER_PAGE(dn.node_page, F2FS_I(inode)); 464 465 count -= dn.ofs_in_node; | 449 unsigned int blocksize = inode->i_sb->s_blocksize; 450 struct dnode_of_data dn; 451 pgoff_t free_from; 452 int count = 0, err = 0; 453 454 trace_f2fs_truncate_blocks_enter(inode, from); 455 456 if (f2fs_has_inline_data(inode)) --- 14 unchanged lines hidden (view full) --- 471 f2fs_unlock_op(sbi); 472 trace_f2fs_truncate_blocks_exit(inode, err); 473 return err; 474 } 475 476 count = ADDRS_PER_PAGE(dn.node_page, F2FS_I(inode)); 477 478 count -= dn.ofs_in_node; |
466 f2fs_bug_on(count < 0); | 479 f2fs_bug_on(sbi, count < 0); |
467 468 if (dn.ofs_in_node || IS_INODE(dn.node_page)) { 469 truncate_data_blocks_range(&dn, count); 470 free_from += count; 471 } 472 473 f2fs_put_dnode(&dn); 474free_next: --- 67 unchanged lines hidden (view full) --- 542 struct inode *inode = dentry->d_inode; 543 struct f2fs_inode_info *fi = F2FS_I(inode); 544 int err; 545 546 err = inode_change_ok(inode, attr); 547 if (err) 548 return err; 549 | 480 481 if (dn.ofs_in_node || IS_INODE(dn.node_page)) { 482 truncate_data_blocks_range(&dn, count); 483 free_from += count; 484 } 485 486 f2fs_put_dnode(&dn); 487free_next: --- 67 unchanged lines hidden (view full) --- 555 struct inode *inode = dentry->d_inode; 556 struct f2fs_inode_info *fi = F2FS_I(inode); 557 int err; 558 559 err = inode_change_ok(inode, attr); 560 if (err) 561 return err; 562 |
550 if ((attr->ia_valid & ATTR_SIZE) && 551 attr->ia_size != i_size_read(inode)) { | 563 if (attr->ia_valid & ATTR_SIZE) { |
552 err = f2fs_convert_inline_data(inode, attr->ia_size, NULL); 553 if (err) 554 return err; 555 | 564 err = f2fs_convert_inline_data(inode, attr->ia_size, NULL); 565 if (err) 566 return err; 567 |
556 truncate_setsize(inode, attr->ia_size); 557 f2fs_truncate(inode); 558 f2fs_balance_fs(F2FS_SB(inode->i_sb)); | 568 if (attr->ia_size != i_size_read(inode)) { 569 truncate_setsize(inode, attr->ia_size); 570 f2fs_truncate(inode); 571 f2fs_balance_fs(F2FS_I_SB(inode)); 572 } else { 573 /* 574 * giving a chance to truncate blocks past EOF which 575 * are fallocated with FALLOC_FL_KEEP_SIZE. 576 */ 577 f2fs_truncate(inode); 578 } |
559 } 560 561 __setattr_copy(inode, attr); 562 563 if (attr->ia_valid & ATTR_MODE) { 564 err = posix_acl_chmod(inode, get_inode_mode(inode)); 565 if (err || is_inode_flag_set(fi, FI_ACL_MODE)) { 566 inode->i_mode = fi->i_acl_mode; --- 17 unchanged lines hidden (view full) --- 584 .removexattr = generic_removexattr, 585#endif 586 .fiemap = f2fs_fiemap, 587}; 588 589static void fill_zero(struct inode *inode, pgoff_t index, 590 loff_t start, loff_t len) 591{ | 579 } 580 581 __setattr_copy(inode, attr); 582 583 if (attr->ia_valid & ATTR_MODE) { 584 err = posix_acl_chmod(inode, get_inode_mode(inode)); 585 if (err || is_inode_flag_set(fi, FI_ACL_MODE)) { 586 inode->i_mode = fi->i_acl_mode; --- 17 unchanged lines hidden (view full) --- 604 .removexattr = generic_removexattr, 605#endif 606 .fiemap = f2fs_fiemap, 607}; 608 609static void fill_zero(struct inode *inode, pgoff_t index, 610 loff_t start, loff_t len) 611{ |
592 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 612 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
593 struct page *page; 594 595 if (!len) 596 return; 597 598 f2fs_balance_fs(sbi); 599 600 f2fs_lock_op(sbi); --- 32 unchanged lines hidden (view full) --- 633} 634 635static int punch_hole(struct inode *inode, loff_t offset, loff_t len) 636{ 637 pgoff_t pg_start, pg_end; 638 loff_t off_start, off_end; 639 int ret = 0; 640 | 613 struct page *page; 614 615 if (!len) 616 return; 617 618 f2fs_balance_fs(sbi); 619 620 f2fs_lock_op(sbi); --- 32 unchanged lines hidden (view full) --- 653} 654 655static int punch_hole(struct inode *inode, loff_t offset, loff_t len) 656{ 657 pgoff_t pg_start, pg_end; 658 loff_t off_start, off_end; 659 int ret = 0; 660 |
661 if (!S_ISREG(inode->i_mode)) 662 return -EOPNOTSUPP; 663 664 /* skip punching hole beyond i_size */ 665 if (offset >= inode->i_size) 666 return ret; 667 |
|
641 ret = f2fs_convert_inline_data(inode, MAX_INLINE_DATA + 1, NULL); 642 if (ret) 643 return ret; 644 645 pg_start = ((unsigned long long) offset) >> PAGE_CACHE_SHIFT; 646 pg_end = ((unsigned long long) offset + len) >> PAGE_CACHE_SHIFT; 647 648 off_start = offset & (PAGE_CACHE_SIZE - 1); --- 7 unchanged lines hidden (view full) --- 656 fill_zero(inode, pg_start++, off_start, 657 PAGE_CACHE_SIZE - off_start); 658 if (off_end) 659 fill_zero(inode, pg_end, 0, off_end); 660 661 if (pg_start < pg_end) { 662 struct address_space *mapping = inode->i_mapping; 663 loff_t blk_start, blk_end; | 668 ret = f2fs_convert_inline_data(inode, MAX_INLINE_DATA + 1, NULL); 669 if (ret) 670 return ret; 671 672 pg_start = ((unsigned long long) offset) >> PAGE_CACHE_SHIFT; 673 pg_end = ((unsigned long long) offset + len) >> PAGE_CACHE_SHIFT; 674 675 off_start = offset & (PAGE_CACHE_SIZE - 1); --- 7 unchanged lines hidden (view full) --- 683 fill_zero(inode, pg_start++, off_start, 684 PAGE_CACHE_SIZE - off_start); 685 if (off_end) 686 fill_zero(inode, pg_end, 0, off_end); 687 688 if (pg_start < pg_end) { 689 struct address_space *mapping = inode->i_mapping; 690 loff_t blk_start, blk_end; |
664 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 691 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
665 666 f2fs_balance_fs(sbi); 667 668 blk_start = pg_start << PAGE_CACHE_SHIFT; 669 blk_end = pg_end << PAGE_CACHE_SHIFT; 670 truncate_inode_pages_range(mapping, blk_start, 671 blk_end - 1); 672 --- 4 unchanged lines hidden (view full) --- 677 } 678 679 return ret; 680} 681 682static int expand_inode_data(struct inode *inode, loff_t offset, 683 loff_t len, int mode) 684{ | 692 693 f2fs_balance_fs(sbi); 694 695 blk_start = pg_start << PAGE_CACHE_SHIFT; 696 blk_end = pg_end << PAGE_CACHE_SHIFT; 697 truncate_inode_pages_range(mapping, blk_start, 698 blk_end - 1); 699 --- 4 unchanged lines hidden (view full) --- 704 } 705 706 return ret; 707} 708 709static int expand_inode_data(struct inode *inode, loff_t offset, 710 loff_t len, int mode) 711{ |
685 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 712 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
686 pgoff_t index, pg_start, pg_end; 687 loff_t new_size = i_size_read(inode); 688 loff_t off_start, off_end; 689 int ret = 0; 690 691 f2fs_balance_fs(sbi); 692 693 ret = inode_newsize_ok(inode, (len + offset)); --- 79 unchanged lines hidden (view full) --- 773 if (S_ISDIR(mode)) 774 return flags; 775 else if (S_ISREG(mode)) 776 return flags & F2FS_REG_FLMASK; 777 else 778 return flags & F2FS_OTHER_FLMASK; 779} 780 | 713 pgoff_t index, pg_start, pg_end; 714 loff_t new_size = i_size_read(inode); 715 loff_t off_start, off_end; 716 int ret = 0; 717 718 f2fs_balance_fs(sbi); 719 720 ret = inode_newsize_ok(inode, (len + offset)); --- 79 unchanged lines hidden (view full) --- 800 if (S_ISDIR(mode)) 801 return flags; 802 else if (S_ISREG(mode)) 803 return flags & F2FS_REG_FLMASK; 804 else 805 return flags & F2FS_OTHER_FLMASK; 806} 807 |
781long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | 808static int f2fs_ioc_getflags(struct file *filp, unsigned long arg) |
782{ 783 struct inode *inode = file_inode(filp); 784 struct f2fs_inode_info *fi = F2FS_I(inode); | 809{ 810 struct inode *inode = file_inode(filp); 811 struct f2fs_inode_info *fi = F2FS_I(inode); |
785 unsigned int flags; | 812 unsigned int flags = fi->i_flags & FS_FL_USER_VISIBLE; 813 return put_user(flags, (int __user *)arg); 814} 815 816static int f2fs_ioc_setflags(struct file *filp, unsigned long arg) 817{ 818 struct inode *inode = file_inode(filp); 819 struct f2fs_inode_info *fi = F2FS_I(inode); 820 unsigned int flags = fi->i_flags & FS_FL_USER_VISIBLE; 821 unsigned int oldflags; |
786 int ret; 787 | 822 int ret; 823 |
788 switch (cmd) { 789 case F2FS_IOC_GETFLAGS: 790 flags = fi->i_flags & FS_FL_USER_VISIBLE; 791 return put_user(flags, (int __user *) arg); 792 case F2FS_IOC_SETFLAGS: 793 { 794 unsigned int oldflags; | 824 ret = mnt_want_write_file(filp); 825 if (ret) 826 return ret; |
795 | 827 |
796 ret = mnt_want_write_file(filp); 797 if (ret) 798 return ret; | 828 if (!inode_owner_or_capable(inode)) { 829 ret = -EACCES; 830 goto out; 831 } |
799 | 832 |
800 if (!inode_owner_or_capable(inode)) { 801 ret = -EACCES; 802 goto out; 803 } | 833 if (get_user(flags, (int __user *)arg)) { 834 ret = -EFAULT; 835 goto out; 836 } |
804 | 837 |
805 if (get_user(flags, (int __user *) arg)) { 806 ret = -EFAULT; | 838 flags = f2fs_mask_flags(inode->i_mode, flags); 839 840 mutex_lock(&inode->i_mutex); 841 842 oldflags = fi->i_flags; 843 844 if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) { 845 if (!capable(CAP_LINUX_IMMUTABLE)) { 846 mutex_unlock(&inode->i_mutex); 847 ret = -EPERM; |
807 goto out; 808 } | 848 goto out; 849 } |
850 } |
|
809 | 851 |
810 flags = f2fs_mask_flags(inode->i_mode, flags); | 852 flags = flags & FS_FL_USER_MODIFIABLE; 853 flags |= oldflags & ~FS_FL_USER_MODIFIABLE; 854 fi->i_flags = flags; 855 mutex_unlock(&inode->i_mutex); |
811 | 856 |
812 mutex_lock(&inode->i_mutex); | 857 f2fs_set_inode_flags(inode); 858 inode->i_ctime = CURRENT_TIME; 859 mark_inode_dirty(inode); 860out: 861 mnt_drop_write_file(filp); 862 return ret; 863} |
813 | 864 |
814 oldflags = fi->i_flags; | 865static int f2fs_ioc_start_atomic_write(struct file *filp) 866{ 867 struct inode *inode = file_inode(filp); 868 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
815 | 869 |
816 if ((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) { 817 if (!capable(CAP_LINUX_IMMUTABLE)) { 818 mutex_unlock(&inode->i_mutex); 819 ret = -EPERM; 820 goto out; 821 } 822 } | 870 if (!inode_owner_or_capable(inode)) 871 return -EACCES; |
823 | 872 |
824 flags = flags & FS_FL_USER_MODIFIABLE; 825 flags |= oldflags & ~FS_FL_USER_MODIFIABLE; 826 fi->i_flags = flags; 827 mutex_unlock(&inode->i_mutex); | 873 f2fs_balance_fs(sbi); |
828 | 874 |
829 f2fs_set_inode_flags(inode); 830 inode->i_ctime = CURRENT_TIME; 831 mark_inode_dirty(inode); 832out: 833 mnt_drop_write_file(filp); | 875 set_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE); 876 877 return f2fs_convert_inline_data(inode, MAX_INLINE_DATA + 1, NULL); 878} 879 880static int f2fs_ioc_commit_atomic_write(struct file *filp) 881{ 882 struct inode *inode = file_inode(filp); 883 int ret; 884 885 if (!inode_owner_or_capable(inode)) 886 return -EACCES; 887 888 ret = mnt_want_write_file(filp); 889 if (ret) |
834 return ret; | 890 return ret; |
835 } | 891 892 if (f2fs_is_atomic_file(inode)) 893 commit_inmem_pages(inode, false); 894 895 ret = f2fs_sync_file(filp, 0, LONG_MAX, 0); 896 mnt_drop_write_file(filp); 897 return ret; 898} 899 900static int f2fs_ioc_fitrim(struct file *filp, unsigned long arg) 901{ 902 struct inode *inode = file_inode(filp); 903 struct super_block *sb = inode->i_sb; 904 struct request_queue *q = bdev_get_queue(sb->s_bdev); 905 struct fstrim_range range; 906 int ret; 907 908 if (!capable(CAP_SYS_ADMIN)) 909 return -EPERM; 910 911 if (!blk_queue_discard(q)) 912 return -EOPNOTSUPP; 913 914 if (copy_from_user(&range, (struct fstrim_range __user *)arg, 915 sizeof(range))) 916 return -EFAULT; 917 918 range.minlen = max((unsigned int)range.minlen, 919 q->limits.discard_granularity); 920 ret = f2fs_trim_fs(F2FS_SB(sb), &range); 921 if (ret < 0) 922 return ret; 923 924 if (copy_to_user((struct fstrim_range __user *)arg, &range, 925 sizeof(range))) 926 return -EFAULT; 927 return 0; 928} 929 930long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 931{ 932 switch (cmd) { 933 case F2FS_IOC_GETFLAGS: 934 return f2fs_ioc_getflags(filp, arg); 935 case F2FS_IOC_SETFLAGS: 936 return f2fs_ioc_setflags(filp, arg); 937 case F2FS_IOC_START_ATOMIC_WRITE: 938 return f2fs_ioc_start_atomic_write(filp); 939 case F2FS_IOC_COMMIT_ATOMIC_WRITE: 940 return f2fs_ioc_commit_atomic_write(filp); 941 case FITRIM: 942 return f2fs_ioc_fitrim(filp, arg); |
836 default: 837 return -ENOTTY; 838 } 839} 840 841#ifdef CONFIG_COMPAT 842long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 843{ --- 31 unchanged lines hidden --- | 943 default: 944 return -ENOTTY; 945 } 946} 947 948#ifdef CONFIG_COMPAT 949long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 950{ --- 31 unchanged lines hidden --- |