Skip to content

Commit 0914882

Browse files
Yuling Dongnamjaejeon
authored andcommitted
exfat: reduce unnecessary writes during mmap write
During mmap write, exfat_page_mkwrite() currently extends valid_size to the end of the VMA range. For a large mapping, this can push valid_size far beyond the page that actually triggered the fault, resulting in unnecessary writes. valid_size only needs to extend to the end of the page being written. Signed-off-by: Yuling Dong <yuling-dong@qq.com> Reviewed-by: Yuezhang Mo <Yuezhang.Mo@sony.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
1 parent 8ffe56b commit 0914882

1 file changed

Lines changed: 6 additions & 9 deletions

File tree

fs/exfat/file.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -708,21 +708,18 @@ static ssize_t exfat_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
708708
static vm_fault_t exfat_page_mkwrite(struct vm_fault *vmf)
709709
{
710710
int err;
711-
struct vm_area_struct *vma = vmf->vma;
712-
struct file *file = vma->vm_file;
713-
struct inode *inode = file_inode(file);
711+
struct inode *inode = file_inode(vmf->vma->vm_file);
714712
struct exfat_inode_info *ei = EXFAT_I(inode);
715-
loff_t start, end;
713+
loff_t new_valid_size;
716714

717715
if (!inode_trylock(inode))
718716
return VM_FAULT_RETRY;
719717

720-
start = ((loff_t)vma->vm_pgoff << PAGE_SHIFT);
721-
end = min_t(loff_t, i_size_read(inode),
722-
start + vma->vm_end - vma->vm_start);
718+
new_valid_size = ((loff_t)vmf->pgoff + 1) << PAGE_SHIFT;
719+
new_valid_size = min(new_valid_size, i_size_read(inode));
723720

724-
if (ei->valid_size < end) {
725-
err = exfat_extend_valid_size(inode, end);
721+
if (ei->valid_size < new_valid_size) {
722+
err = exfat_extend_valid_size(inode, new_valid_size);
726723
if (err < 0) {
727724
inode_unlock(inode);
728725
return vmf_fs_error(err);

0 commit comments

Comments
 (0)