Re: [Cluster-devel] [PATCH 03/17] fs: rename and move block_page_mkwrite_return

2023-04-24 Thread Christoph Hellwig
On Mon, Apr 24, 2023 at 01:30:56PM +0100, Matthew Wilcox wrote:
> On Mon, Apr 24, 2023 at 07:49:12AM +0200, Christoph Hellwig wrote:
> > block_page_mkwrite_return is neither block nor mkwrite specific, and
> > should not be under CONFIG_BLOCK.  Move it to mm.h and rename it to
> > errno_to_vmfault.
> 
> Could you move it about 300 lines down and put it near vmf_error()
> so we think about how to unify the two at some point?
> 
> Perhaps it should better be called vmf_fs_error() for now since the
> errnos it handles are the kind generated by filesystems.

I'll look into unifying them for the next version.



Re: [Cluster-devel] [PATCH 03/17] fs: rename and move block_page_mkwrite_return

2023-04-24 Thread Matthew Wilcox
On Mon, Apr 24, 2023 at 07:49:12AM +0200, Christoph Hellwig wrote:
> block_page_mkwrite_return is neither block nor mkwrite specific, and
> should not be under CONFIG_BLOCK.  Move it to mm.h and rename it to
> errno_to_vmfault.

Could you move it about 300 lines down and put it near vmf_error()
so we think about how to unify the two at some point?

Perhaps it should better be called vmf_fs_error() for now since the
errnos it handles are the kind generated by filesystems.

> +++ b/include/linux/mm.h
> @@ -3061,6 +3061,19 @@ extern vm_fault_t filemap_map_pages(struct vm_fault 
> *vmf,
>   pgoff_t start_pgoff, pgoff_t end_pgoff);
>  extern vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf);
>  
> +/* Convert errno to return value from ->page_mkwrite() call */
> +static inline vm_fault_t errno_to_vmfault(int err)
> +{
> + if (err == 0)
> + return VM_FAULT_LOCKED;
> + if (err == -EFAULT || err == -EAGAIN)
> + return VM_FAULT_NOPAGE;
> + if (err == -ENOMEM)
> + return VM_FAULT_OOM;
> + /* -ENOSPC, -EDQUOT, -EIO ... */
> + return VM_FAULT_SIGBUS;
> +}
> +
>  extern unsigned long stack_guard_gap;



[Cluster-devel] [PATCH 03/17] fs: rename and move block_page_mkwrite_return

2023-04-24 Thread Christoph Hellwig
block_page_mkwrite_return is neither block nor mkwrite specific, and
should not be under CONFIG_BLOCK.  Move it to mm.h and rename it to
errno_to_vmfault.

Signed-off-by: Christoph Hellwig 
---
 fs/ext4/inode.c |  2 +-
 fs/f2fs/file.c  |  2 +-
 fs/gfs2/file.c  | 16 
 fs/iomap/buffered-io.c  |  2 +-
 fs/nilfs2/file.c|  2 +-
 fs/udf/file.c   |  2 +-
 include/linux/buffer_head.h | 12 
 include/linux/mm.h  | 13 +
 8 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index bf0b7dea4900af..c0f41a38bd9ca4 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -6343,7 +6343,7 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
if (err == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, ))
goto retry_alloc;
 out_ret:
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
 out:
filemap_invalidate_unlock_shared(mapping);
sb_end_pagefault(inode->i_sb);
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 15dabeac469050..f4ab23efcf85f8 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -161,7 +161,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
 
sb_end_pagefault(inode->i_sb);
 err:
-   return block_page_mkwrite_return(err);
+   return errno_to_vmfault(err);
 }
 
 static const struct vm_operations_struct f2fs_file_vm_ops = {
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 300844f50dcd28..8c4fad359ff538 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -432,7 +432,7 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, );
err = gfs2_glock_nq();
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_uninit;
}
 
@@ -474,7 +474,7 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
 
err = gfs2_rindex_update(sdp);
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_unlock;
}
 
@@ -482,12 +482,12 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
ap.target = data_blocks + ind_blocks;
err = gfs2_quota_lock_check(ip, );
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_unlock;
}
err = gfs2_inplace_reserve(ip, );
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_quota_unlock;
}
 
@@ -500,7 +500,7 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
}
err = gfs2_trans_begin(sdp, rblocks, 0);
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_trans_fail;
}
 
@@ -508,7 +508,7 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
if (gfs2_is_stuffed(ip)) {
err = gfs2_unstuff_dinode(ip);
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_trans_end;
}
}
@@ -524,7 +524,7 @@ static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
 
err = gfs2_allocate_page_backing(page, length);
if (err)
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
 
 out_page_locked:
if (ret != VM_FAULT_LOCKED)
@@ -558,7 +558,7 @@ static vm_fault_t gfs2_fault(struct vm_fault *vmf)
gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, );
err = gfs2_glock_nq();
if (err) {
-   ret = block_page_mkwrite_return(err);
+   ret = errno_to_vmfault(err);
goto out_uninit;
}
ret = filemap_fault(vmf);
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index 6f4c97a6d7e9dc..2986be63d2bea6 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -1290,7 +1290,7 @@ vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const 
struct iomap_ops *ops)
return VM_FAULT_LOCKED;
 out_unlock:
folio_unlock(folio);
-   return block_page_mkwrite_return(ret);
+   return errno_to_vmfault(ret);
 }
 EXPORT_SYMBOL_GPL(iomap_page_mkwrite);
 
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c
index a265d391ffe92d..ea35294bb158a3 100644
--- a/fs/nilfs2/file.c
+++ b/fs/nilfs2/file.c
@@ -108,7 +108,7 @@ static vm_fault_t nilfs_page_mkwrite(struct vm_fault *vmf)
wait_for_stable_page(page);
  out:
sb_end_pagefault(inode->i_sb);
-   return block_page_mkwrite_return(ret);
+   return errno_to_vmfault(ret);
 }
 
 static const struct