ufs: Convert ufs_delete_entry() to work on a folio
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>
This commit is contained in:
parent
597697c5ad
commit
767bd0af25
29
fs/ufs/dir.c
29
fs/ufs/dir.c
@ -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;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user