@@ -21,8 +21,12 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
2121	struct  hfs_btree  * tree ;
2222	struct  hfs_btree_header_rec  * head ;
2323	struct  address_space  * mapping ;
24- 	struct  page  * page ;
24+ 	struct  folio  * folio ;
25+ 	struct  buffer_head  * bh ;
2526	unsigned int   size ;
27+ 	u16  dblock ;
28+ 	sector_t  start_block ;
29+ 	loff_t  offset ;
2630
2731	tree  =  kzalloc (sizeof (* tree ), GFP_KERNEL );
2832	if  (!tree )
@@ -75,12 +79,40 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
7579	unlock_new_inode (tree -> inode );
7680
7781	mapping  =  tree -> inode -> i_mapping ;
78- 	page  =  read_mapping_page (mapping , 0 ,  NULL );
79- 	if  (IS_ERR (page ))
82+ 	folio  =  filemap_grab_folio (mapping , 0 );
83+ 	if  (IS_ERR (folio ))
8084		goto free_inode ;
8185
86+ 	folio_zero_range (folio , 0 , folio_size (folio ));
87+ 
88+ 	dblock  =  hfs_ext_find_block (HFS_I (tree -> inode )-> first_extents , 0 );
89+ 	start_block  =  HFS_SB (sb )-> fs_start  +  (dblock  *  HFS_SB (sb )-> fs_div );
90+ 
91+ 	size  =  folio_size (folio );
92+ 	offset  =  0 ;
93+ 	while  (size  >  0 ) {
94+ 		size_t  len ;
95+ 
96+ 		bh  =  sb_bread (sb , start_block );
97+ 		if  (!bh ) {
98+ 			pr_err ("unable to read tree header\n" );
99+ 			goto put_folio ;
100+ 		}
101+ 
102+ 		len  =  min_t (size_t , folio_size (folio ), sb -> s_blocksize );
103+ 		memcpy_to_folio (folio , offset , bh -> b_data , sb -> s_blocksize );
104+ 
105+ 		brelse (bh );
106+ 
107+ 		start_block ++ ;
108+ 		offset  +=  len ;
109+ 		size  -=  len ;
110+ 	}
111+ 
112+ 	folio_mark_uptodate (folio );
113+ 
82114	/* Load the header */ 
83- 	head  =  (struct  hfs_btree_header_rec  * )(kmap_local_page ( page ) + 
115+ 	head  =  (struct  hfs_btree_header_rec  * )(kmap_local_folio ( folio ,  0 ) + 
84116					       sizeof (struct  hfs_bnode_desc ));
85117	tree -> root  =  be32_to_cpu (head -> root );
86118	tree -> leaf_count  =  be32_to_cpu (head -> leaf_count );
@@ -95,22 +127,22 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
95127
96128	size  =  tree -> node_size ;
97129	if  (!is_power_of_2 (size ))
98- 		goto fail_page ;
130+ 		goto fail_folio ;
99131	if  (!tree -> node_count )
100- 		goto fail_page ;
132+ 		goto fail_folio ;
101133	switch  (id ) {
102134	case  HFS_EXT_CNID :
103135		if  (tree -> max_key_len  !=  HFS_MAX_EXT_KEYLEN ) {
104136			pr_err ("invalid extent max_key_len %d\n" ,
105137			       tree -> max_key_len );
106- 			goto fail_page ;
138+ 			goto fail_folio ;
107139		}
108140		break ;
109141	case  HFS_CAT_CNID :
110142		if  (tree -> max_key_len  !=  HFS_MAX_CAT_KEYLEN ) {
111143			pr_err ("invalid catalog max_key_len %d\n" ,
112144			       tree -> max_key_len );
113- 			goto fail_page ;
145+ 			goto fail_folio ;
114146		}
115147		break ;
116148	default :
@@ -121,12 +153,15 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
121153	tree -> pages_per_bnode  =  (tree -> node_size  +  PAGE_SIZE  -  1 ) >> PAGE_SHIFT ;
122154
123155	kunmap_local (head );
124- 	put_page (page );
156+ 	folio_unlock (folio );
157+ 	folio_put (folio );
125158	return  tree ;
126159
127- fail_page :
160+ fail_folio :
128161	kunmap_local (head );
129- 	put_page (page );
162+ put_folio :
163+ 	folio_unlock (folio );
164+ 	folio_put (folio );
130165free_inode :
131166	tree -> inode -> i_mapping -> a_ops  =  & hfs_aops ;
132167	iput (tree -> inode );
0 commit comments