fs/sysv: Change the signature of dir_get_page()
authorFabio M. De Francesco <fmdefrancesco@gmail.com>
Thu, 19 Jan 2023 15:32:30 +0000 (16:32 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 20 Jan 2023 00:45:40 +0000 (19:45 -0500)
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>
fs/sysv/dir.c

index 0edd18e1d376e48a110a7f03cd45ac1352e07878..ad334c8ef7b12c1068c5586737a1d63911c72867 100644 (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)