fs/sysv: Change the signature of dir_get_page()

Change the signature of dir_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 adjust to the new signature.

Cc: Ira Weiny <ira.weiny@intel.com>
Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Fabio M. De Francesco 2023-01-19 16:32:30 +01:00 committed by Al Viro
parent 4bb1a1375a
commit 8dd6c7b294

View File

@ -57,13 +57,15 @@ static int sysv_handle_dirsync(struct inode *dir)
return err;
}
static struct page * dir_get_page(struct inode *dir, unsigned long n)
static void *dir_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);
if (!IS_ERR(page))
kmap(page);
return page;
if (IS_ERR(page))
return ERR_CAST(page);
kmap(page);
*p = page;
return page_address(page);
}
static int sysv_readdir(struct file *file, struct dir_context *ctx)
@ -85,11 +87,11 @@ static int sysv_readdir(struct file *file, struct dir_context *ctx)
for ( ; n < npages; n++, offset = 0) {
char *kaddr, *limit;
struct sysv_dir_entry *de;
struct page *page = dir_get_page(inode, n);
struct page *page;
if (IS_ERR(page))
kaddr = dir_get_page(inode, n, &page);
if (IS_ERR(kaddr))
continue;
kaddr = (char *)page_address(page);
de = (struct sysv_dir_entry *)(kaddr+offset);
limit = kaddr + PAGE_SIZE - SYSV_DIRSIZE;
for ( ;(char*)de <= limit; de++, ctx->pos += sizeof(*de)) {
@ -147,11 +149,10 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_
n = start;
do {
char *kaddr;
page = dir_get_page(dir, n);
if (!IS_ERR(page)) {
kaddr = (char*)page_address(page);
de = (struct sysv_dir_entry *) kaddr;
char *kaddr = dir_get_page(dir, n, &page);
if (!IS_ERR(kaddr)) {
de = (struct sysv_dir_entry *)kaddr;
kaddr += PAGE_SIZE - SYSV_DIRSIZE;
for ( ; (char *) de <= kaddr ; de++) {
if (!de->inode)
@ -190,11 +191,9 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode)
/* We take care of directory expansion in the same loop */
for (n = 0; n <= npages; n++) {
page = dir_get_page(dir, n);
err = PTR_ERR(page);
if (IS_ERR(page))
goto out;
kaddr = (char*)page_address(page);
kaddr = dir_get_page(dir, n, &page);
if (IS_ERR(kaddr))
return PTR_ERR(kaddr);
de = (struct sysv_dir_entry *)kaddr;
kaddr += PAGE_SIZE - SYSV_DIRSIZE;
while ((char *)de <= kaddr) {
@ -225,7 +224,6 @@ got_it:
err = sysv_handle_dirsync(dir);
out_page:
dir_put_page(page);
out:
return err;
out_unlock:
unlock_page(page);
@ -295,12 +293,11 @@ int sysv_empty_dir(struct inode * inode)
for (i = 0; i < npages; i++) {
char *kaddr;
struct sysv_dir_entry * de;
page = dir_get_page(inode, i);
if (IS_ERR(page))
kaddr = dir_get_page(inode, i, &page);
if (IS_ERR(kaddr))
continue;
kaddr = (char *)page_address(page);
de = (struct sysv_dir_entry *)kaddr;
kaddr += PAGE_SIZE-SYSV_DIRSIZE;
@ -347,16 +344,14 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page,
sysv_handle_dirsync(inode);
}
struct sysv_dir_entry * sysv_dotdot (struct inode *dir, struct page **p)
struct sysv_dir_entry *sysv_dotdot(struct inode *dir, struct page **p)
{
struct page *page = dir_get_page(dir, 0);
struct sysv_dir_entry *de = NULL;
struct sysv_dir_entry *de = dir_get_page(dir, 0, p);
if (!IS_ERR(page)) {
de = (struct sysv_dir_entry*) page_address(page) + 1;
*p = page;
}
return de;
if (IS_ERR(de))
return NULL;
/* ".." is the second directory entry */
return de + 1;
}
ino_t sysv_inode_by_name(struct dentry *dentry)