* [PATCH 1/7] minixfs: Convert dir_get_page() to dir_get_folio()
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 2/7] minixfs: Convert minix_find_entry() to take a folio Matthew Wilcox (Oracle)
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
Remove a few conversions between page and folio.
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 66 ++++++++++++++++++++++++++------------------------
1 file changed, 35 insertions(+), 31 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index a224cf222570..41e6c0c2e243 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -64,14 +64,15 @@ static int minix_handle_dirsync(struct inode *dir)
return err;
}
-static void *dir_get_page(struct inode *dir, unsigned long n, struct page **p)
+static void *dir_get_folio(struct inode *dir, unsigned long n,
+ struct folio **foliop)
{
- struct address_space *mapping = dir->i_mapping;
- struct page *page = read_mapping_page(mapping, n, NULL);
- if (IS_ERR(page))
- return ERR_CAST(page);
- *p = page;
- return kmap_local_page(page);
+ struct folio *folio = read_mapping_folio(dir->i_mapping, n, NULL);
+
+ if (IS_ERR(folio))
+ return ERR_CAST(folio);
+ *foliop = folio;
+ return kmap_local_folio(folio, 0);
}
static inline void *minix_next_entry(void *de, struct minix_sb_info *sbi)
@@ -99,9 +100,9 @@ static int minix_readdir(struct file *file, struct dir_context *ctx)
for ( ; n < npages; n++, offset = 0) {
char *p, *kaddr, *limit;
- struct page *page;
+ struct folio *folio;
- kaddr = dir_get_page(inode, n, &page);
+ kaddr = dir_get_folio(inode, n, &folio);
if (IS_ERR(kaddr))
continue;
p = kaddr+offset;
@@ -122,13 +123,13 @@ static int minix_readdir(struct file *file, struct dir_context *ctx)
unsigned l = strnlen(name, sbi->s_namelen);
if (!dir_emit(ctx, name, l,
inumber, DT_UNKNOWN)) {
- unmap_and_put_page(page, p);
+ folio_release_kmap(folio, p);
return 0;
}
}
ctx->pos += chunk_size;
}
- unmap_and_put_page(page, kaddr);
+ folio_release_kmap(folio, kaddr);
}
return 0;
}
@@ -158,7 +159,7 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
struct minix_sb_info * sbi = minix_sb(sb);
unsigned long n;
unsigned long npages = dir_pages(dir);
- struct page *page = NULL;
+ struct folio *folio = NULL;
char *p;
char *namx;
@@ -168,7 +169,7 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
for (n = 0; n < npages; n++) {
char *kaddr, *limit;
- kaddr = dir_get_page(dir, n, &page);
+ kaddr = dir_get_folio(dir, n, &folio);
if (IS_ERR(kaddr))
continue;
@@ -188,12 +189,12 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
if (namecompare(namelen, sbi->s_namelen, name, namx))
goto found;
}
- unmap_and_put_page(page, kaddr);
+ folio_release_kmap(folio, kaddr);
}
return NULL;
found:
- *res_page = page;
+ *res_page = &folio->page;
return (minix_dirent *)p;
}
@@ -204,7 +205,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
int namelen = dentry->d_name.len;
struct super_block * sb = dir->i_sb;
struct minix_sb_info * sbi = minix_sb(sb);
- struct page *page = NULL;
+ struct folio *folio = NULL;
unsigned long npages = dir_pages(dir);
unsigned long n;
char *kaddr, *p;
@@ -223,10 +224,10 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
for (n = 0; n <= npages; n++) {
char *limit, *dir_end;
- kaddr = dir_get_page(dir, n, &page);
+ kaddr = dir_get_folio(dir, n, &folio);
if (IS_ERR(kaddr))
return PTR_ERR(kaddr);
- lock_page(page);
+ folio_lock(folio);
dir_end = kaddr + minix_last_byte(dir, n);
limit = kaddr + PAGE_SIZE - sbi->s_dirsize;
for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
@@ -253,15 +254,15 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
if (namecompare(namelen, sbi->s_namelen, name, namx))
goto out_unlock;
}
- unlock_page(page);
- unmap_and_put_page(page, kaddr);
+ folio_unlock(folio);
+ folio_release_kmap(folio, kaddr);
}
BUG();
return -EINVAL;
got_it:
- pos = page_offset(page) + offset_in_page(p);
- err = minix_prepare_chunk(page, pos, sbi->s_dirsize);
+ pos = folio_pos(folio) + offset_in_folio(folio, p);
+ err = minix_prepare_chunk(&folio->page, pos, sbi->s_dirsize);
if (err)
goto out_unlock;
memcpy (namx, name, namelen);
@@ -272,15 +273,15 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
memset (namx + namelen, 0, sbi->s_dirsize - namelen - 2);
de->inode = inode->i_ino;
}
- dir_commit_chunk(page, pos, sbi->s_dirsize);
+ dir_commit_chunk(&folio->page, pos, sbi->s_dirsize);
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
mark_inode_dirty(dir);
err = minix_handle_dirsync(dir);
out_put:
- unmap_and_put_page(page, kaddr);
+ folio_release_kmap(folio, kaddr);
return err;
out_unlock:
- unlock_page(page);
+ folio_unlock(folio);
goto out_put;
}
@@ -357,7 +358,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
*/
int minix_empty_dir(struct inode * inode)
{
- struct page *page = NULL;
+ struct folio *folio = NULL;
unsigned long i, npages = dir_pages(inode);
struct minix_sb_info *sbi = minix_sb(inode->i_sb);
char *name, *kaddr;
@@ -366,7 +367,7 @@ int minix_empty_dir(struct inode * inode)
for (i = 0; i < npages; i++) {
char *p, *limit;
- kaddr = dir_get_page(inode, i, &page);
+ kaddr = dir_get_folio(inode, i, &folio);
if (IS_ERR(kaddr))
continue;
@@ -395,12 +396,12 @@ int minix_empty_dir(struct inode * inode)
goto not_empty;
}
}
- unmap_and_put_page(page, kaddr);
+ folio_release_kmap(folio, kaddr);
}
return 1;
not_empty:
- unmap_and_put_page(page, kaddr);
+ folio_release_kmap(folio, kaddr);
return 0;
}
@@ -431,11 +432,14 @@ int minix_set_link(struct minix_dir_entry *de, struct page *page,
struct minix_dir_entry * minix_dotdot (struct inode *dir, struct page **p)
{
+ struct folio *folio;
struct minix_sb_info *sbi = minix_sb(dir->i_sb);
- struct minix_dir_entry *de = dir_get_page(dir, 0, p);
+ struct minix_dir_entry *de = dir_get_folio(dir, 0, &folio);
- if (!IS_ERR(de))
+ if (!IS_ERR(de)) {
+ *p = &folio->page;
return minix_next_entry(de, sbi);
+ }
return NULL;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/7] minixfs: Convert minix_find_entry() to take a folio
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 1/7] minixfs: Convert dir_get_page() to dir_get_folio() Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 3/7] minifs: Convert minix_set_link() and minix_dotdot() " Matthew Wilcox (Oracle)
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
Remove a few hidden calls to compound_head().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 25 +++++++++++--------------
fs/minix/minix.h | 14 +++++++-------
fs/minix/namei.c | 25 ++++++++++++-------------
3 files changed, 30 insertions(+), 34 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index 41e6c0c2e243..3bbfac32d520 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -145,12 +145,13 @@ static inline int namecompare(int len, int maxlen,
/*
* minix_find_entry()
*
- * finds an entry in the specified directory with the wanted name. It
- * returns the cache buffer in which the entry was found, and the entry
- * itself (as a parameter - res_dir). It does NOT read the inode of the
+ * finds an entry in the specified directory with the wanted name.
+ * It does NOT read the inode of the
* entry - you'll have to do that yourself if you want to.
+ *
+ * On Success folio_release_kmap() should be called on *foliop.
*/
-minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
+minix_dirent *minix_find_entry(struct dentry *dentry, struct folio **foliop)
{
const char * name = dentry->d_name.name;
int namelen = dentry->d_name.len;
@@ -159,17 +160,15 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
struct minix_sb_info * sbi = minix_sb(sb);
unsigned long n;
unsigned long npages = dir_pages(dir);
- struct folio *folio = NULL;
char *p;
char *namx;
__u32 inumber;
- *res_page = NULL;
for (n = 0; n < npages; n++) {
char *kaddr, *limit;
- kaddr = dir_get_folio(dir, n, &folio);
+ kaddr = dir_get_folio(dir, n, foliop);
if (IS_ERR(kaddr))
continue;
@@ -189,12 +188,11 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
if (namecompare(namelen, sbi->s_namelen, name, namx))
goto found;
}
- folio_release_kmap(folio, kaddr);
+ folio_release_kmap(*foliop, kaddr);
}
return NULL;
found:
- *res_page = &folio->page;
return (minix_dirent *)p;
}
@@ -445,20 +443,19 @@ struct minix_dir_entry * minix_dotdot (struct inode *dir, struct page **p)
ino_t minix_inode_by_name(struct dentry *dentry)
{
- struct page *page;
- struct minix_dir_entry *de = minix_find_entry(dentry, &page);
+ struct folio *folio;
+ struct minix_dir_entry *de = minix_find_entry(dentry, &folio);
ino_t res = 0;
if (de) {
- struct address_space *mapping = page->mapping;
- struct inode *inode = mapping->host;
+ struct inode *inode = folio->mapping->host;
struct minix_sb_info *sbi = minix_sb(inode->i_sb);
if (sbi->s_version == MINIX_V3)
res = ((minix3_dirent *) de)->inode;
else
res = de->inode;
- unmap_and_put_page(page, de);
+ folio_release_kmap(folio, de);
}
return res;
}
diff --git a/fs/minix/minix.h b/fs/minix/minix.h
index d493507c064f..a290dd483e69 100644
--- a/fs/minix/minix.h
+++ b/fs/minix/minix.h
@@ -64,15 +64,15 @@ extern int V2_minix_get_block(struct inode *, long, struct buffer_head *, int);
extern unsigned V1_minix_blocks(loff_t, struct super_block *);
extern unsigned V2_minix_blocks(loff_t, struct super_block *);
-extern struct minix_dir_entry *minix_find_entry(struct dentry*, struct page**);
-extern int minix_add_link(struct dentry*, struct inode*);
-extern int minix_delete_entry(struct minix_dir_entry*, struct page*);
-extern int minix_make_empty(struct inode*, struct inode*);
-extern int minix_empty_dir(struct inode*);
+struct minix_dir_entry *minix_find_entry(struct dentry *, struct folio **);
+int minix_add_link(struct dentry*, struct inode*);
+int minix_delete_entry(struct minix_dir_entry*, struct page*);
+int minix_make_empty(struct inode*, struct inode*);
+int minix_empty_dir(struct inode*);
int minix_set_link(struct minix_dir_entry *de, struct page *page,
struct inode *inode);
-extern struct minix_dir_entry *minix_dotdot(struct inode*, struct page**);
-extern ino_t minix_inode_by_name(struct dentry*);
+struct minix_dir_entry *minix_dotdot(struct inode*, struct page**);
+ino_t minix_inode_by_name(struct dentry*);
extern const struct inode_operations minix_file_inode_operations;
extern const struct inode_operations minix_dir_inode_operations;
diff --git a/fs/minix/namei.c b/fs/minix/namei.c
index d6031acc34f0..117264877bd7 100644
--- a/fs/minix/namei.c
+++ b/fs/minix/namei.c
@@ -141,15 +141,15 @@ static int minix_mkdir(struct mnt_idmap *idmap, struct inode *dir,
static int minix_unlink(struct inode * dir, struct dentry *dentry)
{
struct inode * inode = d_inode(dentry);
- struct page * page;
+ struct folio *folio;
struct minix_dir_entry * de;
int err;
- de = minix_find_entry(dentry, &page);
+ de = minix_find_entry(dentry, &folio);
if (!de)
return -ENOENT;
- err = minix_delete_entry(de, page);
- unmap_and_put_page(page, de);
+ err = minix_delete_entry(de, &folio->page);
+ folio_release_kmap(folio, de);
if (err)
return err;
@@ -182,14 +182,14 @@ static int minix_rename(struct mnt_idmap *idmap,
struct inode * new_inode = d_inode(new_dentry);
struct page * dir_page = NULL;
struct minix_dir_entry * dir_de = NULL;
- struct page * old_page;
+ struct folio *old_folio;
struct minix_dir_entry * old_de;
int err = -ENOENT;
if (flags & ~RENAME_NOREPLACE)
return -EINVAL;
- old_de = minix_find_entry(old_dentry, &old_page);
+ old_de = minix_find_entry(old_dentry, &old_folio);
if (!old_de)
goto out;
@@ -201,7 +201,7 @@ static int minix_rename(struct mnt_idmap *idmap,
}
if (new_inode) {
- struct page * new_page;
+ struct folio *new_folio;
struct minix_dir_entry * new_de;
err = -ENOTEMPTY;
@@ -209,12 +209,11 @@ static int minix_rename(struct mnt_idmap *idmap,
goto out_dir;
err = -ENOENT;
- new_de = minix_find_entry(new_dentry, &new_page);
+ new_de = minix_find_entry(new_dentry, &new_folio);
if (!new_de)
goto out_dir;
- err = minix_set_link(new_de, new_page, old_inode);
- kunmap(new_page);
- put_page(new_page);
+ err = minix_set_link(new_de, &new_folio->page, old_inode);
+ folio_release_kmap(new_folio, new_de);
if (err)
goto out_dir;
inode_set_ctime_current(new_inode);
@@ -229,7 +228,7 @@ static int minix_rename(struct mnt_idmap *idmap,
inode_inc_link_count(new_dir);
}
- err = minix_delete_entry(old_de, old_page);
+ err = minix_delete_entry(old_de, &old_folio->page);
if (err)
goto out_dir;
@@ -244,7 +243,7 @@ static int minix_rename(struct mnt_idmap *idmap,
if (dir_de)
unmap_and_put_page(dir_page, dir_de);
out_old:
- unmap_and_put_page(old_page, old_de);
+ folio_release_kmap(old_folio, old_de);
out:
return err;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 3/7] minifs: Convert minix_set_link() and minix_dotdot() to take a folio
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 1/7] minixfs: Convert dir_get_page() to dir_get_folio() Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 2/7] minixfs: Convert minix_find_entry() to take a folio Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 4/7] minixfs: Convert minix_delete_entry() to work on " Matthew Wilcox (Oracle)
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
This matches ext2 and removes a few hidden calls to compound_head().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 23 ++++++++++-------------
fs/minix/minix.h | 4 ++--
fs/minix/namei.c | 10 +++++-----
3 files changed, 17 insertions(+), 20 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index 3bbfac32d520..c32d182c2d74 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -404,40 +404,37 @@ int minix_empty_dir(struct inode * inode)
}
/* Releases the page */
-int minix_set_link(struct minix_dir_entry *de, struct page *page,
+int minix_set_link(struct minix_dir_entry *de, struct folio *folio,
struct inode *inode)
{
- struct inode *dir = page->mapping->host;
+ struct inode *dir = folio->mapping->host;
struct minix_sb_info *sbi = minix_sb(dir->i_sb);
- loff_t pos = page_offset(page) + offset_in_page(de);
+ loff_t pos = folio_pos(folio) + offset_in_folio(folio, de);
int err;
- lock_page(page);
- err = minix_prepare_chunk(page, pos, sbi->s_dirsize);
+ folio_lock(folio);
+ err = minix_prepare_chunk(&folio->page, pos, sbi->s_dirsize);
if (err) {
- unlock_page(page);
+ folio_unlock(folio);
return err;
}
if (sbi->s_version == MINIX_V3)
((minix3_dirent *)de)->inode = inode->i_ino;
else
de->inode = inode->i_ino;
- dir_commit_chunk(page, pos, sbi->s_dirsize);
+ dir_commit_chunk(&folio->page, pos, sbi->s_dirsize);
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
mark_inode_dirty(dir);
return minix_handle_dirsync(dir);
}
-struct minix_dir_entry * minix_dotdot (struct inode *dir, struct page **p)
+struct minix_dir_entry *minix_dotdot(struct inode *dir, struct folio **foliop)
{
- struct folio *folio;
struct minix_sb_info *sbi = minix_sb(dir->i_sb);
- struct minix_dir_entry *de = dir_get_folio(dir, 0, &folio);
+ struct minix_dir_entry *de = dir_get_folio(dir, 0, foliop);
- if (!IS_ERR(de)) {
- *p = &folio->page;
+ if (!IS_ERR(de))
return minix_next_entry(de, sbi);
- }
return NULL;
}
diff --git a/fs/minix/minix.h b/fs/minix/minix.h
index a290dd483e69..6ed34209ed33 100644
--- a/fs/minix/minix.h
+++ b/fs/minix/minix.h
@@ -69,9 +69,9 @@ int minix_add_link(struct dentry*, struct inode*);
int minix_delete_entry(struct minix_dir_entry*, struct page*);
int minix_make_empty(struct inode*, struct inode*);
int minix_empty_dir(struct inode*);
-int minix_set_link(struct minix_dir_entry *de, struct page *page,
+int minix_set_link(struct minix_dir_entry *de, struct folio *folio,
struct inode *inode);
-struct minix_dir_entry *minix_dotdot(struct inode*, struct page**);
+struct minix_dir_entry *minix_dotdot(struct inode*, struct folio **);
ino_t minix_inode_by_name(struct dentry*);
extern const struct inode_operations minix_file_inode_operations;
diff --git a/fs/minix/namei.c b/fs/minix/namei.c
index 117264877bd7..ba82fa3332f1 100644
--- a/fs/minix/namei.c
+++ b/fs/minix/namei.c
@@ -180,7 +180,7 @@ static int minix_rename(struct mnt_idmap *idmap,
{
struct inode * old_inode = d_inode(old_dentry);
struct inode * new_inode = d_inode(new_dentry);
- struct page * dir_page = NULL;
+ struct folio * dir_folio = NULL;
struct minix_dir_entry * dir_de = NULL;
struct folio *old_folio;
struct minix_dir_entry * old_de;
@@ -195,7 +195,7 @@ static int minix_rename(struct mnt_idmap *idmap,
if (S_ISDIR(old_inode->i_mode)) {
err = -EIO;
- dir_de = minix_dotdot(old_inode, &dir_page);
+ dir_de = minix_dotdot(old_inode, &dir_folio);
if (!dir_de)
goto out_old;
}
@@ -212,7 +212,7 @@ static int minix_rename(struct mnt_idmap *idmap,
new_de = minix_find_entry(new_dentry, &new_folio);
if (!new_de)
goto out_dir;
- err = minix_set_link(new_de, &new_folio->page, old_inode);
+ err = minix_set_link(new_de, new_folio, old_inode);
folio_release_kmap(new_folio, new_de);
if (err)
goto out_dir;
@@ -235,13 +235,13 @@ static int minix_rename(struct mnt_idmap *idmap,
mark_inode_dirty(old_inode);
if (dir_de) {
- err = minix_set_link(dir_de, dir_page, new_dir);
+ err = minix_set_link(dir_de, dir_folio, new_dir);
if (!err)
inode_dec_link_count(old_dir);
}
out_dir:
if (dir_de)
- unmap_and_put_page(dir_page, dir_de);
+ folio_release_kmap(dir_folio, dir_de);
out_old:
folio_release_kmap(old_folio, old_de);
out:
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 4/7] minixfs: Convert minix_delete_entry() to work on a folio
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
` (2 preceding siblings ...)
2024-07-10 1:23 ` [PATCH 3/7] minifs: Convert minix_set_link() and minix_dotdot() " Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 5/7] minixfs: Convert minix_make_empty() to use " Matthew Wilcox (Oracle)
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
Match ext2 and remove a few hidden calls to compound_head().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 14 +++++++-------
fs/minix/minix.h | 2 +-
fs/minix/namei.c | 4 ++--
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index c32d182c2d74..994bbbd3dea2 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -283,25 +283,25 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
goto out_put;
}
-int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
+int minix_delete_entry(struct minix_dir_entry *de, struct folio *folio)
{
- struct inode *inode = page->mapping->host;
- loff_t pos = page_offset(page) + offset_in_page(de);
+ struct inode *inode = folio->mapping->host;
+ loff_t pos = folio_pos(folio) + offset_in_folio(folio, de);
struct minix_sb_info *sbi = minix_sb(inode->i_sb);
unsigned len = sbi->s_dirsize;
int err;
- lock_page(page);
- err = minix_prepare_chunk(page, pos, len);
+ folio_lock(folio);
+ err = minix_prepare_chunk(&folio->page, pos, len);
if (err) {
- unlock_page(page);
+ folio_unlock(folio);
return err;
}
if (sbi->s_version == MINIX_V3)
((minix3_dirent *)de)->inode = 0;
else
de->inode = 0;
- dir_commit_chunk(page, pos, len);
+ dir_commit_chunk(&folio->page, pos, len);
inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
mark_inode_dirty(inode);
return minix_handle_dirsync(inode);
diff --git a/fs/minix/minix.h b/fs/minix/minix.h
index 6ed34209ed33..063bab8faa6b 100644
--- a/fs/minix/minix.h
+++ b/fs/minix/minix.h
@@ -66,7 +66,7 @@ extern unsigned V2_minix_blocks(loff_t, struct super_block *);
struct minix_dir_entry *minix_find_entry(struct dentry *, struct folio **);
int minix_add_link(struct dentry*, struct inode*);
-int minix_delete_entry(struct minix_dir_entry*, struct page*);
+int minix_delete_entry(struct minix_dir_entry *, struct folio *);
int minix_make_empty(struct inode*, struct inode*);
int minix_empty_dir(struct inode*);
int minix_set_link(struct minix_dir_entry *de, struct folio *folio,
diff --git a/fs/minix/namei.c b/fs/minix/namei.c
index ba82fa3332f1..5d9c1406fe27 100644
--- a/fs/minix/namei.c
+++ b/fs/minix/namei.c
@@ -148,7 +148,7 @@ static int minix_unlink(struct inode * dir, struct dentry *dentry)
de = minix_find_entry(dentry, &folio);
if (!de)
return -ENOENT;
- err = minix_delete_entry(de, &folio->page);
+ err = minix_delete_entry(de, folio);
folio_release_kmap(folio, de);
if (err)
@@ -228,7 +228,7 @@ static int minix_rename(struct mnt_idmap *idmap,
inode_inc_link_count(new_dir);
}
- err = minix_delete_entry(old_de, &old_folio->page);
+ err = minix_delete_entry(old_de, old_folio);
if (err)
goto out_dir;
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 5/7] minixfs: Convert minix_make_empty() to use a folio
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
` (3 preceding siblings ...)
2024-07-10 1:23 ` [PATCH 4/7] minixfs: Convert minix_delete_entry() to work on " Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 6/7] minixfs: Convert minix_prepare_chunk() to take " Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 7/7] minixfs: Convert dir_commit_chunk() " Matthew Wilcox (Oracle)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
Removes a few hidden calls to compound_head().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index 994bbbd3dea2..15b3ef1e473c 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -309,21 +309,21 @@ int minix_delete_entry(struct minix_dir_entry *de, struct folio *folio)
int minix_make_empty(struct inode *inode, struct inode *dir)
{
- struct page *page = grab_cache_page(inode->i_mapping, 0);
+ struct folio *folio = filemap_grab_folio(inode->i_mapping, 0);
struct minix_sb_info *sbi = minix_sb(inode->i_sb);
char *kaddr;
int err;
- if (!page)
- return -ENOMEM;
- err = minix_prepare_chunk(page, 0, 2 * sbi->s_dirsize);
+ if (IS_ERR(folio))
+ return PTR_ERR(folio);
+ err = minix_prepare_chunk(&folio->page, 0, 2 * sbi->s_dirsize);
if (err) {
- unlock_page(page);
+ folio_unlock(folio);
goto fail;
}
- kaddr = kmap_local_page(page);
- memset(kaddr, 0, PAGE_SIZE);
+ kaddr = kmap_local_folio(folio, 0);
+ memset(kaddr, 0, folio_size(folio));
if (sbi->s_version == MINIX_V3) {
minix3_dirent *de3 = (minix3_dirent *)kaddr;
@@ -344,10 +344,10 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
}
kunmap_local(kaddr);
- dir_commit_chunk(page, 0, 2 * sbi->s_dirsize);
+ dir_commit_chunk(&folio->page, 0, 2 * sbi->s_dirsize);
err = minix_handle_dirsync(inode);
fail:
- put_page(page);
+ folio_put(folio);
return err;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 6/7] minixfs: Convert minix_prepare_chunk() to take a folio
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
` (4 preceding siblings ...)
2024-07-10 1:23 ` [PATCH 5/7] minixfs: Convert minix_make_empty() to use " Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
2024-07-10 1:23 ` [PATCH 7/7] minixfs: Convert dir_commit_chunk() " Matthew Wilcox (Oracle)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
All callers now have a folio, so convert minix_prepare_chunk() to
take one.
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 8 ++++----
fs/minix/inode.c | 4 ++--
fs/minix/minix.h | 24 ++++++++++++------------
3 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index 15b3ef1e473c..26bfea508028 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -260,7 +260,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
got_it:
pos = folio_pos(folio) + offset_in_folio(folio, p);
- err = minix_prepare_chunk(&folio->page, pos, sbi->s_dirsize);
+ err = minix_prepare_chunk(folio, pos, sbi->s_dirsize);
if (err)
goto out_unlock;
memcpy (namx, name, namelen);
@@ -292,7 +292,7 @@ int minix_delete_entry(struct minix_dir_entry *de, struct folio *folio)
int err;
folio_lock(folio);
- err = minix_prepare_chunk(&folio->page, pos, len);
+ err = minix_prepare_chunk(folio, pos, len);
if (err) {
folio_unlock(folio);
return err;
@@ -316,7 +316,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
if (IS_ERR(folio))
return PTR_ERR(folio);
- err = minix_prepare_chunk(&folio->page, 0, 2 * sbi->s_dirsize);
+ err = minix_prepare_chunk(folio, 0, 2 * sbi->s_dirsize);
if (err) {
folio_unlock(folio);
goto fail;
@@ -413,7 +413,7 @@ int minix_set_link(struct minix_dir_entry *de, struct folio *folio,
int err;
folio_lock(folio);
- err = minix_prepare_chunk(&folio->page, pos, sbi->s_dirsize);
+ err = minix_prepare_chunk(folio, pos, sbi->s_dirsize);
if (err) {
folio_unlock(folio);
return err;
diff --git a/fs/minix/inode.c b/fs/minix/inode.c
index 1c3df63162ef..0002337977e0 100644
--- a/fs/minix/inode.c
+++ b/fs/minix/inode.c
@@ -427,9 +427,9 @@ static int minix_read_folio(struct file *file, struct folio *folio)
return block_read_full_folio(folio, minix_get_block);
}
-int minix_prepare_chunk(struct page *page, loff_t pos, unsigned len)
+int minix_prepare_chunk(struct folio *folio, loff_t pos, unsigned len)
{
- return __block_write_begin(page, pos, len, minix_get_block);
+ return __block_write_begin(&folio->page, pos, len, minix_get_block);
}
static void minix_write_failed(struct address_space *mapping, loff_t to)
diff --git a/fs/minix/minix.h b/fs/minix/minix.h
index 063bab8faa6b..d54273c3c9ff 100644
--- a/fs/minix/minix.h
+++ b/fs/minix/minix.h
@@ -42,18 +42,18 @@ struct minix_sb_info {
unsigned short s_version;
};
-extern struct inode *minix_iget(struct super_block *, unsigned long);
-extern struct minix_inode * minix_V1_raw_inode(struct super_block *, ino_t, struct buffer_head **);
-extern struct minix2_inode * minix_V2_raw_inode(struct super_block *, ino_t, struct buffer_head **);
-extern struct inode * minix_new_inode(const struct inode *, umode_t);
-extern void minix_free_inode(struct inode * inode);
-extern unsigned long minix_count_free_inodes(struct super_block *sb);
-extern int minix_new_block(struct inode * inode);
-extern void minix_free_block(struct inode *inode, unsigned long block);
-extern unsigned long minix_count_free_blocks(struct super_block *sb);
-extern int minix_getattr(struct mnt_idmap *, const struct path *,
- struct kstat *, u32, unsigned int);
-extern int minix_prepare_chunk(struct page *page, loff_t pos, unsigned len);
+struct inode *minix_iget(struct super_block *, unsigned long);
+struct minix_inode *minix_V1_raw_inode(struct super_block *, ino_t, struct buffer_head **);
+struct minix2_inode *minix_V2_raw_inode(struct super_block *, ino_t, struct buffer_head **);
+struct inode *minix_new_inode(const struct inode *, umode_t);
+void minix_free_inode(struct inode *inode);
+unsigned long minix_count_free_inodes(struct super_block *sb);
+int minix_new_block(struct inode *inode);
+void minix_free_block(struct inode *inode, unsigned long block);
+unsigned long minix_count_free_blocks(struct super_block *sb);
+int minix_getattr(struct mnt_idmap *, const struct path *,
+ struct kstat *, u32, unsigned int);
+int minix_prepare_chunk(struct folio *folio, loff_t pos, unsigned len);
extern void V1_minix_truncate(struct inode *);
extern void V2_minix_truncate(struct inode *);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 7/7] minixfs: Convert dir_commit_chunk() to take a folio
2024-07-10 1:23 [PATCH 0/7] Convert minixfs directory handling to folios Matthew Wilcox (Oracle)
` (5 preceding siblings ...)
2024-07-10 1:23 ` [PATCH 6/7] minixfs: Convert minix_prepare_chunk() to take " Matthew Wilcox (Oracle)
@ 2024-07-10 1:23 ` Matthew Wilcox (Oracle)
6 siblings, 0 replies; 8+ messages in thread
From: Matthew Wilcox (Oracle) @ 2024-07-10 1:23 UTC (permalink / raw)
To: linux-fsdevel; +Cc: Matthew Wilcox (Oracle), Al Viro, Christoph Hellwig
All callers now have a folio, so pass it in. Saves a call to
compound_head().
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/minix/dir.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index 26bfea508028..5f9e2fc91003 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -40,18 +40,18 @@ minix_last_byte(struct inode *inode, unsigned long page_nr)
return last_byte;
}
-static void dir_commit_chunk(struct page *page, loff_t pos, unsigned len)
+static void dir_commit_chunk(struct folio *folio, loff_t pos, unsigned len)
{
- struct address_space *mapping = page->mapping;
+ struct address_space *mapping = folio->mapping;
struct inode *dir = mapping->host;
- block_write_end(NULL, mapping, pos, len, len, page, NULL);
+ block_write_end(NULL, mapping, pos, len, len, &folio->page, NULL);
if (pos+len > dir->i_size) {
i_size_write(dir, pos+len);
mark_inode_dirty(dir);
}
- unlock_page(page);
+ folio_unlock(folio);
}
static int minix_handle_dirsync(struct inode *dir)
@@ -271,7 +271,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
memset (namx + namelen, 0, sbi->s_dirsize - namelen - 2);
de->inode = inode->i_ino;
}
- dir_commit_chunk(&folio->page, pos, sbi->s_dirsize);
+ dir_commit_chunk(folio, pos, sbi->s_dirsize);
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
mark_inode_dirty(dir);
err = minix_handle_dirsync(dir);
@@ -301,7 +301,7 @@ int minix_delete_entry(struct minix_dir_entry *de, struct folio *folio)
((minix3_dirent *)de)->inode = 0;
else
de->inode = 0;
- dir_commit_chunk(&folio->page, pos, len);
+ dir_commit_chunk(folio, pos, len);
inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
mark_inode_dirty(inode);
return minix_handle_dirsync(inode);
@@ -344,7 +344,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
}
kunmap_local(kaddr);
- dir_commit_chunk(&folio->page, 0, 2 * sbi->s_dirsize);
+ dir_commit_chunk(folio, 0, 2 * sbi->s_dirsize);
err = minix_handle_dirsync(inode);
fail:
folio_put(folio);
@@ -422,7 +422,7 @@ int minix_set_link(struct minix_dir_entry *de, struct folio *folio,
((minix3_dirent *)de)->inode = inode->i_ino;
else
de->inode = inode->i_ino;
- dir_commit_chunk(&folio->page, pos, sbi->s_dirsize);
+ dir_commit_chunk(folio, pos, sbi->s_dirsize);
inode_set_mtime_to_ts(dir, inode_set_ctime_current(dir));
mark_inode_dirty(dir);
return minix_handle_dirsync(dir);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread