Lines Matching refs:io_ctl

44 			     struct btrfs_io_ctl *io_ctl,
303 static int io_ctl_init(struct btrfs_io_ctl *io_ctl, struct inode *inode,
319 memset(io_ctl, 0, sizeof(struct btrfs_io_ctl));
321 io_ctl->pages = kcalloc(num_pages, sizeof(struct page *), GFP_NOFS);
322 if (!io_ctl->pages)
325 io_ctl->num_pages = num_pages;
326 io_ctl->fs_info = btrfs_sb(inode->i_sb);
327 io_ctl->check_crcs = check_crcs;
328 io_ctl->inode = inode;
334 static void io_ctl_free(struct btrfs_io_ctl *io_ctl)
336 kfree(io_ctl->pages);
337 io_ctl->pages = NULL;
340 static void io_ctl_unmap_page(struct btrfs_io_ctl *io_ctl)
342 if (io_ctl->cur) {
343 io_ctl->cur = NULL;
344 io_ctl->orig = NULL;
348 static void io_ctl_map_page(struct btrfs_io_ctl *io_ctl, int clear)
350 ASSERT(io_ctl->index < io_ctl->num_pages);
351 io_ctl->page = io_ctl->pages[io_ctl->index++];
352 io_ctl->cur = page_address(io_ctl->page);
353 io_ctl->orig = io_ctl->cur;
354 io_ctl->size = PAGE_SIZE;
356 clear_page(io_ctl->cur);
359 static void io_ctl_drop_pages(struct btrfs_io_ctl *io_ctl)
363 io_ctl_unmap_page(io_ctl);
365 for (i = 0; i < io_ctl->num_pages; i++) {
366 if (io_ctl->pages[i]) {
367 ClearPageChecked(io_ctl->pages[i]);
368 unlock_page(io_ctl->pages[i]);
369 put_page(io_ctl->pages[i]);
374 static int io_ctl_prepare_pages(struct btrfs_io_ctl *io_ctl, bool uptodate)
377 struct inode *inode = io_ctl->inode;
381 for (i = 0; i < io_ctl->num_pages; i++) {
384 io_ctl_drop_pages(io_ctl);
387 io_ctl->pages[i] = page;
394 io_ctl_drop_pages(io_ctl);
400 io_ctl_drop_pages(io_ctl);
406 for (i = 0; i < io_ctl->num_pages; i++) {
407 clear_page_dirty_for_io(io_ctl->pages[i]);
408 set_page_extent_mapped(io_ctl->pages[i]);
414 static void io_ctl_set_generation(struct btrfs_io_ctl *io_ctl, u64 generation)
416 io_ctl_map_page(io_ctl, 1);
422 if (io_ctl->check_crcs) {
423 io_ctl->cur += (sizeof(u32) * io_ctl->num_pages);
424 io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages);
426 io_ctl->cur += sizeof(u64);
427 io_ctl->size -= sizeof(u64) * 2;
430 put_unaligned_le64(generation, io_ctl->cur);
431 io_ctl->cur += sizeof(u64);
434 static int io_ctl_check_generation(struct btrfs_io_ctl *io_ctl, u64 generation)
442 if (io_ctl->check_crcs) {
443 io_ctl->cur += sizeof(u32) * io_ctl->num_pages;
444 io_ctl->size -= sizeof(u64) +
445 (sizeof(u32) * io_ctl->num_pages);
447 io_ctl->cur += sizeof(u64);
448 io_ctl->size -= sizeof(u64) * 2;
451 cache_gen = get_unaligned_le64(io_ctl->cur);
453 btrfs_err_rl(io_ctl->fs_info,
456 io_ctl_unmap_page(io_ctl);
459 io_ctl->cur += sizeof(u64);
463 static void io_ctl_set_crc(struct btrfs_io_ctl *io_ctl, int index)
469 if (!io_ctl->check_crcs) {
470 io_ctl_unmap_page(io_ctl);
475 offset = sizeof(u32) * io_ctl->num_pages;
477 crc = btrfs_crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset);
479 io_ctl_unmap_page(io_ctl);
480 tmp = page_address(io_ctl->pages[0]);
485 static int io_ctl_check_crc(struct btrfs_io_ctl *io_ctl, int index)
491 if (!io_ctl->check_crcs) {
492 io_ctl_map_page(io_ctl, 0);
497 offset = sizeof(u32) * io_ctl->num_pages;
499 tmp = page_address(io_ctl->pages[0]);
503 io_ctl_map_page(io_ctl, 0);
504 crc = btrfs_crc32c(crc, io_ctl->orig + offset, PAGE_SIZE - offset);
507 btrfs_err_rl(io_ctl->fs_info,
509 io_ctl_unmap_page(io_ctl);
516 static int io_ctl_add_entry(struct btrfs_io_ctl *io_ctl, u64 offset, u64 bytes,
521 if (!io_ctl->cur)
524 entry = io_ctl->cur;
529 io_ctl->cur += sizeof(struct btrfs_free_space_entry);
530 io_ctl->size -= sizeof(struct btrfs_free_space_entry);
532 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
535 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
538 if (io_ctl->index >= io_ctl->num_pages)
542 io_ctl_map_page(io_ctl, 1);
546 static int io_ctl_add_bitmap(struct btrfs_io_ctl *io_ctl, void *bitmap)
548 if (!io_ctl->cur)
555 if (io_ctl->cur != io_ctl->orig) {
556 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
557 if (io_ctl->index >= io_ctl->num_pages)
559 io_ctl_map_page(io_ctl, 0);
562 copy_page(io_ctl->cur, bitmap);
563 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
564 if (io_ctl->index < io_ctl->num_pages)
565 io_ctl_map_page(io_ctl, 0);
569 static void io_ctl_zero_remaining_pages(struct btrfs_io_ctl *io_ctl)
575 if (io_ctl->cur != io_ctl->orig)
576 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
578 io_ctl_unmap_page(io_ctl);
580 while (io_ctl->index < io_ctl->num_pages) {
581 io_ctl_map_page(io_ctl, 1);
582 io_ctl_set_crc(io_ctl, io_ctl->index - 1);
586 static int io_ctl_read_entry(struct btrfs_io_ctl *io_ctl,
592 if (!io_ctl->cur) {
593 ret = io_ctl_check_crc(io_ctl, io_ctl->index);
598 e = io_ctl->cur;
602 io_ctl->cur += sizeof(struct btrfs_free_space_entry);
603 io_ctl->size -= sizeof(struct btrfs_free_space_entry);
605 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry))
608 io_ctl_unmap_page(io_ctl);
613 static int io_ctl_read_bitmap(struct btrfs_io_ctl *io_ctl,
618 ret = io_ctl_check_crc(io_ctl, io_ctl->index);
622 copy_page(entry->bitmap, io_ctl->cur);
623 io_ctl_unmap_page(io_ctl);
673 struct btrfs_io_ctl io_ctl;
726 ret = io_ctl_init(&io_ctl, inode, 0);
732 ret = io_ctl_prepare_pages(&io_ctl, true);
736 ret = io_ctl_check_crc(&io_ctl, 0);
740 ret = io_ctl_check_generation(&io_ctl, generation);
752 ret = io_ctl_read_entry(&io_ctl, e, &type);
813 io_ctl_unmap_page(&io_ctl);
821 ret = io_ctl_read_bitmap(&io_ctl, e);
832 io_ctl_drop_pages(&io_ctl);
837 io_ctl_free(&io_ctl);
840 io_ctl_drop_pages(&io_ctl);
942 int write_cache_extent_entries(struct btrfs_io_ctl *io_ctl,
975 ret = io_ctl_add_entry(io_ctl, e->offset, e->bytes,
1004 ret = io_ctl_add_entry(io_ctl, trim_entry->start,
1074 struct btrfs_io_ctl *io_ctl,
1112 ret = io_ctl_add_entry(io_ctl, extent_start, len, NULL);
1123 write_bitmap_entries(struct btrfs_io_ctl *io_ctl, struct list_head *bitmap_list)
1130 ret = io_ctl_add_bitmap(io_ctl, entry->bitmap);
1162 struct btrfs_io_ctl *io_ctl,
1165 io_ctl_drop_pages(io_ctl);
1173 struct btrfs_io_ctl *io_ctl,
1177 struct inode *inode = io_ctl->inode;
1189 io_ctl->entries, io_ctl->bitmaps);
1220 io_ctl->inode = NULL;
1230 struct btrfs_io_ctl *io_ctl,
1233 return __btrfs_wait_cache_io(root, trans, NULL, io_ctl, path, 0);
1241 block_group, &block_group->io_ctl,
1259 struct btrfs_io_ctl *io_ctl,
1272 WARN_ON(io_ctl->pages);
1273 ret = io_ctl_init(io_ctl, inode, 1);
1293 ret = io_ctl_prepare_pages(io_ctl, false);
1300 io_ctl_set_generation(io_ctl, trans->transid);
1305 ret = write_cache_extent_entries(io_ctl, ctl,
1319 ret = write_pinned_extent_entries(trans, block_group, io_ctl, &entries);
1328 ret = write_bitmap_entries(io_ctl, &bitmap_list);
1335 io_ctl_zero_remaining_pages(io_ctl);
1338 ret = btrfs_dirty_pages(BTRFS_I(inode), io_ctl->pages,
1339 io_ctl->num_pages, 0, i_size_read(inode),
1350 io_ctl_drop_pages(io_ctl);
1351 io_ctl_free(io_ctl);
1361 io_ctl->entries = entries;
1362 io_ctl->bitmaps = bitmaps;
1376 cleanup_write_cache_enospc(inode, io_ctl, &cached_state);
1383 io_ctl->inode = NULL;
1384 io_ctl_free(io_ctl);
1416 block_group, &block_group->io_ctl, trans);
1425 block_group->io_ctl.inode = NULL;
3971 struct btrfs_io_ctl io_ctl;
3977 memset(&io_ctl, 0, sizeof(io_ctl));
3978 ret = __btrfs_write_out_cache(root, inode, ctl, NULL, &io_ctl, trans);
3987 ret = btrfs_wait_cache_io_root(root, trans, &io_ctl, path);