@@ -586,16 +586,20 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
586586 */
587587int ext2_delete_entry (struct ext2_dir_entry_2 * dir , struct page * page )
588588{
589- struct inode * inode = page -> mapping -> host ;
590- char * kaddr = (char * )((unsigned long )dir & PAGE_MASK );
591- unsigned from = offset_in_page (dir ) & ~(ext2_chunk_size (inode )- 1 );
592- unsigned to = offset_in_page (dir ) +
593- ext2_rec_len_from_disk (dir -> rec_len );
589+ struct folio * folio = page_folio (page );
590+ struct inode * inode = folio -> mapping -> host ;
591+ size_t from , to ;
592+ char * kaddr ;
594593 loff_t pos ;
595- ext2_dirent * pde = NULL ;
596- ext2_dirent * de = (ext2_dirent * )(kaddr + from );
594+ ext2_dirent * de , * pde = NULL ;
597595 int err ;
598596
597+ from = offset_in_folio (folio , dir );
598+ to = from + ext2_rec_len_from_disk (dir -> rec_len );
599+ kaddr = (char * )dir - from ;
600+ from &= ~(ext2_chunk_size (inode )- 1 );
601+ de = (ext2_dirent * )(kaddr + from );
602+
599603 while ((char * )de < (char * )dir ) {
600604 if (de -> rec_len == 0 ) {
601605 ext2_error (inode -> i_sb , __func__ ,
@@ -606,18 +610,18 @@ int ext2_delete_entry(struct ext2_dir_entry_2 *dir, struct page *page)
606610 de = ext2_next_entry (de );
607611 }
608612 if (pde )
609- from = offset_in_page ( pde );
610- pos = page_offset ( page ) + from ;
611- lock_page ( page );
612- err = ext2_prepare_chunk (page , pos , to - from );
613+ from = offset_in_folio ( folio , pde );
614+ pos = folio_pos ( folio ) + from ;
615+ folio_lock ( folio );
616+ err = ext2_prepare_chunk (& folio -> page , pos , to - from );
613617 if (err ) {
614- unlock_page ( page );
618+ folio_unlock ( folio );
615619 return err ;
616620 }
617621 if (pde )
618622 pde -> rec_len = ext2_rec_len_to_disk (to - from );
619623 dir -> inode = 0 ;
620- ext2_commit_chunk (page , pos , to - from );
624+ ext2_commit_chunk (& folio -> page , pos , to - from );
621625 inode -> i_mtime = inode_set_ctime_current (inode );
622626 EXT2_I (inode )-> i_flags &= ~EXT2_BTREE_FL ;
623627 mark_inode_dirty (inode );
0 commit comments