Viewing: add-and-use-a-per-mapping-stable-writes-flag-rhel9.4.patch

Index: linux-5.14.0-162.23.1.el9_1/block/bdev.c
===================================================================
--- linux-5.14.0-162.23.1.el9_1.orig/block/bdev.c
+++ linux-5.14.0-162.23.1.el9_1/block/bdev.c
@@ -506,6 +506,8 @@ struct block_device *bdev_alloc(struct g

 void bdev_add(struct block_device *bdev, dev_t dev)
 {
+	if (bdev_stable_writes(bdev))
+		mapping_set_stable_writes(bdev->bd_inode->i_mapping);
 	bdev->bd_dev = dev;
 	bdev->bd_inode->i_rdev = dev;
 	bdev->bd_inode->i_ino = dev;
Index: linux-5.14.0-162.23.1.el9_1/fs/inode.c
===================================================================
--- linux-5.14.0-162.23.1.el9_1.orig/fs/inode.c
+++ linux-5.14.0-162.23.1.el9_1/fs/inode.c
@@ -192,6 +192,8 @@ int inode_init_always(struct super_block
 	lockdep_set_class_and_name(&mapping->invalidate_lock,
 				   &sb->s_type->invalidate_lock_key,
 				   "mapping.invalidate_lock");
+	if (sb->s_iflags & SB_I_STABLE_WRITES)
+		mapping_set_stable_writes(mapping);
 	inode->i_private = NULL;
 	inode->i_mapping = mapping;
 	INIT_HLIST_HEAD(&inode->i_dentry);	/* buggered by rcu freeing */
Index: linux-5.14.0-427.el9/include/linux/pagemap.h
===================================================================
--- linux-5.14.0-427.el9.orig/include/linux/pagemap.h
+++ linux-5.14.0-427.el9/include/linux/pagemap.h
@@ -201,6 +201,8 @@ enum mapping_flags {
 	AS_LARGE_FOLIO_SUPPORT = 6,
 	AS_RELEASE_ALWAYS = 7,	/* Call ->release_folio(), even if no private data */
 	AS_UNMOVABLE	= 8,	/* The mapping cannot be moved, ever */
+	AS_STABLE_WRITES,	/* must wait for writeback before modifying
+				   folio contents */
 };

 /**
@@ -302,6 +304,21 @@ static inline bool mapping_unmovable(str
 	return test_bit(AS_UNMOVABLE, &mapping->flags);
 }

+static inline bool mapping_stable_writes(const struct address_space *mapping)
+{
+	return test_bit(AS_STABLE_WRITES, &mapping->flags);
+}
+
+static inline void mapping_set_stable_writes(struct address_space *mapping)
+{
+	set_bit(AS_STABLE_WRITES, &mapping->flags);
+}
+
+static inline void mapping_clear_stable_writes(struct address_space *mapping)
+{
+	clear_bit(AS_STABLE_WRITES, &mapping->flags);
+}
+
 static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
 {
 	return mapping->gfp_mask;
Index: linux-5.14.0-162.23.1.el9_1/mm/page-writeback.c
===================================================================
--- linux-5.14.0-162.23.1.el9_1.orig/mm/page-writeback.c
+++ linux-5.14.0-162.23.1.el9_1/mm/page-writeback.c
@@ -2965,7 +2965,7 @@ EXPORT_SYMBOL_GPL(folio_wait_writeback_k
  */
 void folio_wait_stable(struct folio *folio)
 {
-	if (folio_inode(folio)->i_sb->s_iflags & SB_I_STABLE_WRITES)
+	if (mapping_stable_writes(folio_mapping(folio)))
 		folio_wait_writeback(folio);
 }
 EXPORT_SYMBOL_GPL(folio_wait_stable);