@@ -57,13 +57,15 @@ static int sysv_handle_dirsync(struct inode *dir)
5757 return err ;
5858}
5959
60- static struct page * dir_get_page (struct inode * dir , unsigned long n )
60+ static void * dir_get_page (struct inode * dir , unsigned long n , struct page * * p )
6161{
6262 struct address_space * mapping = dir -> i_mapping ;
6363 struct page * page = read_mapping_page (mapping , n , NULL );
64- if (!IS_ERR (page ))
65- kmap (page );
66- return page ;
64+ if (IS_ERR (page ))
65+ return ERR_CAST (page );
66+ kmap (page );
67+ * p = page ;
68+ return page_address (page );
6769}
6870
6971static int sysv_readdir (struct file * file , struct dir_context * ctx )
@@ -85,11 +87,11 @@ static int sysv_readdir(struct file *file, struct dir_context *ctx)
8587 for ( ; n < npages ; n ++ , offset = 0 ) {
8688 char * kaddr , * limit ;
8789 struct sysv_dir_entry * de ;
88- struct page * page = dir_get_page ( inode , n ) ;
90+ struct page * page ;
8991
90- if (IS_ERR (page ))
92+ kaddr = dir_get_page (inode , n , & page );
93+ if (IS_ERR (kaddr ))
9194 continue ;
92- kaddr = (char * )page_address (page );
9395 de = (struct sysv_dir_entry * )(kaddr + offset );
9496 limit = kaddr + PAGE_SIZE - SYSV_DIRSIZE ;
9597 for ( ;(char * )de <= limit ; de ++ , ctx -> pos += sizeof (* de )) {
@@ -147,11 +149,10 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_
147149 n = start ;
148150
149151 do {
150- char * kaddr ;
151- page = dir_get_page (dir , n );
152- if (!IS_ERR (page )) {
153- kaddr = (char * )page_address (page );
154- de = (struct sysv_dir_entry * ) kaddr ;
152+ char * kaddr = dir_get_page (dir , n , & page );
153+
154+ if (!IS_ERR (kaddr )) {
155+ de = (struct sysv_dir_entry * )kaddr ;
155156 kaddr += PAGE_SIZE - SYSV_DIRSIZE ;
156157 for ( ; (char * ) de <= kaddr ; de ++ ) {
157158 if (!de -> inode )
@@ -190,11 +191,9 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)
190191
191192 /* We take care of directory expansion in the same loop */
192193 for (n = 0 ; n <= npages ; n ++ ) {
193- page = dir_get_page (dir , n );
194- err = PTR_ERR (page );
195- if (IS_ERR (page ))
196- goto out ;
197- kaddr = (char * )page_address (page );
194+ kaddr = dir_get_page (dir , n , & page );
195+ if (IS_ERR (kaddr ))
196+ return PTR_ERR (kaddr );
198197 de = (struct sysv_dir_entry * )kaddr ;
199198 kaddr += PAGE_SIZE - SYSV_DIRSIZE ;
200199 while ((char * )de <= kaddr ) {
@@ -225,7 +224,6 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)
225224 err = sysv_handle_dirsync (dir );
226225out_page :
227226 dir_put_page (page );
228- out :
229227 return err ;
230228out_unlock :
231229 unlock_page (page );
@@ -295,12 +293,11 @@ int sysv_empty_dir(struct inode * inode)
295293 for (i = 0 ; i < npages ; i ++ ) {
296294 char * kaddr ;
297295 struct sysv_dir_entry * de ;
298- page = dir_get_page (inode , i );
299296
300- if (IS_ERR (page ))
297+ kaddr = dir_get_page (inode , i , & page );
298+ if (IS_ERR (kaddr ))
301299 continue ;
302300
303- kaddr = (char * )page_address (page );
304301 de = (struct sysv_dir_entry * )kaddr ;
305302 kaddr += PAGE_SIZE - SYSV_DIRSIZE ;
306303
@@ -347,16 +344,14 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page,
347344 sysv_handle_dirsync (inode );
348345}
349346
350- struct sysv_dir_entry * sysv_dotdot (struct inode * dir , struct page * * p )
347+ struct sysv_dir_entry * sysv_dotdot (struct inode * dir , struct page * * p )
351348{
352- struct page * page = dir_get_page (dir , 0 );
353- struct sysv_dir_entry * de = NULL ;
349+ struct sysv_dir_entry * de = dir_get_page (dir , 0 , p );
354350
355- if (!IS_ERR (page )) {
356- de = (struct sysv_dir_entry * ) page_address (page ) + 1 ;
357- * p = page ;
358- }
359- return de ;
351+ if (IS_ERR (de ))
352+ return NULL ;
353+ /* ".." is the second directory entry */
354+ return de + 1 ;
360355}
361356
362357ino_t sysv_inode_by_name (struct dentry * dentry )
0 commit comments