@@ -605,10 +605,14 @@ vm_fault_t bch2_page_mkwrite(struct vm_fault *vmf)
605
605
struct address_space * mapping = file -> f_mapping ;
606
606
struct bch_fs * c = inode -> v .i_sb -> s_fs_info ;
607
607
struct bch2_folio_reservation res ;
608
- unsigned len ;
609
- loff_t isize ;
610
608
vm_fault_t ret ;
611
609
610
+ loff_t file_offset = round_down (vmf -> pgoff << PAGE_SHIFT , block_bytes (c ));
611
+ unsigned offset = file_offset - folio_pos (folio );
612
+ unsigned len = max (PAGE_SIZE , block_bytes (c ));
613
+
614
+ BUG_ON (offset + len > folio_size (folio ));
615
+
612
616
bch2_folio_reservation_init (c , inode , & res );
613
617
614
618
sb_start_pagefault (inode -> v .i_sb );
@@ -623,24 +627,24 @@ vm_fault_t bch2_page_mkwrite(struct vm_fault *vmf)
623
627
bch2_pagecache_add_get (inode );
624
628
625
629
folio_lock (folio );
626
- isize = i_size_read (& inode -> v );
630
+ u64 isize = i_size_read (& inode -> v );
627
631
628
- if (folio -> mapping != mapping || folio_pos ( folio ) >= isize ) {
632
+ if (folio -> mapping != mapping || file_offset >= isize ) {
629
633
folio_unlock (folio );
630
634
ret = VM_FAULT_NOPAGE ;
631
635
goto out ;
632
636
}
633
637
634
- len = min_t (loff_t , folio_size ( folio ) , isize - folio_pos ( folio ) );
638
+ len = min_t (unsigned , len , isize - file_offset );
635
639
636
640
if (bch2_folio_set (c , inode_inum (inode ), & folio , 1 ) ?:
637
- bch2_folio_reservation_get (c , inode , folio , & res , 0 , len )) {
641
+ bch2_folio_reservation_get (c , inode , folio , & res , offset , len )) {
638
642
folio_unlock (folio );
639
643
ret = VM_FAULT_SIGBUS ;
640
644
goto out ;
641
645
}
642
646
643
- bch2_set_folio_dirty (c , inode , folio , & res , 0 , len );
647
+ bch2_set_folio_dirty (c , inode , folio , & res , offset , len );
644
648
bch2_folio_reservation_put (c , inode , & res );
645
649
646
650
folio_wait_stable (folio );
0 commit comments