@@ -57,13 +57,15 @@ static int sysv_handle_dirsync(struct inode *dir)
57
57
return err ;
58
58
}
59
59
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 )
61
61
{
62
62
struct address_space * mapping = dir -> i_mapping ;
63
63
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 );
67
69
}
68
70
69
71
static 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)
85
87
for ( ; n < npages ; n ++ , offset = 0 ) {
86
88
char * kaddr , * limit ;
87
89
struct sysv_dir_entry * de ;
88
- struct page * page = dir_get_page ( inode , n ) ;
90
+ struct page * page ;
89
91
90
- if (IS_ERR (page ))
92
+ kaddr = dir_get_page (inode , n , & page );
93
+ if (IS_ERR (kaddr ))
91
94
continue ;
92
- kaddr = (char * )page_address (page );
93
95
de = (struct sysv_dir_entry * )(kaddr + offset );
94
96
limit = kaddr + PAGE_SIZE - SYSV_DIRSIZE ;
95
97
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_
147
149
n = start ;
148
150
149
151
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 ;
155
156
kaddr += PAGE_SIZE - SYSV_DIRSIZE ;
156
157
for ( ; (char * ) de <= kaddr ; de ++ ) {
157
158
if (!de -> inode )
@@ -190,11 +191,9 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)
190
191
191
192
/* We take care of directory expansion in the same loop */
192
193
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 );
198
197
de = (struct sysv_dir_entry * )kaddr ;
199
198
kaddr += PAGE_SIZE - SYSV_DIRSIZE ;
200
199
while ((char * )de <= kaddr ) {
@@ -225,7 +224,6 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)
225
224
err = sysv_handle_dirsync (dir );
226
225
out_page :
227
226
dir_put_page (page );
228
- out :
229
227
return err ;
230
228
out_unlock :
231
229
unlock_page (page );
@@ -295,12 +293,11 @@ int sysv_empty_dir(struct inode * inode)
295
293
for (i = 0 ; i < npages ; i ++ ) {
296
294
char * kaddr ;
297
295
struct sysv_dir_entry * de ;
298
- page = dir_get_page (inode , i );
299
296
300
- if (IS_ERR (page ))
297
+ kaddr = dir_get_page (inode , i , & page );
298
+ if (IS_ERR (kaddr ))
301
299
continue ;
302
300
303
- kaddr = (char * )page_address (page );
304
301
de = (struct sysv_dir_entry * )kaddr ;
305
302
kaddr += PAGE_SIZE - SYSV_DIRSIZE ;
306
303
@@ -347,16 +344,14 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page,
347
344
sysv_handle_dirsync (inode );
348
345
}
349
346
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 )
351
348
{
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 );
354
350
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 ;
360
355
}
361
356
362
357
ino_t sysv_inode_by_name (struct dentry * dentry )
0 commit comments