Lines Matching refs:io

208 	struct ppl_io_unit *io;  in ppl_io_pool_alloc()  local
210 io = kmem_cache_alloc(kc, gfp_mask); in ppl_io_pool_alloc()
211 if (!io) in ppl_io_pool_alloc()
214 io->header_page = alloc_page(gfp_mask); in ppl_io_pool_alloc()
215 if (!io->header_page) { in ppl_io_pool_alloc()
216 kmem_cache_free(kc, io); in ppl_io_pool_alloc()
220 return io; in ppl_io_pool_alloc()
226 struct ppl_io_unit *io = element; in ppl_io_pool_free() local
228 __free_page(io->header_page); in ppl_io_pool_free()
229 kmem_cache_free(kc, io); in ppl_io_pool_free()
236 struct ppl_io_unit *io; in ppl_new_iounit() local
240 io = mempool_alloc(&ppl_conf->io_pool, GFP_NOWAIT); in ppl_new_iounit()
241 if (!io) in ppl_new_iounit()
244 header_page = io->header_page; in ppl_new_iounit()
245 memset(io, 0, sizeof(*io)); in ppl_new_iounit()
246 io->header_page = header_page; in ppl_new_iounit()
248 io->log = log; in ppl_new_iounit()
249 INIT_LIST_HEAD(&io->log_sibling); in ppl_new_iounit()
250 INIT_LIST_HEAD(&io->stripe_list); in ppl_new_iounit()
251 atomic_set(&io->pending_stripes, 0); in ppl_new_iounit()
252 atomic_set(&io->pending_flushes, 0); in ppl_new_iounit()
253 bio_init(&io->bio, log->rdev->bdev, io->biovec, PPL_IO_INLINE_BVECS, in ppl_new_iounit()
256 pplhdr = page_address(io->header_page); in ppl_new_iounit()
261 io->seq = atomic64_inc_return(&ppl_conf->seq); in ppl_new_iounit()
262 pplhdr->generation = cpu_to_le64(io->seq); in ppl_new_iounit()
264 return io; in ppl_new_iounit()
269 struct ppl_io_unit *io = log->current_io; in ppl_log_stripe() local
280 if (io && (io->pp_size == log->entry_space || in ppl_log_stripe()
281 io->entries_count == PPL_HDR_MAX_ENTRIES)) { in ppl_log_stripe()
283 __func__, io->seq); in ppl_log_stripe()
284 io = NULL; in ppl_log_stripe()
288 if (!io) { in ppl_log_stripe()
289 io = ppl_new_iounit(log, sh); in ppl_log_stripe()
290 if (!io) in ppl_log_stripe()
293 list_add_tail(&io->log_sibling, &log->io_list); in ppl_log_stripe()
296 log->current_io = io; in ppl_log_stripe()
311 io->seq, (unsigned long long)data_sector, data_disks); in ppl_log_stripe()
313 pplhdr = page_address(io->header_page); in ppl_log_stripe()
315 if (io->entries_count > 0) { in ppl_log_stripe()
317 &pplhdr->entries[io->entries_count - 1]; in ppl_log_stripe()
319 &io->stripe_list, struct stripe_head, log_list); in ppl_log_stripe()
337 e = &pplhdr->entries[io->entries_count++]; in ppl_log_stripe()
348 io->pp_size += PAGE_SIZE; in ppl_log_stripe()
354 list_add_tail(&sh->log_list, &io->stripe_list); in ppl_log_stripe()
355 atomic_inc(&io->pending_stripes); in ppl_log_stripe()
356 sh->ppl_io = io; in ppl_log_stripe()
364 struct ppl_io_unit *io = sh->ppl_io; in ppl_write_stripe() local
367 if (io || test_bit(STRIPE_SYNCING, &sh->state) || !sh->ppl_page || in ppl_write_stripe()
400 struct ppl_io_unit *io = bio->bi_private; in ppl_log_endio() local
401 struct ppl_log *log = io->log; in ppl_log_endio()
405 pr_debug("%s: seq: %llu\n", __func__, io->seq); in ppl_log_endio()
410 list_for_each_entry_safe(sh, next, &io->stripe_list, log_list) { in ppl_log_endio()
418 static void ppl_submit_iounit_bio(struct ppl_io_unit *io, struct bio *bio) in ppl_submit_iounit_bio() argument
421 __func__, io->seq, bio->bi_iter.bi_size, in ppl_submit_iounit_bio()
428 static void ppl_submit_iounit(struct ppl_io_unit *io) in ppl_submit_iounit() argument
430 struct ppl_log *log = io->log; in ppl_submit_iounit()
432 struct ppl_header *pplhdr = page_address(io->header_page); in ppl_submit_iounit()
433 struct bio *bio = &io->bio; in ppl_submit_iounit()
437 bio->bi_private = io; in ppl_submit_iounit()
444 for (i = 0; i < io->entries_count; i++) { in ppl_submit_iounit()
448 __func__, io->seq, i, le64_to_cpu(e->data_sector), in ppl_submit_iounit()
456 pplhdr->entries_count = cpu_to_le32(io->entries_count); in ppl_submit_iounit()
462 (PPL_HEADER_SIZE + io->pp_size) >> 9) in ppl_submit_iounit()
468 __bio_add_page(bio, io->header_page, PAGE_SIZE, 0); in ppl_submit_iounit()
474 log->next_io_sector += (PPL_HEADER_SIZE + io->pp_size) >> 9; in ppl_submit_iounit()
478 list_for_each_entry(sh, &io->stripe_list, log_list) { in ppl_submit_iounit()
502 ppl_submit_iounit_bio(io, prev); in ppl_submit_iounit()
506 ppl_submit_iounit_bio(io, bio); in ppl_submit_iounit()
511 struct ppl_io_unit *io; in ppl_submit_current_io() local
515 io = list_first_entry_or_null(&log->io_list, struct ppl_io_unit, in ppl_submit_current_io()
517 if (io && io->submitted) in ppl_submit_current_io()
518 io = NULL; in ppl_submit_current_io()
522 if (io) { in ppl_submit_current_io()
523 io->submitted = true; in ppl_submit_current_io()
525 if (io == log->current_io) in ppl_submit_current_io()
528 ppl_submit_iounit(io); in ppl_submit_current_io()
547 static void ppl_io_unit_finished(struct ppl_io_unit *io) in ppl_io_unit_finished() argument
549 struct ppl_log *log = io->log; in ppl_io_unit_finished()
554 pr_debug("%s: seq: %llu\n", __func__, io->seq); in ppl_io_unit_finished()
559 list_del(&io->log_sibling); in ppl_io_unit_finished()
562 mempool_free(io, &ppl_conf->io_pool); in ppl_io_unit_finished()
583 struct ppl_io_unit *io = bio->bi_private; in ppl_flush_endio() local
584 struct ppl_log *log = io->log; in ppl_flush_endio()
602 if (atomic_dec_and_test(&io->pending_flushes)) { in ppl_flush_endio()
603 ppl_io_unit_finished(io); in ppl_flush_endio()
608 static void ppl_do_flush(struct ppl_io_unit *io) in ppl_do_flush() argument
610 struct ppl_log *log = io->log; in ppl_do_flush()
617 atomic_set(&io->pending_flushes, raid_disks); in ppl_do_flush()
633 bio->bi_private = io; in ppl_do_flush()
646 if (atomic_dec_and_test(&io->pending_flushes)) in ppl_do_flush()
647 ppl_io_unit_finished(io); in ppl_do_flush()
654 struct ppl_io_unit *io; in ppl_no_io_unit_submitted() local
656 io = list_first_entry_or_null(&log->io_list, struct ppl_io_unit, in ppl_no_io_unit_submitted()
659 return !io || !io->submitted; in ppl_no_io_unit_submitted()
692 struct ppl_io_unit *io; in ppl_stripe_write_finished() local
694 io = sh->ppl_io; in ppl_stripe_write_finished()
697 if (io && atomic_dec_and_test(&io->pending_stripes)) { in ppl_stripe_write_finished()
698 if (io->log->disk_flush_bitmap) in ppl_stripe_write_finished()
699 ppl_do_flush(io); in ppl_stripe_write_finished()
701 ppl_io_unit_finished(io); in ppl_stripe_write_finished()