@@ -6075,7 +6075,7 @@ static int ext4_bh_unmapped(handle_t *handle, struct inode *inode,
60756075vm_fault_t ext4_page_mkwrite (struct vm_fault * vmf )
60766076{
60776077 struct vm_area_struct * vma = vmf -> vma ;
6078- struct page * page = vmf -> page ;
6078+ struct folio * folio = page_folio ( vmf -> page ) ;
60796079 loff_t size ;
60806080 unsigned long len ;
60816081 int err ;
@@ -6119,37 +6119,36 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
61196119 goto out_ret ;
61206120 }
61216121
6122- lock_page ( page );
6122+ folio_lock ( folio );
61236123 size = i_size_read (inode );
61246124 /* Page got truncated from under us? */
6125- if (page -> mapping != mapping || page_offset ( page ) > size ) {
6126- unlock_page ( page );
6125+ if (folio -> mapping != mapping || folio_pos ( folio ) > size ) {
6126+ folio_unlock ( folio );
61276127 ret = VM_FAULT_NOPAGE ;
61286128 goto out ;
61296129 }
61306130
6131- if (page -> index == size >> PAGE_SHIFT )
6132- len = size & ~PAGE_MASK ;
6133- else
6134- len = PAGE_SIZE ;
6131+ len = folio_size (folio );
6132+ if (folio_pos (folio ) + len > size )
6133+ len = size - folio_pos (folio );
61356134 /*
61366135 * Return if we have all the buffers mapped. This avoids the need to do
61376136 * journal_start/journal_stop which can block and take a long time
61386137 *
61396138 * This cannot be done for data journalling, as we have to add the
61406139 * inode to the transaction's list to writeprotect pages on commit.
61416140 */
6142- if (page_has_buffers ( page )) {
6143- if (!ext4_walk_page_buffers (NULL , inode , page_buffers ( page ),
6141+ if (folio_buffers ( folio )) {
6142+ if (!ext4_walk_page_buffers (NULL , inode , folio_buffers ( folio ),
61446143 0 , len , NULL ,
61456144 ext4_bh_unmapped )) {
61466145 /* Wait so that we don't change page under IO */
6147- wait_for_stable_page ( page );
6146+ folio_wait_stable ( folio );
61486147 ret = VM_FAULT_LOCKED ;
61496148 goto out ;
61506149 }
61516150 }
6152- unlock_page ( page );
6151+ folio_unlock ( folio );
61536152 /* OK, we need to fill the hole... */
61546153 if (ext4_should_dioread_nolock (inode ))
61556154 get_block = ext4_get_block_unwritten ;
@@ -6170,26 +6169,25 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
61706169 if (!ext4_should_journal_data (inode )) {
61716170 err = block_page_mkwrite (vma , vmf , get_block );
61726171 } else {
6173- lock_page ( page );
6172+ folio_lock ( folio );
61746173 size = i_size_read (inode );
61756174 /* Page got truncated from under us? */
6176- if (page -> mapping != mapping || page_offset ( page ) > size ) {
6175+ if (folio -> mapping != mapping || folio_pos ( folio ) > size ) {
61776176 ret = VM_FAULT_NOPAGE ;
61786177 goto out_error ;
61796178 }
61806179
6181- if (page -> index == size >> PAGE_SHIFT )
6182- len = size & ~PAGE_MASK ;
6183- else
6184- len = PAGE_SIZE ;
6180+ len = folio_size (folio );
6181+ if (folio_pos (folio ) + len > size )
6182+ len = size - folio_pos (folio );
61856183
6186- err = __block_write_begin (page , 0 , len , ext4_get_block );
6184+ err = __block_write_begin (& folio -> page , 0 , len , ext4_get_block );
61876185 if (!err ) {
61886186 ret = VM_FAULT_SIGBUS ;
6189- if (ext4_journal_page_buffers (handle , page , len ))
6187+ if (ext4_journal_page_buffers (handle , & folio -> page , len ))
61906188 goto out_error ;
61916189 } else {
6192- unlock_page ( page );
6190+ folio_unlock ( folio );
61936191 }
61946192 }
61956193 ext4_journal_stop (handle );
@@ -6202,7 +6200,7 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
62026200 sb_end_pagefault (inode -> i_sb );
62036201 return ret ;
62046202out_error :
6205- unlock_page ( page );
6203+ folio_unlock ( folio );
62066204 ext4_journal_stop (handle );
62076205 goto out ;
62086206}
0 commit comments