sysv: Convert sysv_find_entry() to take a folio

Remove a few hidden calls to compound_head().

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2024-07-09 10:31:45 -04:00 committed by Christian Brauner
parent a3b4537f82
commit ba36ee5308
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
3 changed files with 30 additions and 35 deletions

View File

@ -127,39 +127,35 @@ static inline int namecompare(int len, int maxlen,
/*
* sysv_find_entry()
*
* finds an entry in the specified directory with the wanted name. It
* returns the cache buffer in which the entry was found, and the entry
* itself (as a parameter - res_dir). It does NOT read the inode of the
* finds an entry in the specified directory with the wanted name.
* It does NOT read the inode of the
* entry - you'll have to do that yourself if you want to.
*
* On Success unmap_and_put_page() should be called on *res_page.
* On Success folio_release_kmap() should be called on *foliop.
*
* sysv_find_entry() acts as a call to dir_get_folio() and must be treated
* accordingly for nesting purposes.
*/
struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_page)
struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct folio **foliop)
{
const char * name = dentry->d_name.name;
int namelen = dentry->d_name.len;
struct inode * dir = d_inode(dentry->d_parent);
unsigned long start, n;
unsigned long npages = dir_pages(dir);
struct folio *folio = NULL;
struct sysv_dir_entry *de;
*res_page = NULL;
start = SYSV_I(dir)->i_dir_start_lookup;
if (start >= npages)
start = 0;
n = start;
do {
char *kaddr = dir_get_folio(dir, n, &folio);
char *kaddr = dir_get_folio(dir, n, foliop);
if (!IS_ERR(kaddr)) {
de = (struct sysv_dir_entry *)kaddr;
kaddr += PAGE_SIZE - SYSV_DIRSIZE;
kaddr += folio_size(*foliop) - SYSV_DIRSIZE;
for ( ; (char *) de <= kaddr ; de++) {
if (!de->inode)
continue;
@ -167,7 +163,7 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_
name, de->name))
goto found;
}
folio_release_kmap(folio, kaddr);
folio_release_kmap(*foliop, kaddr);
}
if (++n >= npages)
@ -178,7 +174,6 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_
found:
SYSV_I(dir)->i_dir_start_lookup = n;
*res_page = &folio->page;
return de;
}
@ -374,13 +369,13 @@ struct sysv_dir_entry *sysv_dotdot(struct inode *dir, struct page **p)
ino_t sysv_inode_by_name(struct dentry *dentry)
{
struct page *page;
struct sysv_dir_entry *de = sysv_find_entry (dentry, &page);
struct folio *folio;
struct sysv_dir_entry *de = sysv_find_entry (dentry, &folio);
ino_t res = 0;
if (de) {
res = fs16_to_cpu(SYSV_SB(dentry->d_sb), de->inode);
unmap_and_put_page(page, de);
folio_release_kmap(folio, de);
}
return res;
}

View File

@ -151,20 +151,20 @@ out_dir:
static int sysv_unlink(struct inode * dir, struct dentry * dentry)
{
struct inode * inode = d_inode(dentry);
struct page * page;
struct folio *folio;
struct sysv_dir_entry * de;
int err;
de = sysv_find_entry(dentry, &page);
de = sysv_find_entry(dentry, &folio);
if (!de)
return -ENOENT;
err = sysv_delete_entry(de, page);
err = sysv_delete_entry(de, &folio->page);
if (!err) {
inode_set_ctime_to_ts(inode, inode_get_ctime(dir));
inode_dec_link_count(inode);
}
unmap_and_put_page(page, de);
folio_release_kmap(folio, de);
return err;
}
@ -196,14 +196,14 @@ static int sysv_rename(struct mnt_idmap *idmap, struct inode *old_dir,
struct inode * new_inode = d_inode(new_dentry);
struct page * dir_page = NULL;
struct sysv_dir_entry * dir_de = NULL;
struct page * old_page;
struct folio *old_folio;
struct sysv_dir_entry * old_de;
int err = -ENOENT;
if (flags & ~RENAME_NOREPLACE)
return -EINVAL;
old_de = sysv_find_entry(old_dentry, &old_page);
old_de = sysv_find_entry(old_dentry, &old_folio);
if (!old_de)
goto out;
@ -215,7 +215,7 @@ static int sysv_rename(struct mnt_idmap *idmap, struct inode *old_dir,
}
if (new_inode) {
struct page * new_page;
struct folio *new_folio;
struct sysv_dir_entry * new_de;
err = -ENOTEMPTY;
@ -223,11 +223,11 @@ static int sysv_rename(struct mnt_idmap *idmap, struct inode *old_dir,
goto out_dir;
err = -ENOENT;
new_de = sysv_find_entry(new_dentry, &new_page);
new_de = sysv_find_entry(new_dentry, &new_folio);
if (!new_de)
goto out_dir;
err = sysv_set_link(new_de, new_page, old_inode);
unmap_and_put_page(new_page, new_de);
err = sysv_set_link(new_de, &new_folio->page, old_inode);
folio_release_kmap(new_folio, new_de);
if (err)
goto out_dir;
inode_set_ctime_current(new_inode);
@ -242,7 +242,7 @@ static int sysv_rename(struct mnt_idmap *idmap, struct inode *old_dir,
inode_inc_link_count(new_dir);
}
err = sysv_delete_entry(old_de, old_page);
err = sysv_delete_entry(old_de, &old_folio->page);
if (err)
goto out_dir;
@ -258,7 +258,7 @@ out_dir:
if (dir_de)
unmap_and_put_page(dir_page, dir_de);
out_old:
unmap_and_put_page(old_page, old_de);
folio_release_kmap(old_folio, old_de);
out:
return err;
}

View File

@ -148,15 +148,15 @@ extern void sysv_destroy_icache(void);
/* dir.c */
extern struct sysv_dir_entry *sysv_find_entry(struct dentry *, struct page **);
extern int sysv_add_link(struct dentry *, struct inode *);
extern int sysv_delete_entry(struct sysv_dir_entry *, struct page *);
extern int sysv_make_empty(struct inode *, struct inode *);
extern int sysv_empty_dir(struct inode *);
extern int sysv_set_link(struct sysv_dir_entry *, struct page *,
struct sysv_dir_entry *sysv_find_entry(struct dentry *, struct folio **);
int sysv_add_link(struct dentry *, struct inode *);
int sysv_delete_entry(struct sysv_dir_entry *, struct page *);
int sysv_make_empty(struct inode *, struct inode *);
int sysv_empty_dir(struct inode *);
int sysv_set_link(struct sysv_dir_entry *, struct page *,
struct inode *);
extern struct sysv_dir_entry *sysv_dotdot(struct inode *, struct page **);
extern ino_t sysv_inode_by_name(struct dentry *);
struct sysv_dir_entry *sysv_dotdot(struct inode *, struct page **);
ino_t sysv_inode_by_name(struct dentry *);
extern const struct inode_operations sysv_file_inode_operations;