Commit 92fcf151766d for kernel

commit 92fcf151766d7406a36f2ba363dc811024146212
Merge: 03973f7f3556 ee17c0cd763b
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Tue Oct 27 09:06:00 2026 -1000

    Merge tag 'f2fs-for-7.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs

    Pull f2fs updates from Jaegeuk Kim:
     "In this round, key enhancements focus on introducing a dedicated
      metadata cache infrastructure and dynamically parameterizing on-disk
      block layouts and geometry macros.

      Moving meta, node, and compress blocks out of the VFS page cache
      removes the page == block size assumption for metadata, which along
      with dynamic block layout descriptions paves the way for large folio
      and page != block support in the future.

      We also opt in to multigrain timestamps, add bio entry-count
      throttling for asynchronous write_end_io completion, and expose the
      resizable_tail feature via sysfs.

      Alongside these features, critical bug fixes resolve race conditions
      across compression, mmap write faults, checkpoint/shutdown, and
      filesystem freeze, prevent write bio splitting and GC holes on
      sequential zoned devices, and strengthen on-disk sanity checks for
      SIT/NAT bitmaps, read-only curseg entries, and device aliasing.

      Additional stability patches address online resize, roll-forward
      recovery, atomic file operations, quota handling, and dirty inode
      syncing livelocks.

      Enhancements:
       - implement dedicated metadata cache for meta, node, and compress
         blocks to decouple metadata from page cache for large folio and
         page != block support
       - dynamically describe SIT, NAT, orphan, dentry, node, and xattr
         block layouts and parameterize block/sector/node conversion macros
       - opt in to multigrain timestamps
       - introduce max_atc_write_bio_entry_cnt sysfs node
       - expose resizable_tail feature via sysfs
       - avoid unnecessary reads in f2fs_update_meta_block()

    Bug fixes:
       - compress: force out-place update for all writes, allow pinning
         empty compressed files, and fix truncate/writeback and cache
         population races
       - zone: avoid bio split and GC target block grab failure on
         sequential zones
       - quota: convert inline quota files on quotaon, fix flush failure
         during freeze, and restore empty string mount options
       - atomic/mmap: disallow mmap write and data-modifying fallocate on
         atomic files, avoid truncate_inode_pages_final() on live inodes,
         and fix races in f2fs_vm_page_mkwrite()
       - resize/alias: refresh pinned allocation boundary and flush SIT
         journal during resize, and drop pending discards before reserving
         device alias
       - sanity check: bound SIT/NAT bitmaps by checkpoint pack, check all
         cur_*_segno[] on readonly images, and validate multi-device on
         device alias
       - recovery/cp: release removed xattr node in roll-forward recovery,
         invalidate curseg on change_curseg() failure, and return -EIO for
         lost inode block after cp_error
       - fix livelock in syncing dirty inodes and preserve APPEND/UPDATE ino
         entries
       - use bio_in_atomic() in f2fs_{read,write}_end_io()
       - fix 32-bit shift truncation in mount option bitmasks and defragment
         range

      And a number of minor bug fixes"

    * tag 'f2fs-for-7.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs: (79 commits)
      f2fs: compress: don't overwrite populated compress cache entry
      f2fs: fix to update superblock crc in sanity_check_area_boundary()
      f2fs: fix to fetch ino via ino_of_node() under cache lock
      f2fs: zone: fix to don't fail to grab GC target block on zoned device
      f2fs: don't use truncate_inode_pages_final() on live inodes
      f2fs: expose resizable_tail feature via sysfs
      f2fs: use BIT_ULL for mount option bitmasks
      f2fs: fix submit accounting for IPU writeback
      f2fs: fix to avoid potential reference count leak in do_garbage_collect()
      f2fs: refresh pinned allocation boundary after resize
      f2fs: flush SIT journal during filesystem resize
      f2fs: release a removed xattr node in roll-forward recovery
      f2fs: quota: fix quota flush failure during filesystem freeze
      f2fs: return -EIO for a lost inode block after cp_error
      f2fs: avoid unnecessary reads in f2fs_update_meta_block()
      f2fs: bound the SIT/NAT bitmaps by the checkpoint pack
      f2fs: opt in to multigrain timestamps
      f2fs: fix to use bio_in_atomic() in f2fs_read_end_io()
      f2fs: fix to use bio_in_atomic() in f2fs_write_end_io()
      f2fs: fix to invalidate curseg if change_curseg() fails
      ...

diff --cc fs/f2fs/acl.c
index 22ca39e0aad6,34c9aa279040..a7485bc38252
--- a/fs/f2fs/acl.c
+++ b/fs/f2fs/acl.c
@@@ -240,9 -240,9 +240,9 @@@ static int f2fs_acl_update_mode(const s
  	return 0;
  }

 -static int __f2fs_set_acl(struct mnt_idmap *idmap,
 +static int __f2fs_set_acl(const struct mnt_idmap *idmap,
  			struct inode *inode, int type,
- 			struct posix_acl *acl, struct folio *ifolio)
+ 			struct posix_acl *acl, struct f2fs_cached_block *ientry)
  {
  	int name_index;
  	void *value = NULL;
diff --cc fs/f2fs/acl.h
index 01ec74b6daf2,0f639367a0ab..b1085efcc05e
--- a/fs/f2fs/acl.h
+++ b/fs/f2fs/acl.h
@@@ -34,10 -34,11 +34,11 @@@ struct f2fs_acl_header
  #ifdef CONFIG_F2FS_FS_POSIX_ACL

  struct posix_acl *f2fs_get_acl(struct inode *, int, bool);
 -int f2fs_set_acl(struct mnt_idmap *, struct dentry *,
 +int f2fs_set_acl(const struct mnt_idmap *, struct dentry *,
  			struct posix_acl *, int);
- int f2fs_init_acl(struct inode *, struct inode *, struct folio *ifolio,
- 		struct folio *dfolio);
+ int f2fs_init_acl(struct inode *inode, struct inode *dir,
+ 			struct f2fs_cached_block *ientry,
+ 			struct f2fs_cached_block *dentry);
  #else
  #define f2fs_get_acl	NULL
  #define f2fs_set_acl	NULL
diff --cc fs/f2fs/f2fs.h
index e3108c5f7c91,aedba8b79baa..f7423b3f6e4a
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@@ -1614,23 -1612,21 +1609,21 @@@ static inline void f2fs_clear_bit(unsig
   *
   * Layout A: lowest bit should be 1
   * | bit0 = 1 | bit1 | bit2 | ... | bit MAX | private data .... |
 - * bit 0	PAGE_PRIVATE_NOT_POINTER
 - * bit 1	PAGE_PRIVATE_ONGOING_MIGRATION
 - * bit 2	PAGE_PRIVATE_REF_RESOURCE
 - * bit 3	PAGE_PRIVATE_ATOMIC_WRITE
 + * bit 0	F2FS_FOLIO_PRIVATE_NOT_POINTER
 + * bit 1	F2FS_FOLIO_PRIVATE_ONGOING_MIGRATION
-  * bit 2	F2FS_FOLIO_PRIVATE_INLINE_INODE
-  * bit 3	F2FS_FOLIO_PRIVATE_REF_RESOURCE
-  * bit 4	F2FS_FOLIO_PRIVATE_ATOMIC_WRITE
-  * bit 5-	f2fs private data
++ * bit 2	F2FS_FOLIO_PRIVATE_REF_RESOURCE
++ * bit 3	F2FS_FOLIO_PRIVATE_ATOMIC_WRITE
+  * bit 4-	f2fs private data
   *
   * Layout B: lowest bit should be 0
 - * page.private is a wrapped pointer.
 + * folio->private is a wrapped pointer.
   */
  enum {
 -	PAGE_PRIVATE_NOT_POINTER,		/* private contains non-pointer data */
 -	PAGE_PRIVATE_ONGOING_MIGRATION,		/* data page which is on-going migrating */
 -	PAGE_PRIVATE_REF_RESOURCE,		/* dirty page has referenced resources */
 -	PAGE_PRIVATE_ATOMIC_WRITE,		/* data page from atomic write path */
 -	PAGE_PRIVATE_MAX
 +	F2FS_FOLIO_PRIVATE_NOT_POINTER,		/* private contains non-pointer data */
 +	F2FS_FOLIO_PRIVATE_ONGOING_MIGRATION,		/* data page which is on-going migrating */
- 	F2FS_FOLIO_PRIVATE_INLINE_INODE,		/* inode page contains inline data */
 +	F2FS_FOLIO_PRIVATE_REF_RESOURCE,		/* dirty page has referenced resources */
 +	F2FS_FOLIO_PRIVATE_ATOMIC_WRITE,		/* data page from atomic write path */
 +	F2FS_FOLIO_PRIVATE_MAX
  };

  /* For compression */
@@@ -2710,22 -2804,25 +2788,19 @@@ static inline void folio_clear_f2fs_##n
  		folio_detach_private(folio);				\
  	else								\
  		folio->private = (void *)v;				\
 -}									\
 -static inline void clear_page_private_##name(struct page *page) \
 -{ \
 -	clear_bit(PAGE_PRIVATE_##flagname, &page_private(page)); \
 -	if (page_private(page) == BIT(PAGE_PRIVATE_NOT_POINTER)) \
 -		detach_page_private(page); \
  }

 -PAGE_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
 -PAGE_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
 -PAGE_PRIVATE_GET_FUNC(atomic, ATOMIC_WRITE);
 +F2FS_FOLIO_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
- F2FS_FOLIO_PRIVATE_GET_FUNC(inline, INLINE_INODE);
 +F2FS_FOLIO_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
 +F2FS_FOLIO_PRIVATE_GET_FUNC(atomic, ATOMIC_WRITE);

 -PAGE_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
 -PAGE_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
 -PAGE_PRIVATE_SET_FUNC(atomic, ATOMIC_WRITE);
 +F2FS_FOLIO_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
- F2FS_FOLIO_PRIVATE_SET_FUNC(inline, INLINE_INODE);
 +F2FS_FOLIO_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
 +F2FS_FOLIO_PRIVATE_SET_FUNC(atomic, ATOMIC_WRITE);

 -PAGE_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
 -PAGE_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
 -PAGE_PRIVATE_CLEAR_FUNC(atomic, ATOMIC_WRITE);
 +F2FS_FOLIO_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
- F2FS_FOLIO_PRIVATE_CLEAR_FUNC(inline, INLINE_INODE);
 +F2FS_FOLIO_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
 +F2FS_FOLIO_PRIVATE_CLEAR_FUNC(atomic, ATOMIC_WRITE);

  static inline unsigned long folio_get_f2fs_data(struct folio *folio)
  {