file.c (84c9c2de0626567c0d964ee5fa1ae3310911ddf8) file.c (ef8d563f184e1112651f2cbde383d43e599334e8)
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>

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

558 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
559 struct f2fs_node *raw_node;
560 int nr_free = 0, ofs = dn->ofs_in_node, len = count;
561 __le32 *addr;
562 int base = 0;
563 bool compressed_cluster = false;
564 int cluster_index = 0, valid_blocks = 0;
565 int cluster_size = F2FS_I(dn->inode)->i_cluster_size;
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>

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

558 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
559 struct f2fs_node *raw_node;
560 int nr_free = 0, ofs = dn->ofs_in_node, len = count;
561 __le32 *addr;
562 int base = 0;
563 bool compressed_cluster = false;
564 int cluster_index = 0, valid_blocks = 0;
565 int cluster_size = F2FS_I(dn->inode)->i_cluster_size;
566 bool released = !F2FS_I(dn->inode)->i_compr_blocks;
566
567 if (IS_INODE(dn->node_page) && f2fs_has_extra_attr(dn->inode))
568 base = get_extra_isize(dn->inode);
569
570 raw_node = F2FS_NODE(dn->node_page);
571 addr = blkaddr_in_node(raw_node) + base + ofs;
572
573 /* Assumption: truncateion starts with cluster */

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

596 if (compressed_cluster)
597 valid_blocks++;
598 }
599
600 if (dn->ofs_in_node == 0 && IS_INODE(dn->node_page))
601 clear_inode_flag(dn->inode, FI_FIRST_BLOCK_WRITTEN);
602
603 f2fs_invalidate_blocks(sbi, blkaddr);
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 */

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

