@@ -67,6 +67,15 @@ void ext4_ioend_wait(struct inode *inode)
67
67
wait_event (* wq , (atomic_read (& EXT4_I (inode )-> i_ioend_count ) == 0 ));
68
68
}
69
69
70
+ static void put_io_page (struct ext4_io_page * io_page )
71
+ {
72
+ if (atomic_dec_and_test (& io_page -> p_count )) {
73
+ end_page_writeback (io_page -> p_page );
74
+ put_page (io_page -> p_page );
75
+ kmem_cache_free (io_page_cachep , io_page );
76
+ }
77
+ }
78
+
70
79
void ext4_free_io_end (ext4_io_end_t * io )
71
80
{
72
81
int i ;
@@ -75,15 +84,8 @@ void ext4_free_io_end(ext4_io_end_t *io)
75
84
BUG_ON (!io );
76
85
if (io -> page )
77
86
put_page (io -> page );
78
- for (i = 0 ; i < io -> num_io_pages ; i ++ ) {
79
- if (-- io -> pages [i ]-> p_count == 0 ) {
80
- struct page * page = io -> pages [i ]-> p_page ;
81
-
82
- end_page_writeback (page );
83
- put_page (page );
84
- kmem_cache_free (io_page_cachep , io -> pages [i ]);
85
- }
86
- }
87
+ for (i = 0 ; i < io -> num_io_pages ; i ++ )
88
+ put_io_page (io -> pages [i ]);
87
89
io -> num_io_pages = 0 ;
88
90
wq = to_ioend_wq (io -> inode );
89
91
if (atomic_dec_and_test (& EXT4_I (io -> inode )-> i_ioend_count ) &&
@@ -235,13 +237,7 @@ static void ext4_end_bio(struct bio *bio, int error)
235
237
} while (bh != head );
236
238
}
237
239
238
- if (-- io_end -> pages [i ]-> p_count == 0 ) {
239
- struct page * page = io_end -> pages [i ]-> p_page ;
240
-
241
- end_page_writeback (page );
242
- put_page (page );
243
- kmem_cache_free (io_page_cachep , io_end -> pages [i ]);
244
- }
240
+ put_io_page (io_end -> pages [i ]);
245
241
246
242
/*
247
243
* If this is a partial write which happened to make
@@ -369,7 +365,7 @@ static int io_submit_add_bh(struct ext4_io_submit *io,
369
365
if ((io_end -> num_io_pages == 0 ) ||
370
366
(io_end -> pages [io_end -> num_io_pages - 1 ] != io_page )) {
371
367
io_end -> pages [io_end -> num_io_pages ++ ] = io_page ;
372
- io_page -> p_count ++ ;
368
+ atomic_inc ( & io_page -> p_count ) ;
373
369
}
374
370
return 0 ;
375
371
}
@@ -398,7 +394,7 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
398
394
return - ENOMEM ;
399
395
}
400
396
io_page -> p_page = page ;
401
- io_page -> p_count = 0 ;
397
+ atomic_set ( & io_page -> p_count , 1 ) ;
402
398
get_page (page );
403
399
404
400
for (bh = head = page_buffers (page ), block_start = 0 ;
@@ -430,10 +426,6 @@ int ext4_bio_write_page(struct ext4_io_submit *io,
430
426
* PageWriteback bit from the page to prevent the system from
431
427
* wedging later on.
432
428
*/
433
- if (io_page -> p_count == 0 ) {
434
- put_page (page );
435
- end_page_writeback (page );
436
- kmem_cache_free (io_page_cachep , io_page );
437
- }
429
+ put_io_page (io_page );
438
430
return ret ;
439
431
}
0 commit comments