]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sysv: Convert sysv_find_entry() to take a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 9 Jul 2024 14:31:45 +0000 (10:31 -0400)
committerChristian Brauner <brauner@kernel.org>
Wed, 7 Aug 2024 09:31:53 +0000 (11:31 +0200)
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>
fs/sysv/dir.c
fs/sysv/namei.c
fs/sysv/sysv.h

index 1f95f82f89416ae7a1a216d8f93512c31de0769f..5b2e3c7c29713676195e1d7581cb4574b2b6d741 100644 (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;
 }
index d6b73798071b64c4738bfbde6795c62fda13c17b..970043fe49eebd438a375e710bac691f4336ed3b 100644 (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;
 }
index e3f988b469ee98d7451a7174e158c02adad91393..be15c659a02763c352d53b5a594b86de6d66703c 100644 (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;