mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
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:
parent
a3b4537f82
commit
ba36ee5308
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user