Skip to content

Commit 91f646f

Browse files
Al Virojankara
authored andcommitted
ext2_put_page(): accept any pointer within the page
eliminates the need to keep the pointer to the first byte within the page if we are guaranteed to have pointers to some byte in the same page at hand. Don't backport without commit 88d7b12 ("highmem: round down the address passed to kunmap_flush_on_unmap()"). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Reviewed-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> Tested-by: Fabio M. De Francesco <fmdefrancesco@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
1 parent 4602237 commit 91f646f

2 files changed

Lines changed: 21 additions & 25 deletions

File tree

fs/ext2/dir.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ ext2_readdir(struct file *file, struct dir_context *ctx)
299299
if (de->rec_len == 0) {
300300
ext2_error(sb, __func__,
301301
"zero-length directory entry");
302-
ext2_put_page(page, kaddr);
302+
ext2_put_page(page, de);
303303
return -EIO;
304304
}
305305
if (de->inode) {
@@ -311,7 +311,7 @@ ext2_readdir(struct file *file, struct dir_context *ctx)
311311
if (!dir_emit(ctx, de->name, de->name_len,
312312
le32_to_cpu(de->inode),
313313
d_type)) {
314-
ext2_put_page(page, kaddr);
314+
ext2_put_page(page, de);
315315
return 0;
316316
}
317317
}
@@ -377,14 +377,14 @@ struct ext2_dir_entry_2 *ext2_find_entry (struct inode *dir,
377377
if (de->rec_len == 0) {
378378
ext2_error(dir->i_sb, __func__,
379379
"zero-length directory entry");
380-
ext2_put_page(page, page_addr);
380+
ext2_put_page(page, de);
381381
goto out;
382382
}
383383
if (ext2_match(namelen, name, de))
384384
goto found;
385385
de = ext2_next_entry(de);
386386
}
387-
ext2_put_page(page, page_addr);
387+
ext2_put_page(page, kaddr);
388388

389389
if (++n >= npages)
390390
n = 0;
@@ -443,7 +443,7 @@ int ext2_inode_by_name(struct inode *dir, const struct qstr *child, ino_t *ino)
443443
return PTR_ERR(de);
444444

445445
*ino = le32_to_cpu(de->inode);
446-
ext2_put_page(page, page_addr);
446+
ext2_put_page(page, de);
447447
return 0;
448448
}
449449

@@ -499,7 +499,6 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
499499
unsigned reclen = EXT2_DIR_REC_LEN(namelen);
500500
unsigned short rec_len, name_len;
501501
struct page *page = NULL;
502-
void *page_addr = NULL;
503502
ext2_dirent * de;
504503
unsigned long npages = dir_pages(dir);
505504
unsigned long n;
@@ -515,11 +514,10 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
515514
char *kaddr;
516515
char *dir_end;
517516

518-
page_addr = ext2_get_page(dir, n, 0, &page);
519-
if (IS_ERR(page_addr))
520-
return PTR_ERR(page_addr);
517+
kaddr = ext2_get_page(dir, n, 0, &page);
518+
if (IS_ERR(kaddr))
519+
return PTR_ERR(kaddr);
521520
lock_page(page);
522-
kaddr = page_addr;
523521
dir_end = kaddr + ext2_last_byte(dir, n);
524522
de = (ext2_dirent *)kaddr;
525523
kaddr += PAGE_SIZE - reclen;
@@ -550,7 +548,7 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
550548
de = (ext2_dirent *) ((char *) de + rec_len);
551549
}
552550
unlock_page(page);
553-
ext2_put_page(page, page_addr);
551+
ext2_put_page(page, kaddr);
554552
}
555553
BUG();
556554
return -EINVAL;
@@ -577,7 +575,7 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
577575
err = ext2_handle_dirsync(dir);
578576
/* OFFSET_CACHE */
579577
out_put:
580-
ext2_put_page(page, page_addr);
578+
ext2_put_page(page, de);
581579
return err;
582580
out_unlock:
583581
unlock_page(page);
@@ -675,19 +673,17 @@ int ext2_make_empty(struct inode *inode, struct inode *parent)
675673
*/
676674
int ext2_empty_dir (struct inode * inode)
677675
{
678-
void *page_addr = NULL;
679-
struct page *page = NULL;
676+
struct page *page;
677+
char *kaddr;
680678
unsigned long i, npages = dir_pages(inode);
681679

682680
for (i = 0; i < npages; i++) {
683-
char *kaddr;
684-
ext2_dirent * de;
685-
page_addr = ext2_get_page(inode, i, 0, &page);
681+
ext2_dirent *de;
686682

687-
if (IS_ERR(page_addr))
683+
kaddr = ext2_get_page(inode, i, 0, &page);
684+
if (IS_ERR(kaddr))
688685
return 0;
689686

690-
kaddr = page_addr;
691687
de = (ext2_dirent *)kaddr;
692688
kaddr += ext2_last_byte(inode, i) - EXT2_DIR_REC_LEN(1);
693689

@@ -713,12 +709,12 @@ int ext2_empty_dir (struct inode * inode)
713709
}
714710
de = ext2_next_entry(de);
715711
}
716-
ext2_put_page(page, page_addr);
712+
ext2_put_page(page, kaddr);
717713
}
718714
return 1;
719715

720716
not_empty:
721-
ext2_put_page(page, page_addr);
717+
ext2_put_page(page, kaddr);
722718
return 0;
723719
}
724720

fs/ext2/namei.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ static int ext2_unlink(struct inode * dir, struct dentry *dentry)
288288
}
289289

290290
err = ext2_delete_entry (de, page, page_addr);
291-
ext2_put_page(page, page_addr);
291+
ext2_put_page(page, de);
292292
if (err)
293293
goto out;
294294

@@ -370,7 +370,7 @@ static int ext2_rename (struct mnt_idmap * idmap,
370370
}
371371
err = ext2_set_link(new_dir, new_de, new_page, page_addr,
372372
old_inode, true);
373-
ext2_put_page(new_page, page_addr);
373+
ext2_put_page(new_page, new_de);
374374
if (err)
375375
goto out_dir;
376376
new_inode->i_ctime = current_time(new_inode);
@@ -402,9 +402,9 @@ static int ext2_rename (struct mnt_idmap * idmap,
402402
}
403403
out_dir:
404404
if (dir_de)
405-
ext2_put_page(dir_page, dir_page_addr);
405+
ext2_put_page(dir_page, dir_de);
406406
out_old:
407-
ext2_put_page(old_page, old_page_addr);
407+
ext2_put_page(old_page, old_de);
408408
return err;
409409
}
410410

0 commit comments

Comments
 (0)