Skip to content

Commit 8dd6c7b

Browse files
xp4ns3Al Viro
authored andcommitted
fs/sysv: Change the signature of dir_get_page()
Change the signature of dir_get_page() in order to prepare this function to the conversion to the use of kmap_local_page(). Change also those call sites which are required to adjust to the new signature. Cc: Ira Weiny <[email protected]> Suggested-by: Al Viro <[email protected]> Signed-off-by: Fabio M. De Francesco <[email protected]> Signed-off-by: Al Viro <[email protected]>
1 parent 4bb1a13 commit 8dd6c7b

File tree

1 file changed

+24
-29
lines changed

1 file changed

+24
-29
lines changed

fs/sysv/dir.c

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6971
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)
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);
226225
out_page:
227226
dir_put_page(page);
228-
out:
229227
return err;
230228
out_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

362357
ino_t sysv_inode_by_name(struct dentry *dentry)

0 commit comments

Comments
 (0)