Lines Matching refs:io_ctl

382 static int io_ctl_init(struct btrfs_io_ctl *io_ctl, struct inode *inode,
393 memset(io_ctl, 0, sizeof(struct btrfs_io_ctl));
395 io_ctl->pages = kcalloc(num_pages, sizeof(struct page *), GFP_NOFS);
396 if (!io_ctl->pages)
399 io_ctl->num_pages = num_pages;
400 io_ctl->fs_info = inode_to_fs_info(inode);
401 io_ctl->inode = inode;
407 static void io_ctl_free(struct btrfs_io_ctl *io_ctl)
409 kfree(io_ctl->pages);
410 io_ctl->pages = NULL;
413 static void io_ctl_unmap_page(struct btrfs_io_ctl *io_ctl)
415 if (io_ctl->cur) {
416 io_ctl->cur = NULL;
417 io_ctl->orig = NULL;
421 static void io_ctl_map_page(struct btrfs_io_ctl *io_ctl, int clear)
423 ASSERT(io_ctl->index < io_ctl->num_pages);
424 io_ctl->page = io_ctl->pages[io_ctl->index++];
425 io_ctl->cur = page_address(io_ctl->page);
426 io_ctl->orig = io_ctl->cur;
427 io_ctl->size = PAGE_SIZE;
429 clear_page(io_ctl->cur);
432 static void io_ctl_drop_pages(struct btrfs_io_ctl *io_ctl)
436 io_ctl_unmap_page(io_ctl);
438 for (i = 0; i < io_ctl->num_pages; i++) {
439 if (io_ctl->pages[i]) {
440 btrfs_folio_clear_checked(io_ctl->fs_info,
441 page_folio(io_ctl->pages[i]),
442 page_offset(io_ctl->pages[i]),
444 unlock_page(io_ctl->pages[i]);
445 put_page(io_ctl->pages[i]);
450 static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, bool uptodate)
453 struct inode *inode = io_ctl->inode;
457 for (i = 0; i < io_ctl->num_pages; i++) {
462 io_ctl_drop_pages(io_ctl);
470 io_ctl_drop_pages(io_ctl);
474 io_ctl->pages[i] = page;
481 io_ctl_drop_pages(io_ctl);
487 io_ctl_drop_pages(io_ctl);
493 for (i = 0; i < io_ctl->num_pages; i++)
494 clear_page_dirty_for_io(io_ctl->pages[i]);
499 static void io_ctl_set_generation(struct btrfs_io_ctl *io_ctl, u64 generation)
501 io_ctl_map_page(io_ctl, 1);
507 io_ctl->cur += (sizeof(u32) * io_ctl->num_pages);
508 io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages);
510 put_unaligned_le64(generation, io_ctl->cur);
511 io_ctl->cur += sizeof(u64);
514 static int io_ctl_check_generation(struct btrfs_io_ctl *io_ctl, u64 generation)
522 io_ctl->cur += sizeof(u32) * io_ctl->num_pages;
523 io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages);
525 cache_gen = get_unaligned_le64(io_ctl->cur);
527 btrfs_err_rl(io_ctl->fs_info,
530 io_ctl_unmap_page(io_ctl);
533 io_ctl->cur += sizeof(u64);
537 static void io_ctl_set_crc(struct btrfs_io_ctl *io_ctl, int index)
544 offset = sizeof(u32) * io_ctl->num_pages;
546 crc = crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset);
548 io_ctl_unmap_page(io_ctl);
549 tmp = page_address(io_ctl->pages[0]);
554 static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index)
561 offset = sizeof(u32) * io_ctl->num_pages;
563 tmp = page_address(io_ctl->pages[0]);
567 io_ctl_map_page(io_ctl, 0);
568 crc = crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset);
571 btrfs_err_rl(io_ctl->fs_info,
573 io_ctl_unmap_page(io_ctl);
580 static int io_ctl_add_entry(struct btrfs_io_ctl *io_ctl, u64 offset, u64 bytes,
585 if (!io_ctl->cur)
588 entry = io_ctl->cur;
593 io_ctl->cur += sizeof(struct btrfs_free_space_entry);
594 io_ctl->size -= sizeof(struct btrfs_free_space_entry);
596 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
599 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
602 if (io_ctl->index >= io_ctl->num_pages)
606 io_ctl_map_page(io_ctl, 1);
610 static int io_ctl_add_bitmap(struct btrfs_io_ctl *io_ctl, void *bitmap)
612 if (!io_ctl->cur)
619 if (io_ctl->cur != io_ctl->orig) {
620 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
621 if (io_ctl->index >= io_ctl->num_pages)
623 io_ctl_map_page(io_ctl, 0);
626 copy_page(io_ctl->cur, bitmap);
627 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
628 if (io_ctl->index < io_ctl->num_pages)
629 io_ctl_map_page(io_ctl, 0);
633 static void io_ctl_zero_remaining_pages(struct btrfs_io_ctl *io_ctl)
639 if (io_ctl->cur != io_ctl->orig)
640 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
642 io_ctl_unmap_page(io_ctl);
644 while (io_ctl->index < io_ctl->num_pages) {
645 io_ctl_map_page(io_ctl, 1);
646 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
650 static int io_ctl_read_entry(struct btrfs_io_ctl *io_ctl,
656 if (!io_ctl->cur) {
657 ret = io_ctl_check_crc(io_ctl, io_ctl->index);
662 e = io_ctl->cur;
666 io_ctl->cur += sizeof(struct btrfs_free_space_entry);
667 io_ctl->size -= sizeof(struct btrfs_free_space_entry);
669 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
672 io_ctl_unmap_page(io_ctl);
677 static int io_ctl_read_bitmap(struct btrfs_io_ctl *io_ctl,
682 ret = io_ctl_check_crc(io_ctl, io_ctl->index);
686 copy_page(entry->bitmap, io_ctl->cur);
687 io_ctl_unmap_page(io_ctl);
743 struct btrfs_io_ctl io_ctl;
796 ret = io_ctl_init(&io_ctl, inode, 0);
802 ret = io_ctl_prepare_pages(&io_ctl, true);
806 ret = io_ctl_check_crc(&io_ctl, 0);
810 ret = io_ctl_check_generation(&io_ctl, generation);
822 ret = io_ctl_read_entry(&io_ctl, e, &type);
873 io_ctl_unmap_page(&io_ctl);
881 ret = io_ctl_read_bitmap(&io_ctl, e);
886 io_ctl_drop_pages(&io_ctl);
889 io_ctl_free(&io_ctl);
892 io_ctl_drop_pages(&io_ctl);
1071 int write_cache_extent_entries(struct btrfs_io_ctl *io_ctl,
1104 ret = io_ctl_add_entry(io_ctl, e->offset, e->bytes,
1133 ret = io_ctl_add_entry(io_ctl, trim_entry->start,
1203 struct btrfs_io_ctl *io_ctl,
1240 ret = io_ctl_add_entry(io_ctl, extent_start, len, NULL);
1251 write_bitmap_entries(struct btrfs_io_ctl *io_ctl, struct list_head *bitmap_list)
1258 ret = io_ctl_add_bitmap(io_ctl, entry->bitmap);
1290 struct btrfs_io_ctl *io_ctl,
1293 io_ctl_drop_pages(io_ctl);
1301 struct btrfs_io_ctl *io_ctl,
1305 struct inode *inode = io_ctl->inode;
1317 io_ctl->entries, io_ctl->bitmaps);
1348 io_ctl->inode = NULL;
1361 block_group, &block_group->io_ctl,
1371 * @io_ctl: holds context for the io
1381 struct btrfs_io_ctl *io_ctl,
1394 WARN_ON(io_ctl->pages);
1395 ret = io_ctl_init(io_ctl, inode, 1);
1415 ret = io_ctl_prepare_pages(io_ctl, false);
1422 io_ctl_set_generation(io_ctl, trans->transid);
1427 ret = write_cache_extent_entries(io_ctl, ctl,
1441 ret = write_pinned_extent_entries(trans, block_group, io_ctl, &entries);
1450 ret = write_bitmap_entries(io_ctl, &bitmap_list);
1457 io_ctl_zero_remaining_pages(io_ctl);
1460 ret = btrfs_dirty_pages(BTRFS_I(inode), io_ctl->pages,
1461 io_ctl->num_pages, 0, i_size_read(inode),
1472 io_ctl_drop_pages(io_ctl);
1473 io_ctl_free(io_ctl);
1483 io_ctl->entries = entries;
1484 io_ctl->bitmaps = bitmaps;
1498 cleanup_write_cache_enospc(inode, io_ctl, &cached_state);
1505 io_ctl->inode = NULL;
1506 io_ctl_free(io_ctl);
1538 &block_group->io_ctl, trans);
1547 block_group->io_ctl.inode = NULL;