mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Mark Brown <broonie@kernel.org>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: Christian Brauner <brauner@kernel.org>,
	Kiryl Shutsemau <kas@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Linux Next Mailing List <linux-next@vger.kernel.org>,
	Miklos Szeredi <mszeredi@redhat.com>
Subject: linux-next: manual merge of the fuse tree with the vfs-brauner-fixes tree
Date: Wed, 11 Nov 2026 14:34:40 +0000	[thread overview]
Message-ID: <avR9APrG3b5DUOEs@sirena.org.uk> (raw)

[-- Attachment #1: Type: text/plain, Size: 6660 bytes --]

Hi all,

Today's linux-next merge of the fuse tree got a conflict in:

  fs/fuse/dev.c

between commit:

  80beb226de50b ("fuse: don't move pipe buffers into the page cache")

from the vfs-brauner-fixes tree and commit:

  9c1fd690cbb1f ("fuse: reject unmovable folios before stealing them")

from the fuse tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

diff --combined fs/fuse/dev.c
index a5c08a00cf83b,e7d9c506afaac..0000000000000
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@@ -1099,6 -1099,138 +1099,6 @@@ static int fuse_copy_do(struct fuse_cop
  	return ncpy;
  }
  
 -static int fuse_check_folio(struct folio *folio)
 -{
 -	if (folio_mapped(folio) ||
 -	    folio->mapping != NULL ||
 -	    (folio->flags.f & PAGE_FLAGS_CHECK_AT_PREP &
 -	     ~(1 << PG_locked |
 -	       1 << PG_referenced |
 -	       1 << PG_lru |
 -	       1 << PG_active |
 -	       1 << PG_workingset |
 -	       1 << PG_reclaim |
 -	       1 << PG_waiters |
 -	       LRU_GEN_MASK | LRU_REFS_MASK))) {
 -		dump_page(&folio->page, "fuse: trying to steal weird page");
 -		return 1;
 -	}
 -	return 0;
 -}
 -
 -/*
 - * Attempt to steal a page from the splice() pipe and move it into the
 - * pagecache. If successful, the pointer in @pagep will be updated. The
 - * folio that was originally in @pagep will lose a reference and the new
 - * folio returned in @pagep will carry a reference.
 - */
 -static int fuse_try_move_folio(struct fuse_copy_state *cs, struct folio **foliop)
 -{
 -	int err;
 -	struct folio *oldfolio = *foliop;
 -	struct folio *newfolio;
 -	struct pipe_buffer *buf = cs->pipebufs;
 -
 -	folio_get(oldfolio);
 -	err = unlock_request(cs->req);
 -	if (err)
 -		goto out_put_old;
 -
 -	fuse_copy_finish(cs);
 -
 -	err = pipe_buf_confirm(cs->pipe, buf);
 -	if (err)
 -		goto out_put_old;
 -
 -	BUG_ON(!cs->nr_segs);
 -	cs->currbuf = buf;
 -	cs->len = buf->len;
 -	cs->pipebufs++;
 -	cs->nr_segs--;
 -
 -	if (cs->len != folio_size(oldfolio))
 -		goto out_fallback;
 -
 -	newfolio = page_folio(buf->page);
 -
 -	if (folio_test_large(newfolio))
 -		goto out_fallback;
 -
 -	/*
 -	 * A swap backed, anonymous or mapped folio can never be moved into the
 -	 * page cache.  fuse_check_folio() would catch these below, but only
 -	 * after the steal has already removed the folio from its mapping, so
 -	 * check them here, while the answer is still meaningful.
 -	 */
 -	if (folio_test_swapbacked(newfolio) || folio_test_anon(newfolio) ||
 -	    folio_mapped(newfolio))
 -		goto out_fallback;
 -
 -	/*
 -	 * This is a new and locked page, it shouldn't be mapped or
 -	 * have any special flags on it
 -	 */
 -	if (WARN_ON(folio_mapped(oldfolio)))
 -		goto out_fallback;
 -	if (WARN_ON(folio_has_private(oldfolio)))
 -		goto out_fallback;
 -	if (WARN_ON(folio_test_dirty(oldfolio) ||
 -				folio_test_writeback(oldfolio)))
 -		goto out_fallback;
 -	if (WARN_ON(folio_test_mlocked(oldfolio)))
 -		goto out_fallback;
 -
 -	if (!pipe_buf_try_steal(cs->pipe, buf))
 -		goto out_fallback;
 -
 -	folio_clear_uptodate(newfolio);
 -	folio_clear_mappedtodisk(newfolio);
 -
 -	if (fuse_check_folio(newfolio) != 0)
 -		goto out_fallback_unlock;
 -
 -	err = lock_request(cs->req);
 -	if (err)
 -		goto out_fallback_unlock;
 -
 -	replace_page_cache_folio(oldfolio, newfolio);
 -
 -	folio_get(newfolio);
 -
 -	if (!(buf->flags & PIPE_BUF_FLAG_LRU))
 -		folio_add_lru(newfolio);
 -
 -	/*
 -	 * Release while we have extra ref on stolen page.  Otherwise
 -	 * anon_pipe_buf_release() might think the page can be reused.
 -	 */
 -	pipe_buf_release(cs->pipe, buf);
 -
 -	*foliop = newfolio;
 -	folio_unlock(oldfolio);
 -	/* Drop ref for ap->pages[] array */
 -	folio_put(oldfolio);
 -	cs->len = 0;
 -
 -	err = 0;
 -out_put_old:
 -	/* Drop ref obtained in this function */
 -	folio_put(oldfolio);
 -	return err;
 -
 -out_fallback_unlock:
 -	folio_unlock(newfolio);
 -out_fallback:
 -	cs->pg = buf->page;
 -	cs->offset = buf->offset;
 -
 -	err = lock_request(cs->req);
 -	if (!err)
 -		err = 1;
 -
 -	goto out_put_old;
 -}
 -
  static int fuse_ref_folio(struct fuse_copy_state *cs, struct folio *folio,
  			  unsigned offset, unsigned count)
  {
@@@ -1153,9 -1285,16 +1153,9 @@@ int fuse_copy_folio(struct fuse_copy_st
  				return fuse_ref_folio(cs, folio, offset, count);
  			}
  		} else if (!cs->len) {
 -			if (cs->move_folios && folio &&
 -			    offset == 0 && count == folio_size(folio)) {
 -				err = fuse_try_move_folio(cs, foliop);
 -				if (err <= 0)
 -					return err;
 -			} else {
 -				err = fuse_copy_fill(cs);
 -				if (err)
 -					return err;
 -			}
 +			err = fuse_copy_fill(cs);
 +			if (err)
 +				return err;
  		}
  		if (folio) {
  			void *mapaddr = kmap_local_folio(folio, offset);
@@@ -1627,7 -1766,7 +1627,7 @@@ static ssize_t fuse_dev_splice_read(str
  		 * Need to be careful about this.  Having buf->ops in module
  		 * code can Oops if the buffer persists after module unload.
  		 */
 -		bufs[page_nr].ops = &nosteal_pipe_buf_ops;
 +		bufs[page_nr].ops = &default_pipe_buf_ops;
  		bufs[page_nr].flags = 0;
  		ret = add_to_pipe(pipe, &bufs[page_nr++]);
  		if (unlikely(ret < 0))
@@@ -1791,6 -1930,9 +1791,6 @@@ static ssize_t fuse_dev_do_write(struc
  		if (!smp_load_acquire(&fch->initialized) || !fch->connected)
  			goto copy_finish;
  
 -		/* Don't try to move folios (yet) */
 -		cs->move_folios = false;
 -
  		err = fuse_notify(fch->conn, oh.error, nbytes - sizeof(oh), cs);
  		goto copy_finish;
  	}
@@@ -1834,6 -1976,8 +1834,6 @@@
  	set_bit(FR_LOCKED, &req->flags);
  	spin_unlock(&fpq->lock);
  	cs->req = req;
 -	if (!req->args->page_replace)
 -		cs->move_folios = false;
  
  	if (oh.error)
  		err = nbytes != sizeof(oh) ? -EINVAL : 0;
@@@ -1934,6 -2078,7 +1934,6 @@@ static ssize_t fuse_dev_splice_write(st
  				goto out_free;
  
  			*obuf = *ibuf;
 -			obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
  			obuf->len = rem;
  			ibuf->offset += obuf->len;
  			ibuf->len -= obuf->len;
@@@ -1948,6 -2093,9 +1948,6 @@@
  	cs.nr_segs = nbuf;
  	cs.pipe = pipe;
  
 -	if (flags & SPLICE_F_MOVE)
 -		cs.move_folios = true;
 -
  	ret = fuse_dev_do_write(fud, &cs, len);
  
  	pipe_lock(pipe);

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

             reply	other threads:[~2026-11-11 14:34 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-11 14:34 Mark Brown [this message]
  -- strict thread matches above, loose matches on Subject: below --
2026-10-15 11:29 Mark Brown
2026-05-22 11:05 Mark Brown
2026-05-22 12:28 ` Miklos Szeredi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=avR9APrG3b5DUOEs@sirena.org.uk \
    --to=broonie@kernel.org \
    --cc=brauner@kernel.org \
    --cc=kas@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-next@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=mszeredi@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®