public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
From: Joanne Koong <joannelkoong@gmail.com>
To: John <therealgraysky@proton.me>
Cc: "linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
	 "linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
	Miklos Szeredi <miklos@szeredi.hu>, Jan Kara <jack@suse.cz>
Subject: Re: [BUG] fuse: wb_wait_for_completion hang on suspend with fuse-overlayfs on tmpfs persists in 6.19.6 (AS_NO_DATA_INTEGRITY fix incomplete)
Date: Wed, 18 Mar 2026 13:45:27 -0700	[thread overview]
Message-ID: <CAJnrk1ZN+yomK5K_R4Nxxv=ZEAYy5Ar9N+hpbo5LpsXYy7rMMg@mail.gmail.com> (raw)
In-Reply-To: <RpU1mj3pXVN8QpvJ8becDTZfVEyrXr3vXn9DdUlorLJ9yTza3xM1Qqgj2kWVeqbdDMqPp4SLS-kys-3J-4XVXXSgvglffXAmF2w_4zrTuc4=@proton.me>

On Wed, Mar 18, 2026 at 1:37 PM John <therealgraysky@proton.me> wrote:
>
>
> On Tuesday, March 17th, 2026 at 11:51 PM, Joanne Koong <joannelkoong@gmail.com> wrote:
> > I think this is the cleaner fix:
> >
> > writeback: skip sync(2) inode writeback for filesystems with no data
> > integrity guarantees
> >
> > Add SB_I_NO_DATA_INTEGRITY superblock flag for filesystems that cannot
> > guarantee data persistence on sync (eg fuse) and skip sync(2) inode
> > writeback for superblocks with this flag set.
> >
> > This replaces the per-inode AS_NO_DATA_INTEGRITY mapping flag added in
> > commit f9a49aa302a0 ("fs/writeback: skip AS_NO_DATA_INTEGRITY mappings
> > in wait_sb_inodes()"). The flag belongs at the superblock level because
> > data integrity is a filesystem-wide property,  not a per-inode one. This
> > also allows sync_inodes_one_sb() to skip the entire filesystem
> > efficiently, rather than iterating every dirty inode only to skip each
> > one individually.
> >
> > Without this, sync(2) triggers writeback on FUSE inodes and may block
> > waiting for the daemon to complete issued writeback or setattr (from
> > ->write_inode()) requests.
> >
> > This restores fuse to its prior behavior before tmp folios were removed,
> > where sync was essentially a no-op.
> >
> > Reported-by: John <therealgraysky@proton.me>
> > Fixes: 0c58a97f919c ("fuse: remove tmp folio for writebacks and
> > internal rb tree")
> > Cc: <stable@vger.kernel.org>
> > Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
> > ---
> >  fs/fs-writeback.c              |  7 +------
> >  fs/fuse/file.c                 |  4 +---
> >  fs/fuse/inode.c                |  1 +
> >  fs/sync.c                      |  2 +-
> >  include/linux/fs/super_types.h |  1 +
> >  include/linux/pagemap.h        | 11 -----------
> >  6 files changed, 5 insertions(+), 21 deletions(-)
> >
> > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
> > index 8f8069fb76ba..7a02483e0d8d 100644
> > --- a/fs/fs-writeback.c
> > +++ b/fs/fs-writeback.c
> > @@ -2774,13 +2774,8 @@ static void wait_sb_inodes(struct super_block *sb)
> >                  * The mapping can appear untagged while still on-list since we
> >                  * do not have the mapping lock. Skip it here, wb completion
> >                  * will remove it.
> > -                *
> > -                * If the mapping does not have data integrity semantics,
> > -                * there's no need to wait for the writeout to complete, as the
> > -                * mapping cannot guarantee that data is persistently stored.
> >                  */
> > -               if (!mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK) ||
> > -                   mapping_no_data_integrity(mapping))
> > +               if (!mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK))
> >                         continue;
> >
> >                 spin_unlock_irq(&sb->s_inode_wblist_lock);
> > diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> > index 7294bd347412..111ccc5bdda3 100644
> > --- a/fs/fuse/file.c
> > +++ b/fs/fuse/file.c
> > @@ -3205,10 +3205,8 @@ void fuse_init_file_inode(struct inode *inode,
> > unsigned int flags)
> >
> >         inode->i_fop = &fuse_file_operations;
> >         inode->i_data.a_ops = &fuse_file_aops;
> > -       if (fc->writeback_cache) {
> > +       if (fc->writeback_cache)
> >                 mapping_set_writeback_may_deadlock_on_reclaim(&inode->i_data);
> > -               mapping_set_no_data_integrity(&inode->i_data);
> > -       }
> >
> >         INIT_LIST_HEAD(&fi->write_files);
> >         INIT_LIST_HEAD(&fi->queued_writes);
> > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> > index af8ad96829fd..bae7d9ac3a43 100644
> > --- a/fs/fuse/inode.c
> > +++ b/fs/fuse/inode.c
> > @@ -1769,6 +1769,7 @@ static void fuse_sb_defaults(struct super_block *sb)
> >         sb->s_export_op = &fuse_export_operations;
> >         sb->s_iflags |= SB_I_IMA_UNVERIFIABLE_SIGNATURE;
> >         sb->s_iflags |= SB_I_NOIDMAP;
> > +       sb->s_iflags |= SB_I_NO_DATA_INTEGRITY;
> >         if (sb->s_user_ns != &init_user_ns)
> >                 sb->s_iflags |= SB_I_UNTRUSTED_MOUNTER;
> >         sb->s_flags &= ~(SB_NOSEC | SB_I_VERSION);
> > diff --git a/fs/sync.c b/fs/sync.c
> > index 942a60cfedfb..88c08e2f76b2 100644
> > --- a/fs/sync.c
> > +++ b/fs/sync.c
> > @@ -73,7 +73,7 @@ EXPORT_SYMBOL(sync_filesystem);
> >
> >  static void sync_inodes_one_sb(struct super_block *sb, void *arg)
> >  {
> > -       if (!sb_rdonly(sb))
> > +       if (!sb_rdonly(sb) && !(sb->s_iflags & SB_I_NO_DATA_INTEGRITY))
> >                 sync_inodes_sb(sb);
> >  }
> >
> > diff --git a/include/linux/fs/super_types.h b/include/linux/fs/super_types.h
> > index fa7638b81246..383050e7fdf5 100644
> > --- a/include/linux/fs/super_types.h
> > +++ b/include/linux/fs/super_types.h
> > @@ -338,5 +338,6 @@ struct super_block {
> >  #define SB_I_NOUMASK   0x00001000      /* VFS does not apply umask */
> >  #define SB_I_NOIDMAP   0x00002000      /* No idmapped mounts on this
> > superblock */
> >  #define SB_I_ALLOW_HSM 0x00004000      /* Allow HSM events on this
> > superblock */
> > +#define SB_I_NO_DATA_INTEGRITY 0x00008000 /* fs cannot guarantee data
> > persistence on sync */
> >
> >  #endif /* _LINUX_FS_SUPER_TYPES_H */
> > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> > index ec442af3f886..31a848485ad9 100644
> > --- a/include/linux/pagemap.h
> > +++ b/include/linux/pagemap.h
> > @@ -210,7 +210,6 @@ enum mapping_flags {
> >         AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM = 9,
> >         AS_KERNEL_FILE = 10,    /* mapping for a fake kernel file that shouldn't
> >                                    account usage to user cgroups */
> > -       AS_NO_DATA_INTEGRITY = 11, /* no data integrity guarantees */
> >         /* Bits 16-25 are used for FOLIO_ORDER */
> >         AS_FOLIO_ORDER_BITS = 5,
> >         AS_FOLIO_ORDER_MIN = 16,
> > @@ -346,16 +345,6 @@ static inline bool
> > mapping_writeback_may_deadlock_on_reclaim(const struct addres
> >         return test_bit(AS_WRITEBACK_MAY_DEADLOCK_ON_RECLAIM, &mapping->flags);
> >  }
> >
> > -static inline void mapping_set_no_data_integrity(struct address_space *mapping)
> > -{
> > -       set_bit(AS_NO_DATA_INTEGRITY, &mapping->flags);
> > -}
> > -
> > -static inline bool mapping_no_data_integrity(const struct
> > address_space *mapping)
> > -{
> > -       return test_bit(AS_NO_DATA_INTEGRITY, &mapping->flags);
> > -}
> > -
> >  static inline gfp_t mapping_gfp_mask(const struct address_space *mapping)
> >  {
> >         return mapping->gfp_mask;
> >
> > I tested it locally on my simulated repro and it fixed the issue for
> > me. Could you verify that this patch fixes the issue for you as well?
>
> This new patch also corrects the bug. Same test as before. Thank you!

Great, I will submit this patch to the mailing list today. Thank you
for verifying!

  reply	other threads:[~2026-03-18 20:45 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-15 11:24 [BUG] fuse: wb_wait_for_completion hang on suspend with fuse-overlayfs on tmpfs persists in 6.19.6 (AS_NO_DATA_INTEGRITY fix incomplete) John
2026-03-17  0:15 ` Joanne Koong
2026-03-17 21:07   ` John
2026-03-17 22:55     ` Joanne Koong
2026-03-18  3:50     ` Joanne Koong
2026-03-18 20:37       ` John
2026-03-18 20:45         ` Joanne Koong [this message]
2026-03-17 23:25   ` Joanne Koong
2026-03-18 22:31     ` Joanne Koong

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='CAJnrk1ZN+yomK5K_R4Nxxv=ZEAYy5Ar9N+hpbo5LpsXYy7rMMg@mail.gmail.com' \
    --to=joannelkoong@gmail.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=therealgraysky@proton.me \
    /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