597 if (compressed_cluster)
598 valid_blocks++;
599 }
600
601 if (dn->ofs_in_node == 0 && IS_INODE(dn->node_page))
602 clear_inode_flag(dn->inode, FI_FIRST_BLOCK_WRITTEN);
603
604 f2fs_invalidate_blocks(sbi, blkaddr);
604 nr_free++;
605
606 if (!released || blkaddr != COMPRESS_ADDR)
607 nr_free++;
605 }
606
607 if (compressed_cluster)
608 f2fs_i_compr_blocks_update(dn->inode, valid_blocks, false);
609
610 if (nr_free) {
611 pgoff_t fofs;
612 /*

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

3429
3430 if (!f2fs_compressed_file(inode))
3431 return -EINVAL;
3432
3433 blocks = F2FS_I(inode)->i_compr_blocks;
3434 return put_user(blocks, (u64 __user *)arg);
3435}
3436
608 }
609
610 if (compressed_cluster)
611 f2fs_i_compr_blocks_update(dn->inode, valid_blocks, false);
612
613 if (nr_free) {
614 pgoff_t fofs;
615 /*

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

3432
3433 if (!f2fs_compressed_file(inode))
3434 return -EINVAL;
3435
3436 blocks = F2FS_I(inode)->i_compr_blocks;
3437 return put_user(blocks, (u64 __user *)arg);
3438}
3439
3440static int release_compress_blocks(struct dnode_of_data *dn, pgoff_t count)
3441{
3442 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
3443 unsigned int released_blocks = 0;
3444 int cluster_size = F2FS_I(dn->inode)->i_cluster_size;
3445 block_t blkaddr;
3446 int i;
3447
3448 for (i = 0; i < count; i++) {
3449 blkaddr = data_blkaddr(dn->inode, dn->node_page,
3450 dn->ofs_in_node + i);
3451
3452 if (!__is_valid_data_blkaddr(blkaddr))
3453 continue;
3454 if (unlikely(!f2fs_is_valid_blkaddr(sbi, blkaddr,
3455 DATA_GENERIC_ENHANCE)))
3456 return -EFSCORRUPTED;
3457 }
3458
3459 while (count) {
3460 int compr_blocks = 0;
3461
3462 for (i = 0; i < cluster_size; i++, dn->ofs_in_node++) {
3463 blkaddr = f2fs_data_blkaddr(dn);
3464
3465 if (i == 0) {
3466 if (blkaddr == COMPRESS_ADDR)
3467 continue;
3468 dn->ofs_in_node += cluster_size;
3469 goto next;
3470 }
3471
3472 if (__is_valid_data_blkaddr(blkaddr))
3473 compr_blocks++;
3474
3475 if (blkaddr != NEW_ADDR)
3476 continue;
3477
3478 dn->data_blkaddr = NULL_ADDR;
3479 f2fs_set_data_blkaddr(dn);
3480 }
3481
3482 f2fs_i_compr_blocks_update(dn->inode, compr_blocks, false);
3483 dec_valid_block_count(sbi, dn->inode,
3484 cluster_size - compr_blocks);
3485
3486 released_blocks += cluster_size - compr_blocks;
3487next:
3488 count -= cluster_size;
3489 }
3490
3491 return released_blocks;
3492}
3493
3494static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
3495{
3496 struct inode *inode = file_inode(filp);
3497 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
3498 pgoff_t page_idx = 0, last_idx;
3499 unsigned int released_blocks = 0;
3500 int ret;
3501 int writecount;
3502
3503 if (!f2fs_sb_has_compression(F2FS_I_SB(inode)))
3504 return -EOPNOTSUPP;
3505
3506 if (!f2fs_compressed_file(inode))
3507 return -EINVAL;
3508
3509 if (f2fs_readonly(sbi->sb))
3510 return -EROFS;
3511
3512 ret = mnt_want_write_file(filp);
3513 if (ret)
3514 return ret;
3515
3516 f2fs_balance_fs(F2FS_I_SB(inode), true);
3517
3518 inode_lock(inode);
3519
3520 writecount = atomic_read(&inode->i_writecount);
3521 if ((filp->f_mode & FMODE_WRITE && writecount != 1) || writecount) {
3522 ret = -EBUSY;
3523 goto out;
3524 }
3525
3526 if (IS_IMMUTABLE(inode)) {
3527 ret = -EINVAL;
3528 goto out;
3529 }
3530
3531 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
3532 if (ret)
3533 goto out;
3534
3535 if (!F2FS_I(inode)->i_compr_blocks)
3536 goto out;
3537
3538 F2FS_I(inode)->i_flags |= F2FS_IMMUTABLE_FL;
3539 f2fs_set_inode_flags(inode);
3540 inode->i_ctime = current_time(inode);
3541 f2fs_mark_inode_dirty_sync(inode, true);
3542
3543 down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3544 down_write(&F2FS_I(inode)->i_mmap_sem);
3545
3546 last_idx = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE);
3547
3548 while (page_idx < last_idx) {
3549 struct dnode_of_data dn;
3550 pgoff_t end_offset, count;
3551
3552 set_new_dnode(&dn, inode, NULL, NULL, 0);
3553 ret = f2fs_get_dnode_of_data(&dn, page_idx, LOOKUP_NODE);
3554 if (ret) {
3555 if (ret == -ENOENT) {
3556 page_idx = f2fs_get_next_page_offset(&dn,
3557 page_idx);
3558 ret = 0;
3559 continue;
3560 }
3561 break;
3562 }
3563
3564 end_offset = ADDRS_PER_PAGE(dn.node_page, inode);
3565 count = min(end_offset - dn.ofs_in_node, last_idx - page_idx);
3566 count = roundup(count, F2FS_I(inode)->i_cluster_size);
3567
3568 ret = release_compress_blocks(&dn, count);
3569
3570 f2fs_put_dnode(&dn);
3571
3572 if (ret < 0)
3573 break;
3574
3575 page_idx += count;
3576 released_blocks += ret;
3577 }
3578
3579 up_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
3580 up_write(&F2FS_I(inode)->i_mmap_sem);
3581out:
3582 inode_unlock(inode);
3583
3584 mnt_drop_write_file(filp);
3585
3586 if (ret >= 0) {
3587 ret = put_user(released_blocks, (u64 __user *)arg);
3588 } else if (released_blocks && F2FS_I(inode)->i_compr_blocks) {
3589 set_sbi_flag(sbi, SBI_NEED_FSCK);
3590 f2fs_warn(sbi, "%s: partial blocks were released i_ino=%lx "
3591 "iblocks=%llu, released=%u, compr_blocks=%llu, "
3592 "run fsck to fix.",
3593 __func__, inode->i_ino, inode->i_blocks,
3594 released_blocks,
3595 F2FS_I(inode)->i_compr_blocks);
3596 }
3597
3598 return ret;
3599}
3600
3437long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
3438{
3439 if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
3440 return -EIO;
3441 if (!f2fs_is_checkpoint_ready(F2FS_I_SB(file_inode(filp))))
3442 return -ENOSPC;
3443
3444 switch (cmd) {

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

3511 case FS_IOC_MEASURE_VERITY:
3512 return f2fs_ioc_measure_verity(filp, arg);
3513 case F2FS_IOC_GET_VOLUME_NAME:
3514 return f2fs_get_volume_name(filp, arg);
3515 case F2FS_IOC_SET_VOLUME_NAME:
3516 return f2fs_set_volume_name(filp, arg);
3517 case F2FS_IOC_GET_COMPRESS_BLOCKS:
3518 return f2fs_get_compress_blocks(filp, arg);
3601long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
3602{
3603 if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
3604 return -EIO;
3605 if (!f2fs_is_checkpoint_ready(F2FS_I_SB(file_inode(filp))))
3606 return -ENOSPC;
3607
3608 switch (cmd) {

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

3675 case FS_IOC_MEASURE_VERITY:
3676 return f2fs_ioc_measure_verity(filp, arg);
3677 case F2FS_IOC_GET_VOLUME_NAME:
3678 return f2fs_get_volume_name(filp, arg);
3679 case F2FS_IOC_SET_VOLUME_NAME:
3680 return f2fs_set_volume_name(filp, arg);
3681 case F2FS_IOC_GET_COMPRESS_BLOCKS:
3682 return f2fs_get_compress_blocks(filp, arg);
3683 case F2FS_IOC_RELEASE_COMPRESS_BLOCKS:
3684 return f2fs_release_compress_blocks(filp, arg);
3519 default:
3520 return -ENOTTY;
3521 }
3522}
3523
3524static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
3525{
3526 struct file *file = iocb->ki_filp;

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

3678 case F2FS_IOC_SET_PIN_FILE:
3679 case F2FS_IOC_PRECACHE_EXTENTS:
3680 case F2FS_IOC_RESIZE_FS:
3681 case FS_IOC_ENABLE_VERITY:
3682 case FS_IOC_MEASURE_VERITY:
3683 case F2FS_IOC_GET_VOLUME_NAME:
3684 case F2FS_IOC_SET_VOLUME_NAME:
3685 case F2FS_IOC_GET_COMPRESS_BLOCKS:
3685 default:
3686 return -ENOTTY;
3687 }
3688}
3689
3690static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
3691{
3692 struct file *file = iocb->ki_filp;

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

3844 case F2FS_IOC_SET_PIN_FILE:
3845 case F2FS_IOC_PRECACHE_EXTENTS:
3846 case F2FS_IOC_RESIZE_FS:
3847 case FS_IOC_ENABLE_VERITY:
3848 case FS_IOC_MEASURE_VERITY:
3849 case F2FS_IOC_GET_VOLUME_NAME:
3850 case F2FS_IOC_SET_VOLUME_NAME:
3851 case F2FS_IOC_GET_COMPRESS_BLOCKS:
3852 case F2FS_IOC_RELEASE_COMPRESS_BLOCKS:
3686 break;
3687 default:
3688 return -ENOIOCTLCMD;
3689 }
3690 return f2fs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
3691}
3692#endif
3693

--- 17 unchanged lines hidden ---
3853 break;
3854 default:
3855 return -ENOIOCTLCMD;
3856 }
3857 return f2fs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
3858}
3859#endif
3860

--- 17 unchanged lines hidden ---