@@ -26,12 +26,6 @@ const struct file_operations minix_dir_operations = {
2626 .fsync = generic_file_fsync ,
2727};
2828
29- static inline void dir_put_page (struct page * page )
30- {
31- kunmap (page );
32- put_page (page );
33- }
34-
3529/*
3630 * Return the offset into page `page_nr' of the last valid
3731 * byte in that page, plus one.
@@ -70,13 +64,14 @@ static int minix_handle_dirsync(struct inode *dir)
7064 return err ;
7165}
7266
73- static struct page * dir_get_page (struct inode * dir , unsigned long n )
67+ static void * dir_get_page (struct inode * dir , unsigned long n , struct page * * p )
7468{
7569 struct address_space * mapping = dir -> i_mapping ;
7670 struct page * page = read_mapping_page (mapping , n , NULL );
77- if (!IS_ERR (page ))
78- kmap (page );
79- return page ;
71+ if (IS_ERR (page ))
72+ return ERR_CAST (page );
73+ * p = page ;
74+ return kmap_local_page (page );
8075}
8176
8277static inline void * minix_next_entry (void * de , struct minix_sb_info * sbi )
@@ -104,11 +99,11 @@ static int minix_readdir(struct file *file, struct dir_context *ctx)
10499
105100 for ( ; n < npages ; n ++ , offset = 0 ) {
106101 char * p , * kaddr , * limit ;
107- struct page * page = dir_get_page ( inode , n ) ;
102+ struct page * page ;
108103
109- if (IS_ERR (page ))
104+ kaddr = dir_get_page (inode , n , & page );
105+ if (IS_ERR (kaddr ))
110106 continue ;
111- kaddr = (char * )page_address (page );
112107 p = kaddr + offset ;
113108 limit = kaddr + minix_last_byte (inode , n ) - chunk_size ;
114109 for ( ; p <= limit ; p = minix_next_entry (p , sbi )) {
@@ -127,13 +122,13 @@ static int minix_readdir(struct file *file, struct dir_context *ctx)
127122 unsigned l = strnlen (name , sbi -> s_namelen );
128123 if (!dir_emit (ctx , name , l ,
129124 inumber , DT_UNKNOWN )) {
130- dir_put_page (page );
125+ unmap_and_put_page (page , p );
131126 return 0 ;
132127 }
133128 }
134129 ctx -> pos += chunk_size ;
135130 }
136- dir_put_page (page );
131+ unmap_and_put_page (page , kaddr );
137132 }
138133 return 0 ;
139134}
@@ -173,11 +168,10 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
173168 for (n = 0 ; n < npages ; n ++ ) {
174169 char * kaddr , * limit ;
175170
176- page = dir_get_page (dir , n );
177- if (IS_ERR (page ))
171+ kaddr = dir_get_page (dir , n , & page );
172+ if (IS_ERR (kaddr ))
178173 continue ;
179174
180- kaddr = (char * )page_address (page );
181175 limit = kaddr + minix_last_byte (dir , n ) - sbi -> s_dirsize ;
182176 for (p = kaddr ; p <= limit ; p = minix_next_entry (p , sbi )) {
183177 if (sbi -> s_version == MINIX_V3 ) {
@@ -194,7 +188,7 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
194188 if (namecompare (namelen , sbi -> s_namelen , name , namx ))
195189 goto found ;
196190 }
197- dir_put_page (page );
191+ unmap_and_put_page (page , kaddr );
198192 }
199193 return NULL ;
200194
@@ -229,12 +223,10 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
229223 for (n = 0 ; n <= npages ; n ++ ) {
230224 char * limit , * dir_end ;
231225
232- page = dir_get_page (dir , n );
233- err = PTR_ERR (page );
234- if (IS_ERR (page ))
235- goto out ;
226+ kaddr = dir_get_page (dir , n , & page );
227+ if (IS_ERR (kaddr ))
228+ return PTR_ERR (kaddr );
236229 lock_page (page );
237- kaddr = (char * )page_address (page );
238230 dir_end = kaddr + minix_last_byte (dir , n );
239231 limit = kaddr + PAGE_SIZE - sbi -> s_dirsize ;
240232 for (p = kaddr ; p <= limit ; p = minix_next_entry (p , sbi )) {
@@ -262,13 +254,13 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
262254 goto out_unlock ;
263255 }
264256 unlock_page (page );
265- dir_put_page (page );
257+ unmap_and_put_page (page , kaddr );
266258 }
267259 BUG ();
268260 return - EINVAL ;
269261
270262got_it :
271- pos = page_offset (page ) + p - ( char * ) page_address ( page );
263+ pos = page_offset (page ) + offset_in_page ( p );
272264 err = minix_prepare_chunk (page , pos , sbi -> s_dirsize );
273265 if (err )
274266 goto out_unlock ;
@@ -285,8 +277,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
285277 mark_inode_dirty (dir );
286278 err = minix_handle_dirsync (dir );
287279out_put :
288- dir_put_page (page );
289- out :
280+ unmap_and_put_page (page , kaddr );
290281 return err ;
291282out_unlock :
292283 unlock_page (page );
@@ -296,8 +287,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
296287int minix_delete_entry (struct minix_dir_entry * de , struct page * page )
297288{
298289 struct inode * inode = page -> mapping -> host ;
299- char * kaddr = page_address (page );
300- loff_t pos = page_offset (page ) + (char * )de - kaddr ;
290+ loff_t pos = page_offset (page ) + offset_in_page (de );
301291 struct minix_sb_info * sbi = minix_sb (inode -> i_sb );
302292 unsigned len = sbi -> s_dirsize ;
303293 int err ;
@@ -333,7 +323,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
333323 goto fail ;
334324 }
335325
336- kaddr = kmap_atomic (page );
326+ kaddr = kmap_local_page (page );
337327 memset (kaddr , 0 , PAGE_SIZE );
338328
339329 if (sbi -> s_version == MINIX_V3 ) {
@@ -353,7 +343,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
353343 de -> inode = dir -> i_ino ;
354344 strcpy (de -> name , ".." );
355345 }
356- kunmap_atomic (kaddr );
346+ kunmap_local (kaddr );
357347
358348 dir_commit_chunk (page , 0 , 2 * sbi -> s_dirsize );
359349 err = minix_handle_dirsync (inode );
@@ -370,17 +360,16 @@ int minix_empty_dir(struct inode * inode)
370360 struct page * page = NULL ;
371361 unsigned long i , npages = dir_pages (inode );
372362 struct minix_sb_info * sbi = minix_sb (inode -> i_sb );
373- char * name ;
363+ char * name , * kaddr ;
374364 __u32 inumber ;
375365
376366 for (i = 0 ; i < npages ; i ++ ) {
377- char * p , * kaddr , * limit ;
367+ char * p , * limit ;
378368
379- page = dir_get_page (inode , i );
380- if (IS_ERR (page ))
369+ kaddr = dir_get_page (inode , i , & page );
370+ if (IS_ERR (kaddr ))
381371 continue ;
382372
383- kaddr = (char * )page_address (page );
384373 limit = kaddr + minix_last_byte (inode , i ) - sbi -> s_dirsize ;
385374 for (p = kaddr ; p <= limit ; p = minix_next_entry (p , sbi )) {
386375 if (sbi -> s_version == MINIX_V3 ) {
@@ -406,12 +395,12 @@ int minix_empty_dir(struct inode * inode)
406395 goto not_empty ;
407396 }
408397 }
409- dir_put_page (page );
398+ unmap_and_put_page (page , kaddr );
410399 }
411400 return 1 ;
412401
413402not_empty :
414- dir_put_page (page );
403+ unmap_and_put_page (page , kaddr );
415404 return 0 ;
416405}
417406
@@ -421,8 +410,7 @@ int minix_set_link(struct minix_dir_entry *de, struct page *page,
421410{
422411 struct inode * dir = page -> mapping -> host ;
423412 struct minix_sb_info * sbi = minix_sb (dir -> i_sb );
424- loff_t pos = page_offset (page ) +
425- (char * )de - (char * )page_address (page );
413+ loff_t pos = page_offset (page ) + offset_in_page (de );
426414 int err ;
427415
428416 lock_page (page );
@@ -443,15 +431,12 @@ int minix_set_link(struct minix_dir_entry *de, struct page *page,
443431
444432struct minix_dir_entry * minix_dotdot (struct inode * dir , struct page * * p )
445433{
446- struct page * page = dir_get_page (dir , 0 );
447434 struct minix_sb_info * sbi = minix_sb (dir -> i_sb );
448- struct minix_dir_entry * de = NULL ;
435+ struct minix_dir_entry * de = dir_get_page ( dir , 0 , p ) ;
449436
450- if (!IS_ERR (page )) {
451- de = minix_next_entry (page_address (page ), sbi );
452- * p = page ;
453- }
454- return de ;
437+ if (!IS_ERR (de ))
438+ return minix_next_entry (de , sbi );
439+ return NULL ;
455440}
456441
457442ino_t minix_inode_by_name (struct dentry * dentry )
@@ -469,7 +454,7 @@ ino_t minix_inode_by_name(struct dentry *dentry)
469454 res = ((minix3_dirent * ) de )-> inode ;
470455 else
471456 res = de -> inode ;
472- dir_put_page (page );
457+ unmap_and_put_page (page , de );
473458 }
474459 return res ;
475460}
0 commit comments