Skip to content

Commit ea2ac92

Browse files
Matthew Wilcox (Oracle)gregkh
authored andcommitted
nilfs2: return the mapped address from nilfs_get_page()
[ Upstream commit 09a46ac ] In prepartion for switching from kmap() to kmap_local(), return the kmap address from nilfs_get_page() instead of having the caller look up page_address(). [konishi.ryusuke: fixed a missing blank line after declaration] Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Matthew Wilcox (Oracle) <[email protected]> Signed-off-by: Ryusuke Konishi <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Stable-dep-of: 7373a51 ("nilfs2: fix nilfs_empty_dir() misjudgment and long loop on I/O errors") Signed-off-by: Sasha Levin <[email protected]>
1 parent 8b0d6d1 commit ea2ac92

File tree

1 file changed

+27
-30
lines changed

1 file changed

+27
-30
lines changed

fs/nilfs2/dir.c

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,24 @@ static bool nilfs_check_page(struct page *page)
186186
return false;
187187
}
188188

189-
static struct page *nilfs_get_page(struct inode *dir, unsigned long n)
189+
static void *nilfs_get_page(struct inode *dir, unsigned long n,
190+
struct page **pagep)
190191
{
191192
struct address_space *mapping = dir->i_mapping;
192193
struct page *page = read_mapping_page(mapping, n, NULL);
194+
void *kaddr;
193195

194-
if (!IS_ERR(page)) {
195-
kmap(page);
196-
if (unlikely(!PageChecked(page))) {
197-
if (!nilfs_check_page(page))
198-
goto fail;
199-
}
196+
if (IS_ERR(page))
197+
return page;
198+
199+
kaddr = kmap(page);
200+
if (unlikely(!PageChecked(page))) {
201+
if (!nilfs_check_page(page))
202+
goto fail;
200203
}
201-
return page;
204+
205+
*pagep = page;
206+
return kaddr;
202207

203208
fail:
204209
nilfs_put_page(page);
@@ -275,14 +280,14 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)
275280
for ( ; n < npages; n++, offset = 0) {
276281
char *kaddr, *limit;
277282
struct nilfs_dir_entry *de;
278-
struct page *page = nilfs_get_page(inode, n);
283+
struct page *page;
279284

280-
if (IS_ERR(page)) {
285+
kaddr = nilfs_get_page(inode, n, &page);
286+
if (IS_ERR(kaddr)) {
281287
nilfs_error(sb, "bad page in #%lu", inode->i_ino);
282288
ctx->pos += PAGE_SIZE - offset;
283289
return -EIO;
284290
}
285-
kaddr = page_address(page);
286291
de = (struct nilfs_dir_entry *)(kaddr + offset);
287292
limit = kaddr + nilfs_last_byte(inode, n) -
288293
NILFS_DIR_REC_LEN(1);
@@ -345,11 +350,9 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
345350
start = 0;
346351
n = start;
347352
do {
348-
char *kaddr;
353+
char *kaddr = nilfs_get_page(dir, n, &page);
349354

350-
page = nilfs_get_page(dir, n);
351-
if (!IS_ERR(page)) {
352-
kaddr = page_address(page);
355+
if (!IS_ERR(kaddr)) {
353356
de = (struct nilfs_dir_entry *)kaddr;
354357
kaddr += nilfs_last_byte(dir, n) - reclen;
355358
while ((char *) de <= kaddr) {
@@ -387,15 +390,11 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr,
387390

388391
struct nilfs_dir_entry *nilfs_dotdot(struct inode *dir, struct page **p)
389392
{
390-
struct page *page = nilfs_get_page(dir, 0);
391-
struct nilfs_dir_entry *de = NULL;
393+
struct nilfs_dir_entry *de = nilfs_get_page(dir, 0, p);
392394

393-
if (!IS_ERR(page)) {
394-
de = nilfs_next_entry(
395-
(struct nilfs_dir_entry *)page_address(page));
396-
*p = page;
397-
}
398-
return de;
395+
if (IS_ERR(de))
396+
return NULL;
397+
return nilfs_next_entry(de);
399398
}
400399

401400
ino_t nilfs_inode_by_name(struct inode *dir, const struct qstr *qstr)
@@ -459,12 +458,11 @@ int nilfs_add_link(struct dentry *dentry, struct inode *inode)
459458
for (n = 0; n <= npages; n++) {
460459
char *dir_end;
461460

462-
page = nilfs_get_page(dir, n);
463-
err = PTR_ERR(page);
464-
if (IS_ERR(page))
461+
kaddr = nilfs_get_page(dir, n, &page);
462+
err = PTR_ERR(kaddr);
463+
if (IS_ERR(kaddr))
465464
goto out;
466465
lock_page(page);
467-
kaddr = page_address(page);
468466
dir_end = kaddr + nilfs_last_byte(dir, n);
469467
de = (struct nilfs_dir_entry *)kaddr;
470468
kaddr += PAGE_SIZE - reclen;
@@ -627,11 +625,10 @@ int nilfs_empty_dir(struct inode *inode)
627625
char *kaddr;
628626
struct nilfs_dir_entry *de;
629627

630-
page = nilfs_get_page(inode, i);
631-
if (IS_ERR(page))
628+
kaddr = nilfs_get_page(inode, i, &page);
629+
if (IS_ERR(kaddr))
632630
continue;
633631

634-
kaddr = page_address(page);
635632
de = (struct nilfs_dir_entry *)kaddr;
636633
kaddr += nilfs_last_byte(inode, i) - NILFS_DIR_REC_LEN(1);
637634

0 commit comments

Comments
 (0)