1 Index: linux-5.14.0-162.23.1.el9_1/block/bdev.c
2 ===================================================================
3 --- linux-5.14.0-162.23.1.el9_1.orig/block/bdev.c
4 +++ linux-5.14.0-162.23.1.el9_1/block/bdev.c
5 @@ -506,6 +506,8 @@ struct block_device *bdev_alloc(struct g
7 void bdev_add(struct block_device *bdev, dev_t dev)
9 + if (bdev_stable_writes(bdev))
10 + mapping_set_stable_writes(bdev->bd_inode->i_mapping);
12 bdev->bd_inode->i_rdev = dev;
13 bdev->bd_inode->i_ino = dev;
14 Index: linux-5.14.0-162.23.1.el9_1/fs/inode.c
15 ===================================================================
16 --- linux-5.14.0-162.23.1.el9_1.orig/fs/inode.c
17 +++ linux-5.14.0-162.23.1.el9_1/fs/inode.c
18 @@ -192,6 +192,8 @@ int inode_init_always(struct super_block
19 lockdep_set_class_and_name(&mapping->invalidate_lock,
20 &sb->s_type->invalidate_lock_key,
21 "mapping.invalidate_lock");
22 + if (sb->s_iflags & SB_I_STABLE_WRITES)
23 + mapping_set_stable_writes(mapping);
24 inode->i_private = NULL;
25 inode->i_mapping = mapping;
26 INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */
27 Index: linux-5.14.0-162.23.1.el9_1/include/linux/pagemap.h
28 ===================================================================
29 --- linux-5.14.0-162.23.1.el9_1.orig/include/linux/pagemap.h
30 +++ linux-5.14.0-162.23.1.el9_1/include/linux/pagemap.h
31 @@ -147,6 +147,8 @@ enum mapping_flags {
32 /* writeback related tags are not used */
33 AS_NO_WRITEBACK_TAGS = 5,
34 AS_LARGE_FOLIO_SUPPORT = 6,
35 + AS_STABLE_WRITES, /* must wait for writeback before modifying
40 @@ -217,6 +219,21 @@ static inline int mapping_use_writeback_
41 return !test_bit(AS_NO_WRITEBACK_TAGS, &mapping->flags);
44 +static inline bool mapping_stable_writes(const struct address_space *mapping)
46 + return test_bit(AS_STABLE_WRITES, &mapping->flags);
49 +static inline void mapping_set_stable_writes(struct address_space *mapping)
51 + set_bit(AS_STABLE_WRITES, &mapping->flags);
54 +static inline void mapping_clear_stable_writes(struct address_space *mapping)
56 + clear_bit(AS_STABLE_WRITES, &mapping->flags);
59 static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
61 return mapping->gfp_mask;
62 Index: linux-5.14.0-162.23.1.el9_1/mm/page-writeback.c
63 ===================================================================
64 --- linux-5.14.0-162.23.1.el9_1.orig/mm/page-writeback.c
65 +++ linux-5.14.0-162.23.1.el9_1/mm/page-writeback.c
66 @@ -2965,7 +2965,7 @@ EXPORT_SYMBOL_GPL(folio_wait_writeback_k
68 void folio_wait_stable(struct folio *folio)
70 - if (folio_inode(folio)->i_sb->s_iflags & SB_I_STABLE_WRITES)
71 + if (mapping_stable_writes(folio_mapping(folio)))
72 folio_wait_writeback(folio);
74 EXPORT_SYMBOL_GPL(folio_wait_stable);