Lines Matching refs:io_ctl

379 static int io_ctl_init(struct btrfs_io_ctl *io_ctl, struct inode *inode,
390 memset(io_ctl, 0, sizeof(struct btrfs_io_ctl));
392 io_ctl->pages = kcalloc(num_pages, sizeof(struct page *), GFP_NOFS);
393 if (!io_ctl->pages)
396 io_ctl->num_pages = num_pages;
397 io_ctl->fs_info = btrfs_sb(inode->i_sb);
398 io_ctl->inode = inode;
404 static void io_ctl_free(struct btrfs_io_ctl *io_ctl)
406 kfree(io_ctl->pages);
407 io_ctl->pages = NULL;
410 static void io_ctl_unmap_page(struct btrfs_io_ctl *io_ctl)
412 if (io_ctl->cur) {
413 io_ctl->cur = NULL;
414 io_ctl->orig = NULL;
418 static void io_ctl_map_page(struct btrfs_io_ctl *io_ctl, int clear)
420 ASSERT(io_ctl->index < io_ctl->num_pages);
421 io_ctl->page = io_ctl->pages[io_ctl->index++];
422 io_ctl->cur = page_address(io_ctl->page);
423 io_ctl->orig = io_ctl->cur;
424 io_ctl->size = PAGE_SIZE;
426 clear_page(io_ctl->cur);
429 static void io_ctl_drop_pages(struct btrfs_io_ctl *io_ctl)
433 io_ctl_unmap_page(io_ctl);
435 for (i = 0; i < io_ctl->num_pages; i++) {
436 if (io_ctl->pages[i]) {
437 btrfs_page_clear_checked(io_ctl->fs_info,
438 io_ctl->pages[i],
439 page_offset(io_ctl->pages[i]),
441 unlock_page(io_ctl->pages[i]);
442 put_page(io_ctl->pages[i]);
447 static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, bool uptodate)
450 struct inode *inode = io_ctl->inode;
454 for (i = 0; i < io_ctl->num_pages; i++) {
459 io_ctl_drop_pages(io_ctl);
467 io_ctl_drop_pages(io_ctl);
471 io_ctl->pages[i] = page;
478 io_ctl_drop_pages(io_ctl);
484 io_ctl_drop_pages(io_ctl);
490 for (i = 0; i < io_ctl->num_pages; i++)
491 clear_page_dirty_for_io(io_ctl->pages[i]);
496 static void io_ctl_set_generation(struct btrfs_io_ctl *io_ctl, u64 generation)
498 io_ctl_map_page(io_ctl, 1);
504 io_ctl->cur += (sizeof(u32) * io_ctl->num_pages);
505 io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages);
507 put_unaligned_le64(generation, io_ctl->cur);
508 io_ctl->cur += sizeof(u64);
511 static int io_ctl_check_generation(struct btrfs_io_ctl *io_ctl, u64 generation)
519 io_ctl->cur += sizeof(u32) * io_ctl->num_pages;
520 io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages);
522 cache_gen = get_unaligned_le64(io_ctl->cur);
524 btrfs_err_rl(io_ctl->fs_info,
527 io_ctl_unmap_page(io_ctl);
530 io_ctl->cur += sizeof(u64);
534 static void io_ctl_set_crc(struct btrfs_io_ctl *io_ctl, int index)
541 offset = sizeof(u32) * io_ctl->num_pages;
543 crc = btrfs_crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset);
545 io_ctl_unmap_page(io_ctl);
546 tmp = page_address(io_ctl->pages[0]);
551 static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index)
558 offset = sizeof(u32) * io_ctl->num_pages;
560 tmp = page_address(io_ctl->pages[0]);
564 io_ctl_map_page(io_ctl, 0);
565 crc = btrfs_crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset);
568 btrfs_err_rl(io_ctl->fs_info,
570 io_ctl_unmap_page(io_ctl);
577 static int io_ctl_add_entry(struct btrfs_io_ctl *io_ctl, u64 offset, u64 bytes,
582 if (!io_ctl->cur)
585 entry = io_ctl->cur;
590 io_ctl->cur += sizeof(struct btrfs_free_space_entry);
591 io_ctl->size -= sizeof(struct btrfs_free_space_entry);
593 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
596 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
599 if (io_ctl->index >= io_ctl->num_pages)
603 io_ctl_map_page(io_ctl, 1);
607 static int io_ctl_add_bitmap(struct btrfs_io_ctl *io_ctl, void *bitmap)
609 if (!io_ctl->cur)
616 if (io_ctl->cur != io_ctl->orig) {
617 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
618 if (io_ctl->index >= io_ctl->num_pages)
620 io_ctl_map_page(io_ctl, 0);
623 copy_page(io_ctl->cur, bitmap);
624 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
625 if (io_ctl->index < io_ctl->num_pages)
626 io_ctl_map_page(io_ctl, 0);
630 static void io_ctl_zero_remaining_pages(struct btrfs_io_ctl *io_ctl)
636 if (io_ctl->cur != io_ctl->orig)
637 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
639 io_ctl_unmap_page(io_ctl);
641 while (io_ctl->index < io_ctl->num_pages) {
642 io_ctl_map_page(io_ctl, 1);
643 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
647 static int io_ctl_read_entry(struct btrfs_io_ctl *io_ctl,
653 if (!io_ctl->cur) {
654 ret = io_ctl_check_crc(io_ctl, io_ctl->index);
659 e = io_ctl->cur;
663 io_ctl->cur += sizeof(struct btrfs_free_space_entry);
664 io_ctl->size -= sizeof(struct btrfs_free_space_entry);
666 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
669 io_ctl_unmap_page(io_ctl);
674 static int io_ctl_read_bitmap(struct btrfs_io_ctl *io_ctl,
679 ret = io_ctl_check_crc(io_ctl, io_ctl->index);
683 copy_page(entry->bitmap, io_ctl->cur);
684 io_ctl_unmap_page(io_ctl);
740 struct btrfs_io_ctl io_ctl;
793 ret = io_ctl_init(&io_ctl, inode, 0);
799 ret = io_ctl_prepare_pages(&io_ctl, true);
803 ret = io_ctl_check_crc(&io_ctl, 0);
807 ret = io_ctl_check_generation(&io_ctl, generation);
819 ret = io_ctl_read_entry(&io_ctl, e, &type);
870 io_ctl_unmap_page(&io_ctl);
878 ret = io_ctl_read_bitmap(&io_ctl, e);
883 io_ctl_drop_pages(&io_ctl);
886 io_ctl_free(&io_ctl);
889 io_ctl_drop_pages(&io_ctl);
1068 int write_cache_extent_entries(struct btrfs_io_ctl *io_ctl,
1101 ret = io_ctl_add_entry(io_ctl, e->offset, e->bytes,
1130 ret = io_ctl_add_entry(io_ctl, trim_entry->start,
1200 struct btrfs_io_ctl *io_ctl,
1237 ret = io_ctl_add_entry(io_ctl, extent_start, len, NULL);
1248 write_bitmap_entries(struct btrfs_io_ctl *io_ctl, struct list_head *bitmap_list)
1255 ret = io_ctl_add_bitmap(io_ctl, entry->bitmap);
1287 struct btrfs_io_ctl *io_ctl,
1290 io_ctl_drop_pages(io_ctl);
1298 struct btrfs_io_ctl *io_ctl,
1302 struct inode *inode = io_ctl->inode;
1314 io_ctl->entries, io_ctl->bitmaps);
1345 io_ctl->inode = NULL;
1358 block_group, &block_group->io_ctl,
1369 * @io_ctl: holds context for the io
1379 struct btrfs_io_ctl *io_ctl,
1392 WARN_ON(io_ctl->pages);
1393 ret = io_ctl_init(io_ctl, inode, 1);
1413 ret = io_ctl_prepare_pages(io_ctl, false);
1420 io_ctl_set_generation(io_ctl, trans->transid);
1425 ret = write_cache_extent_entries(io_ctl, ctl,
1439 ret = write_pinned_extent_entries(trans, block_group, io_ctl, &entries);
1448 ret = write_bitmap_entries(io_ctl, &bitmap_list);
1455 io_ctl_zero_remaining_pages(io_ctl);
1458 ret = btrfs_dirty_pages(BTRFS_I(inode), io_ctl->pages,
1459 io_ctl->num_pages, 0, i_size_read(inode),
1470 io_ctl_drop_pages(io_ctl);
1471 io_ctl_free(io_ctl);
1481 io_ctl->entries = entries;
1482 io_ctl->bitmaps = bitmaps;
1496 cleanup_write_cache_enospc(inode, io_ctl, &cached_state);
1503 io_ctl->inode = NULL;
1504 io_ctl_free(io_ctl);
1536 block_group, &block_group->io_ctl, trans);
1545 block_group->io_ctl.inode = NULL;