On Wed, Dec 21, 2022 at 06:28:01PM +0100, Fabio M. De Francesco wrote: > Change the signature of ufs_get_page() in order to prepare this function > to the conversion to the use of kmap_local_page(). Change also those call > sites which are required to conform its invocations to the new > signature. > > Cc: Ira Weiny <ira.weiny@xxxxxxxxx> > Suggested-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@xxxxxxxxx> > --- > fs/ufs/dir.c | 49 +++++++++++++++++++++---------------------------- > 1 file changed, 21 insertions(+), 28 deletions(-) > > diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c > index 69f78583c9c1..9fa86614d2d1 100644 > --- a/fs/ufs/dir.c > +++ b/fs/ufs/dir.c > @@ -185,7 +185,7 @@ static bool ufs_check_page(struct page *page) > return false; > } > > -static struct page *ufs_get_page(struct inode *dir, unsigned long n) > +static void *ufs_get_page(struct inode *dir, unsigned long n, struct page **p) > { > struct address_space *mapping = dir->i_mapping; > struct page *page = read_mapping_page(mapping, n, NULL); > @@ -195,8 +195,10 @@ static struct page *ufs_get_page(struct inode *dir, unsigned long n) > if (!ufs_check_page(page)) > goto fail; > } > + *p = page; > + return page_address(page); > } > - return page; > + return ERR_CAST(page); > > fail: > ufs_put_page(page); > @@ -227,15 +229,12 @@ ufs_next_entry(struct super_block *sb, struct ufs_dir_entry *p) > > struct ufs_dir_entry *ufs_dotdot(struct inode *dir, struct page **p) > { > - struct page *page = ufs_get_page(dir, 0); > - struct ufs_dir_entry *de = NULL; > + struct ufs_dir_entry *de = ufs_get_page(dir, 0, p); I don't know why but ufs_get_page() returning an address read really odd to me. But rolling around my head alternative names nothing seems better than this. > > - if (!IS_ERR(page)) { > - de = ufs_next_entry(dir->i_sb, > - (struct ufs_dir_entry *)page_address(page)); > - *p = page; > - } > - return de; > + if (!IS_ERR(de)) > + return ufs_next_entry(dir->i_sb, de); > + else > + return NULL; > } > > /* > @@ -273,11 +272,10 @@ struct ufs_dir_entry *ufs_find_entry(struct inode *dir, const struct qstr *qstr, > start = 0; > n = start; > do { > - char *kaddr; > - page = ufs_get_page(dir, n); > - if (!IS_ERR(page)) { > - kaddr = page_address(page); > - de = (struct ufs_dir_entry *) kaddr; > + char *kaddr = ufs_get_page(dir, n, &page); > + > + if (!IS_ERR(kaddr)) { > + de = (struct ufs_dir_entry *)kaddr; > kaddr += ufs_last_byte(dir, n) - reclen; > while ((char *) de <= kaddr) { > if (ufs_match(sb, namelen, name, de)) > @@ -328,12 +326,10 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) > for (n = 0; n <= npages; n++) { > char *dir_end; > > - page = ufs_get_page(dir, n); > - err = PTR_ERR(page); > - if (IS_ERR(page)) > - goto out; > + kaddr = ufs_get_page(dir, n, &page); > + if (IS_ERR(kaddr)) > + return PTR_ERR(kaddr); > lock_page(page); > - kaddr = page_address(page); > dir_end = kaddr + ufs_last_byte(dir, n); > de = (struct ufs_dir_entry *)kaddr; > kaddr += PAGE_SIZE - reclen; > @@ -395,7 +391,6 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) > /* OFFSET_CACHE */ > out_put: > ufs_put_page(page); > -out: > return err; > out_unlock: > unlock_page(page); > @@ -429,6 +424,7 @@ ufs_readdir(struct file *file, struct dir_context *ctx) > unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); > bool need_revalidate = !inode_eq_iversion(inode, file->f_version); > unsigned flags = UFS_SB(sb)->s_flags; > + struct page *page; NIT: Does page now leave the scope of the for loop? > > UFSD("BEGIN\n"); > > @@ -439,16 +435,14 @@ ufs_readdir(struct file *file, struct dir_context *ctx) > char *kaddr, *limit; > struct ufs_dir_entry *de; Couldn't that be declared here? Regardless I don't think this is broken. Reviewed-by: Ira Weiny <ira.weiny@xxxxxxxxx> > > - struct page *page = ufs_get_page(inode, n); > - > - if (IS_ERR(page)) { > + kaddr = ufs_get_page(inode, n, &page); > + if (IS_ERR(kaddr)) { > ufs_error(sb, __func__, > "bad page in #%lu", > inode->i_ino); > ctx->pos += PAGE_SIZE - offset; > return -EIO; > } > - kaddr = page_address(page); > if (unlikely(need_revalidate)) { > if (offset) { > offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask); > @@ -595,12 +589,11 @@ int ufs_empty_dir(struct inode * inode) > for (i = 0; i < npages; i++) { > char *kaddr; > struct ufs_dir_entry *de; > - page = ufs_get_page(inode, i); > > - if (IS_ERR(page)) > + kaddr = ufs_get_page(inode, i, &page); > + if (IS_ERR(kaddr)) > continue; > > - kaddr = page_address(page); > de = (struct ufs_dir_entry *)kaddr; > kaddr += ufs_last_byte(inode, i) - UFS_DIR_REC_LEN(1); > > -- > 2.39.0 >