@@ -214,9 +214,11 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map)
214214
215215/*
216216 * bit 30: I/O error occurred on this folio
217+ * bit 29: CPU has dirty data in D-cache (needs aliasing handling);
217218 * bit 0 - 29: remaining parts to complete this folio
218219 */
219- #define EROFS_ONLINEFOLIO_EIO (1 << 30)
220+ #define EROFS_ONLINEFOLIO_EIO 30
221+ #define EROFS_ONLINEFOLIO_DIRTY 29
220222
221223void erofs_onlinefolio_init (struct folio * folio )
222224{
@@ -233,19 +235,23 @@ void erofs_onlinefolio_split(struct folio *folio)
233235 atomic_inc ((atomic_t * )& folio -> private );
234236}
235237
236- void erofs_onlinefolio_end (struct folio * folio , int err )
238+ void erofs_onlinefolio_end (struct folio * folio , int err , bool dirty )
237239{
238240 int orig , v ;
239241
240242 do {
241243 orig = atomic_read ((atomic_t * )& folio -> private );
242- v = (orig - 1 ) | (err ? EROFS_ONLINEFOLIO_EIO : 0 );
244+ DBG_BUGON (orig <= 0 );
245+ v = dirty << EROFS_ONLINEFOLIO_DIRTY ;
246+ v |= (orig - 1 ) | (!!err << EROFS_ONLINEFOLIO_EIO );
243247 } while (atomic_cmpxchg ((atomic_t * )& folio -> private , orig , v ) != orig );
244248
245- if (v & ~ EROFS_ONLINEFOLIO_EIO )
249+ if (v & ( BIT ( EROFS_ONLINEFOLIO_DIRTY ) - 1 ) )
246250 return ;
247251 folio -> private = 0 ;
248- folio_end_read (folio , !(v & EROFS_ONLINEFOLIO_EIO ));
252+ if (v & BIT (EROFS_ONLINEFOLIO_DIRTY ))
253+ flush_dcache_folio (folio );
254+ folio_end_read (folio , !(v & BIT (EROFS_ONLINEFOLIO_EIO )));
249255}
250256
251257static int erofs_iomap_begin (struct inode * inode , loff_t offset , loff_t length ,
0 commit comments