@@ -21,8 +21,12 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
21
21
struct hfs_btree * tree ;
22
22
struct hfs_btree_header_rec * head ;
23
23
struct address_space * mapping ;
24
- struct page * page ;
24
+ struct folio * folio ;
25
+ struct buffer_head * bh ;
25
26
unsigned int size ;
27
+ u16 dblock ;
28
+ sector_t start_block ;
29
+ loff_t offset ;
26
30
27
31
tree = kzalloc (sizeof (* tree ), GFP_KERNEL );
28
32
if (!tree )
@@ -75,12 +79,40 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
75
79
unlock_new_inode (tree -> inode );
76
80
77
81
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 ))
80
84
goto free_inode ;
81
85
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
+
82
114
/* 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 ) +
84
116
sizeof (struct hfs_bnode_desc ));
85
117
tree -> root = be32_to_cpu (head -> root );
86
118
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
95
127
96
128
size = tree -> node_size ;
97
129
if (!is_power_of_2 (size ))
98
- goto fail_page ;
130
+ goto fail_folio ;
99
131
if (!tree -> node_count )
100
- goto fail_page ;
132
+ goto fail_folio ;
101
133
switch (id ) {
102
134
case HFS_EXT_CNID :
103
135
if (tree -> max_key_len != HFS_MAX_EXT_KEYLEN ) {
104
136
pr_err ("invalid extent max_key_len %d\n" ,
105
137
tree -> max_key_len );
106
- goto fail_page ;
138
+ goto fail_folio ;
107
139
}
108
140
break ;
109
141
case HFS_CAT_CNID :
110
142
if (tree -> max_key_len != HFS_MAX_CAT_KEYLEN ) {
111
143
pr_err ("invalid catalog max_key_len %d\n" ,
112
144
tree -> max_key_len );
113
- goto fail_page ;
145
+ goto fail_folio ;
114
146
}
115
147
break ;
116
148
default :
@@ -121,12 +153,15 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id, btree_keycmp ke
121
153
tree -> pages_per_bnode = (tree -> node_size + PAGE_SIZE - 1 ) >> PAGE_SHIFT ;
122
154
123
155
kunmap_local (head );
124
- put_page (page );
156
+ folio_unlock (folio );
157
+ folio_put (folio );
125
158
return tree ;
126
159
127
- fail_page :
160
+ fail_folio :
128
161
kunmap_local (head );
129
- put_page (page );
162
+ put_folio :
163
+ folio_unlock (folio );
164
+ folio_put (folio );
130
165
free_inode :
131
166
tree -> inode -> i_mapping -> a_ops = & hfs_aops ;
132
167
iput (tree -> inode );
0 commit comments