[Devel] [PATCH VZ10 1/2] fs/fuse: restore fuse_writepages() to mainstream behavior
Alexey Kuznetsov
kuznet at virtuozzo.com
Fri Apr 24 13:16:24 MSK 2026
Ack
On Mon, Apr 20, 2026 at 3:26 PM Liu Kui <kui.liu at virtuozzo.com> wrote:
>
> Restore fuse_writepages() and fuse_writepages_fill() to their original
> behavior by removing changes from commit "67d9ccc4cc1d fuse: fix
> writeback/release race". These changes make no sense at all, in particular
> set err to 0 even after write_cache_pages() returns an error is just
> wrong. The original commit should have been dropped as indicated by
> "083cb0ac8e38 fuse: Wait inflight requests"
>
> Signed-off-by: Liu Kui <kui.liu at virtuozzo.com>
> ---
> fs/fuse/file.c | 27 +++++++++------------------
> 1 file changed, 9 insertions(+), 18 deletions(-)
>
> diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> index 11fb3996a2ac..b84aac13bfc9 100644
> --- a/fs/fuse/file.c
> +++ b/fs/fuse/file.c
> @@ -1233,7 +1233,7 @@ void fuse_release_ff(struct inode *inode, struct fuse_file *ff)
> struct fuse_inode *fi = get_fuse_inode(inode);
> spin_lock(&fi->lock);
> __fuse_file_put(ff);
> - wake_up(&get_fuse_inode(inode)->page_waitq);
> + wake_up(&fi->page_waitq);
> spin_unlock(&fi->lock);
> } else {
> fuse_file_put(ff, false);
> @@ -2724,17 +2724,20 @@ static int fuse_writepages_fill(struct folio *folio,
> int err;
> int check_for_blocked = 0;
>
> - BUG_ON(wpa && !data->ff);
> -
> if (!wpa && test_bit(FUSE_I_INVAL_FILES, &fi->state)) {
> unlock_page(&folio->page);
> return -EIO;
> }
>
> + if (!data->ff) {
> + err = -EIO;
> + data->ff = fuse_write_file_get(fi);
> + if (!data->ff)
> + goto out_unlock;
> + }
> +
> if (wpa && fuse_writepage_need_send(fc, &folio->page, ap, data)) {
> fuse_writepages_send(data);
> - fuse_release_ff(inode, data->ff);
> - data->ff = NULL;
> data->wpa = NULL;
> }
>
> @@ -2757,13 +2760,6 @@ static int fuse_writepages_fill(struct folio *folio,
> * under writeback, so we can release the page lock.
> */
> if (data->wpa == NULL) {
> - /* we can acquire ff here because we do have locked pages here! */
> - BUG_ON(data->ff);
> - err = -EIO;
> - data->ff = fuse_write_file_get(fi);
> - if (!data->ff)
> - goto out_unlock;
> -
> err = -ENOMEM;
> wpa = fuse_writepage_args_setup(folio, data->ff);
> if (!wpa) {
> @@ -2794,8 +2790,6 @@ static int fuse_writepages_fill(struct folio *folio,
> data->wpa = wpa;
> } else {
> folio_end_writeback(folio);
> - fuse_release_ff(inode, data->ff);
> - data->ff = NULL;
> }
> out_unlock:
> folio_unlock(folio);
> @@ -2845,11 +2839,8 @@ static int fuse_writepages(struct address_space *mapping,
> if (data.wpa) {
> WARN_ON(!data.wpa->ia.ap.num_pages);
> fuse_writepages_send(&data);
> - fuse_release_ff(inode, data.ff);
> - data.ff = NULL;
> - err = 0;
> }
> - BUG_ON(data.ff);
> + fuse_release_ff(inode, data.ff);
>
> kfree(data.orig_pages);
> out:
> --
> 2.39.5 (Apple Git-154)
More information about the Devel
mailing list