minix: move releasing pages into unlink and rename
authorChristoph Hellwig <hch@lst.de>
Wed, 18 Jan 2023 17:30:21 +0000 (18:30 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 20 Jan 2023 00:26:24 +0000 (19:26 -0500)
Instead of consuming the page reference and kmap in the low-level
minix_delete_entry and minix_set_link helpers, do it in the callers
where that code can be shared with the error cleanup path.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/minix/dir.c
fs/minix/namei.c

index dcfe5b25378b54242d781ed7aaae23d6678379a3..ec462330e749afc2b168d034379f09f738fbace3 100644 (file)
@@ -306,7 +306,6 @@ int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
        } else {
                unlock_page(page);
        }
-       dir_put_page(page);
        inode->i_ctime = inode->i_mtime = current_time(inode);
        mark_inode_dirty(inode);
        return err;
@@ -430,7 +429,6 @@ void minix_set_link(struct minix_dir_entry *de, struct page *page,
        } else {
                unlock_page(page);
        }
-       dir_put_page(page);
        dir->i_mtime = dir->i_ctime = current_time(dir);
        mark_inode_dirty(dir);
 }
index a4f5e6caf8fe7ffd9116ea0bf84b9b412286d735..7dc48141887119626b3385800427f8592db7aa6e 100644 (file)
@@ -140,23 +140,23 @@ out_fail:
 
 static int minix_unlink(struct inode * dir, struct dentry *dentry)
 {
-       int err = -ENOENT;
        struct inode * inode = d_inode(dentry);
        struct page * page;
        struct minix_dir_entry * de;
+       int err;
 
        de = minix_find_entry(dentry, &page);
        if (!de)
-               goto end_unlink;
-
+               return -ENOENT;
        err = minix_delete_entry(de, page);
-       if (err)
-               goto end_unlink;
+       kunmap(page);
+       put_page(page);
 
+       if (err)
+               return err;
        inode->i_ctime = dir->i_ctime;
        inode_dec_link_count(inode);
-end_unlink:
-       return err;
+       return 0;
 }
 
 static int minix_rmdir(struct inode * dir, struct dentry *dentry)
@@ -213,7 +213,10 @@ static int minix_rename(struct user_namespace *mnt_userns,
                new_de = minix_find_entry(new_dentry, &new_page);
                if (!new_de)
                        goto out_dir;
+               err = 0;
                minix_set_link(new_de, new_page, old_inode);
+               kunmap(new_page);
+               put_page(new_page);
                new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
@@ -233,8 +236,6 @@ static int minix_rename(struct user_namespace *mnt_userns,
                minix_set_link(dir_de, dir_page, new_dir);
                inode_dec_link_count(old_dir);
        }
-       return 0;
-
 out_dir:
        if (dir_de) {
                kunmap(dir_page);