@@ -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