| From: Christoph Hellwig <hch@lst.de> |
| Subject: minix: move releasing pages into unlink and rename |
| Date: Wed, 18 Jan 2023 18:30:21 +0100 |
| |
| Patch series "remove most callers of write_one_page", v3. |
| |
| This series removes most users of the write_one_page API. These helpers |
| internally call ->writepage which we are gradually removing from the |
| kernel. |
| |
| |
| This patch (of 7): |
| |
| 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. |
| |
| Link: https://lkml.kernel.org/r/20230118173027.294869-1-hch@lst.de |
| Link: https://lkml.kernel.org/r/20230118173027.294869-2-hch@lst.de |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Cc: Evgeniy Dushistov <dushistov@mail.ru> |
| Cc: Joel Becker <jlbec@evilplan.org> |
| Cc: Joseph Qi <joseph.qi@linux.alibaba.com> |
| Cc: Mark Fasheh <mark@fasheh.com> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Jan Kara <jack@suse.cz> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| fs/minix/dir.c | 2 -- |
| fs/minix/namei.c | 19 ++++++++++--------- |
| 2 files changed, 10 insertions(+), 11 deletions(-) |
| |
| --- a/fs/minix/dir.c~minix-move-releasing-pages-into-unlink-and-rename |
| +++ a/fs/minix/dir.c |
| @@ -306,7 +306,6 @@ int minix_delete_entry(struct minix_dir_ |
| } 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_ent |
| } else { |
| unlock_page(page); |
| } |
| - dir_put_page(page); |
| dir->i_mtime = dir->i_ctime = current_time(dir); |
| mark_inode_dirty(dir); |
| } |
| --- a/fs/minix/namei.c~minix-move-releasing-pages-into-unlink-and-rename |
| +++ a/fs/minix/namei.c |
| @@ -150,23 +150,23 @@ out_dir: |
| |
| 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) |
| @@ -223,7 +223,10 @@ static int minix_rename(struct user_name |
| 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); |
| @@ -243,8 +246,6 @@ static int minix_rename(struct user_name |
| 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); |
| _ |