@@ -29,9 +29,9 @@ typedef int (*iomap_punch_t)(struct inode *inode, loff_t offset, loff_t length);
29
29
* and I/O completions.
30
30
*/
31
31
struct iomap_folio_state {
32
- atomic_t read_bytes_pending ;
33
- atomic_t write_bytes_pending ;
34
32
spinlock_t state_lock ;
33
+ unsigned int read_bytes_pending ;
34
+ atomic_t write_bytes_pending ;
35
35
36
36
/*
37
37
* Each block has two bits in this bitmap:
@@ -183,7 +183,7 @@ static void ifs_free(struct folio *folio)
183
183
184
184
if (!ifs )
185
185
return ;
186
- WARN_ON_ONCE (atomic_read ( & ifs -> read_bytes_pending ) );
186
+ WARN_ON_ONCE (ifs -> read_bytes_pending != 0 );
187
187
WARN_ON_ONCE (atomic_read (& ifs -> write_bytes_pending ));
188
188
WARN_ON_ONCE (ifs_is_fully_uptodate (folio , ifs ) !=
189
189
folio_test_uptodate (folio ));
@@ -250,19 +250,29 @@ static void iomap_adjust_read_range(struct inode *inode, struct folio *folio,
250
250
* lenp = plen ;
251
251
}
252
252
253
- static void iomap_finish_folio_read (struct folio * folio , size_t offset ,
253
+ static void iomap_finish_folio_read (struct folio * folio , size_t off ,
254
254
size_t len , int error )
255
255
{
256
256
struct iomap_folio_state * ifs = folio -> private ;
257
+ bool uptodate = !error ;
258
+ bool finished = true;
257
259
258
- if (unlikely (error )) {
259
- folio_clear_uptodate (folio );
260
- folio_set_error (folio );
261
- } else {
262
- iomap_set_range_uptodate (folio , offset , len );
260
+ if (ifs ) {
261
+ unsigned long flags ;
262
+
263
+ spin_lock_irqsave (& ifs -> state_lock , flags );
264
+ if (!error )
265
+ uptodate = ifs_set_range_uptodate (folio , ifs , off , len );
266
+ ifs -> read_bytes_pending -= len ;
267
+ finished = !ifs -> read_bytes_pending ;
268
+ spin_unlock_irqrestore (& ifs -> state_lock , flags );
263
269
}
264
270
265
- if (!ifs || atomic_sub_and_test (len , & ifs -> read_bytes_pending ))
271
+ if (error )
272
+ folio_set_error (folio );
273
+ if (uptodate )
274
+ folio_mark_uptodate (folio );
275
+ if (finished )
266
276
folio_unlock (folio );
267
277
}
268
278
@@ -360,8 +370,11 @@ static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
360
370
}
361
371
362
372
ctx -> cur_folio_in_bio = true;
363
- if (ifs )
364
- atomic_add (plen , & ifs -> read_bytes_pending );
373
+ if (ifs ) {
374
+ spin_lock_irq (& ifs -> state_lock );
375
+ ifs -> read_bytes_pending += plen ;
376
+ spin_unlock_irq (& ifs -> state_lock );
377
+ }
365
378
366
379
sector = iomap_sector (iomap , pos );
367
380
if (!ctx -> bio ||
0 commit comments