]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ufs: Convert ufs_delete_entry() to work on a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 8 Jul 2024 19:32:53 +0000 (15:32 -0400)
committerChristian Brauner <brauner@kernel.org>
Wed, 7 Aug 2024 09:31:52 +0000 (11:31 +0200)
Match ext2 and 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/ufs/dir.c
fs/ufs/namei.c
fs/ufs/ufs.h

index 6fcca4dd064a108733dc6502ba1921891919af4d..945fff87b385709c5c80b62926a73d15e85fe368 100644 (file)
@@ -485,19 +485,23 @@ ufs_readdir(struct file *file, struct dir_context *ctx)
  * previous entry.
  */
 int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir,
-                    struct page * page)
+                    struct folio *folio)
 {
        struct super_block *sb = inode->i_sb;
-       char *kaddr = page_address(page);
-       unsigned from = ((char*)dir - kaddr) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);
-       unsigned to = ((char*)dir - kaddr) + fs16_to_cpu(sb, dir->d_reclen);
+       size_t from, to;
+       char *kaddr;
        loff_t pos;
-       struct ufs_dir_entry *pde = NULL;
-       struct ufs_dir_entry *de = (struct ufs_dir_entry *) (kaddr + from);
+       struct ufs_dir_entry *de, *pde = NULL;
        int err;
 
        UFSD("ENTER\n");
 
+       from = offset_in_folio(folio, dir);
+       to = from + fs16_to_cpu(sb, dir->d_reclen);
+       kaddr = (char *)dir - from;
+       from &= ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);
+       de = (struct ufs_dir_entry *) (kaddr + from);
+
        UFSD("ino %u, reclen %u, namlen %u, name %s\n",
              fs32_to_cpu(sb, de->d_ino),
              fs16_to_cpu(sb, de->d_reclen),
@@ -514,21 +518,20 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir,
                de = ufs_next_entry(sb, de);
        }
        if (pde)
-               from = (char*)pde - (char*)page_address(page);
-
-       pos = page_offset(page) + from;
-       lock_page(page);
-       err = ufs_prepare_chunk(page, pos, to - from);
+               from = offset_in_folio(folio, pde);
+       pos = folio_pos(folio) + from;
+       folio_lock(folio);
+       err = ufs_prepare_chunk(&folio->page, pos, to - from);
        BUG_ON(err);
        if (pde)
                pde->d_reclen = cpu_to_fs16(sb, to - from);
        dir->d_ino = 0;
-       ufs_commit_chunk(page, pos, to - from);
+       ufs_commit_chunk(&folio->page, pos, to - from);
        inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
        mark_inode_dirty(inode);
        err = ufs_handle_dirsync(inode);
 out:
-       ufs_put_page(page);
+       ufs_put_page(&folio->page);
        UFSD("EXIT\n");
        return err;
 }
index 1759b710d8310b2ec87c332b2b9fbba18b649839..a9b0c15de067c867c85b294304e3e9f1a91b499f 100644 (file)
@@ -216,7 +216,7 @@ static int ufs_unlink(struct inode *dir, struct dentry *dentry)
        if (!de)
                goto out;
 
-       err = ufs_delete_entry(dir, de, &folio->page);
+       err = ufs_delete_entry(dir, de, folio);
        if (err)
                goto out;
 
@@ -300,7 +300,7 @@ static int ufs_rename(struct mnt_idmap *idmap, struct inode *old_dir,
         */
        inode_set_ctime_current(old_inode);
 
-       ufs_delete_entry(old_dir, old_de, &old_folio->page);
+       ufs_delete_entry(old_dir, old_de, old_folio);
        mark_inode_dirty(old_inode);
 
        if (dir_de) {
index 1ad992ab2855dcfccb83bc3b49a15b5be192cc51..a2c762cb65a05bc88b9382f5879bd8608f0d64e7 100644 (file)
@@ -105,7 +105,7 @@ ino_t ufs_inode_by_name(struct inode *, const struct qstr *);
 int ufs_make_empty(struct inode *, struct inode *);
 struct ufs_dir_entry *ufs_find_entry(struct inode *, const struct qstr *,
                struct folio **);
-int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct page *);
+int ufs_delete_entry(struct inode *, struct ufs_dir_entry *, struct folio *);
 int ufs_empty_dir(struct inode *);
 struct ufs_dir_entry *ufs_dotdot(struct inode *, struct folio **);
 void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,