• Home
  • Raw
  • Download

Lines Matching refs:io_ctl

264 struct io_ctl {  struct
275 static int io_ctl_init(struct io_ctl *io_ctl, struct inode *inode, in io_ctl_init() argument
278 memset(io_ctl, 0, sizeof(struct io_ctl)); in io_ctl_init()
279 io_ctl->num_pages = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> in io_ctl_init()
281 io_ctl->pages = kzalloc(sizeof(struct page *) * io_ctl->num_pages, in io_ctl_init()
283 if (!io_ctl->pages) in io_ctl_init()
285 io_ctl->root = root; in io_ctl_init()
287 io_ctl->check_crcs = 1; in io_ctl_init()
291 static void io_ctl_free(struct io_ctl *io_ctl) in io_ctl_free() argument
293 kfree(io_ctl->pages); in io_ctl_free()
296 static void io_ctl_unmap_page(struct io_ctl *io_ctl) in io_ctl_unmap_page() argument
298 if (io_ctl->cur) { in io_ctl_unmap_page()
299 kunmap(io_ctl->page); in io_ctl_unmap_page()
300 io_ctl->cur = NULL; in io_ctl_unmap_page()
301 io_ctl->orig = NULL; in io_ctl_unmap_page()
305 static void io_ctl_map_page(struct io_ctl *io_ctl, int clear) in io_ctl_map_page() argument
307 WARN_ON(io_ctl->cur); in io_ctl_map_page()
308 BUG_ON(io_ctl->index >= io_ctl->num_pages); in io_ctl_map_page()
309 io_ctl->page = io_ctl->pages[io_ctl->index++]; in io_ctl_map_page()
310 io_ctl->cur = kmap(io_ctl->page); in io_ctl_map_page()
311 io_ctl->orig = io_ctl->cur; in io_ctl_map_page()
312 io_ctl->size = PAGE_CACHE_SIZE; in io_ctl_map_page()
314 memset(io_ctl->cur, 0, PAGE_CACHE_SIZE); in io_ctl_map_page()
317 static void io_ctl_drop_pages(struct io_ctl *io_ctl) in io_ctl_drop_pages() argument
321 io_ctl_unmap_page(io_ctl); in io_ctl_drop_pages()
323 for (i = 0; i < io_ctl->num_pages; i++) { in io_ctl_drop_pages()
324 if (io_ctl->pages[i]) { in io_ctl_drop_pages()
325 ClearPageChecked(io_ctl->pages[i]); in io_ctl_drop_pages()
326 unlock_page(io_ctl->pages[i]); in io_ctl_drop_pages()
327 page_cache_release(io_ctl->pages[i]); in io_ctl_drop_pages()
332 static int io_ctl_prepare_pages(struct io_ctl *io_ctl, struct inode *inode, in io_ctl_prepare_pages() argument
339 for (i = 0; i < io_ctl->num_pages; i++) { in io_ctl_prepare_pages()
342 io_ctl_drop_pages(io_ctl); in io_ctl_prepare_pages()
345 io_ctl->pages[i] = page; in io_ctl_prepare_pages()
352 io_ctl_drop_pages(io_ctl); in io_ctl_prepare_pages()
358 for (i = 0; i < io_ctl->num_pages; i++) { in io_ctl_prepare_pages()
359 clear_page_dirty_for_io(io_ctl->pages[i]); in io_ctl_prepare_pages()
360 set_page_extent_mapped(io_ctl->pages[i]); in io_ctl_prepare_pages()
366 static void io_ctl_set_generation(struct io_ctl *io_ctl, u64 generation) in io_ctl_set_generation() argument
370 io_ctl_map_page(io_ctl, 1); in io_ctl_set_generation()
376 if (io_ctl->check_crcs) { in io_ctl_set_generation()
377 io_ctl->cur += (sizeof(u32) * io_ctl->num_pages); in io_ctl_set_generation()
378 io_ctl->size -= sizeof(u64) + (sizeof(u32) * io_ctl->num_pages); in io_ctl_set_generation()
380 io_ctl->cur += sizeof(u64); in io_ctl_set_generation()
381 io_ctl->size -= sizeof(u64) * 2; in io_ctl_set_generation()
384 val = io_ctl->cur; in io_ctl_set_generation()
386 io_ctl->cur += sizeof(u64); in io_ctl_set_generation()
389 static int io_ctl_check_generation(struct io_ctl *io_ctl, u64 generation) in io_ctl_check_generation() argument
397 if (io_ctl->check_crcs) { in io_ctl_check_generation()
398 io_ctl->cur += sizeof(u32) * io_ctl->num_pages; in io_ctl_check_generation()
399 io_ctl->size -= sizeof(u64) + in io_ctl_check_generation()
400 (sizeof(u32) * io_ctl->num_pages); in io_ctl_check_generation()
402 io_ctl->cur += sizeof(u64); in io_ctl_check_generation()
403 io_ctl->size -= sizeof(u64) * 2; in io_ctl_check_generation()
406 gen = io_ctl->cur; in io_ctl_check_generation()
411 io_ctl_unmap_page(io_ctl); in io_ctl_check_generation()
414 io_ctl->cur += sizeof(u64); in io_ctl_check_generation()
418 static void io_ctl_set_crc(struct io_ctl *io_ctl, int index) in io_ctl_set_crc() argument
424 if (!io_ctl->check_crcs) { in io_ctl_set_crc()
425 io_ctl_unmap_page(io_ctl); in io_ctl_set_crc()
430 offset = sizeof(u32) * io_ctl->num_pages; in io_ctl_set_crc()
432 crc = btrfs_csum_data(io_ctl->root, io_ctl->orig + offset, crc, in io_ctl_set_crc()
435 io_ctl_unmap_page(io_ctl); in io_ctl_set_crc()
436 tmp = kmap(io_ctl->pages[0]); in io_ctl_set_crc()
439 kunmap(io_ctl->pages[0]); in io_ctl_set_crc()
442 static int io_ctl_check_crc(struct io_ctl *io_ctl, int index) in io_ctl_check_crc() argument
448 if (!io_ctl->check_crcs) { in io_ctl_check_crc()
449 io_ctl_map_page(io_ctl, 0); in io_ctl_check_crc()
454 offset = sizeof(u32) * io_ctl->num_pages; in io_ctl_check_crc()
456 tmp = kmap(io_ctl->pages[0]); in io_ctl_check_crc()
459 kunmap(io_ctl->pages[0]); in io_ctl_check_crc()
461 io_ctl_map_page(io_ctl, 0); in io_ctl_check_crc()
462 crc = btrfs_csum_data(io_ctl->root, io_ctl->orig + offset, crc, in io_ctl_check_crc()
468 io_ctl_unmap_page(io_ctl); in io_ctl_check_crc()
475 static int io_ctl_add_entry(struct io_ctl *io_ctl, u64 offset, u64 bytes, in io_ctl_add_entry() argument
480 if (!io_ctl->cur) in io_ctl_add_entry()
483 entry = io_ctl->cur; in io_ctl_add_entry()
488 io_ctl->cur += sizeof(struct btrfs_free_space_entry); in io_ctl_add_entry()
489 io_ctl->size -= sizeof(struct btrfs_free_space_entry); in io_ctl_add_entry()
491 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry)) in io_ctl_add_entry()
494 io_ctl_set_crc(io_ctl, io_ctl->index - 1); in io_ctl_add_entry()
497 if (io_ctl->index >= io_ctl->num_pages) in io_ctl_add_entry()
501 io_ctl_map_page(io_ctl, 1); in io_ctl_add_entry()
505 static int io_ctl_add_bitmap(struct io_ctl *io_ctl, void *bitmap) in io_ctl_add_bitmap() argument
507 if (!io_ctl->cur) in io_ctl_add_bitmap()
514 if (io_ctl->cur != io_ctl->orig) { in io_ctl_add_bitmap()
515 io_ctl_set_crc(io_ctl, io_ctl->index - 1); in io_ctl_add_bitmap()
516 if (io_ctl->index >= io_ctl->num_pages) in io_ctl_add_bitmap()
518 io_ctl_map_page(io_ctl, 0); in io_ctl_add_bitmap()
521 memcpy(io_ctl->cur, bitmap, PAGE_CACHE_SIZE); in io_ctl_add_bitmap()
522 io_ctl_set_crc(io_ctl, io_ctl->index - 1); in io_ctl_add_bitmap()
523 if (io_ctl->index < io_ctl->num_pages) in io_ctl_add_bitmap()
524 io_ctl_map_page(io_ctl, 0); in io_ctl_add_bitmap()
528 static void io_ctl_zero_remaining_pages(struct io_ctl *io_ctl) in io_ctl_zero_remaining_pages() argument
534 if (io_ctl->cur != io_ctl->orig) in io_ctl_zero_remaining_pages()
535 io_ctl_set_crc(io_ctl, io_ctl->index - 1); in io_ctl_zero_remaining_pages()
537 io_ctl_unmap_page(io_ctl); in io_ctl_zero_remaining_pages()
539 while (io_ctl->index < io_ctl->num_pages) { in io_ctl_zero_remaining_pages()
540 io_ctl_map_page(io_ctl, 1); in io_ctl_zero_remaining_pages()
541 io_ctl_set_crc(io_ctl, io_ctl->index - 1); in io_ctl_zero_remaining_pages()
545 static int io_ctl_read_entry(struct io_ctl *io_ctl, in io_ctl_read_entry() argument
551 if (!io_ctl->cur) { in io_ctl_read_entry()
552 ret = io_ctl_check_crc(io_ctl, io_ctl->index); in io_ctl_read_entry()
557 e = io_ctl->cur; in io_ctl_read_entry()
561 io_ctl->cur += sizeof(struct btrfs_free_space_entry); in io_ctl_read_entry()
562 io_ctl->size -= sizeof(struct btrfs_free_space_entry); in io_ctl_read_entry()
564 if (io_ctl->size >= sizeof(struct btrfs_free_space_entry)) in io_ctl_read_entry()
567 io_ctl_unmap_page(io_ctl); in io_ctl_read_entry()
572 static int io_ctl_read_bitmap(struct io_ctl *io_ctl, in io_ctl_read_bitmap() argument
577 ret = io_ctl_check_crc(io_ctl, io_ctl->index); in io_ctl_read_bitmap()
581 memcpy(entry->bitmap, io_ctl->cur, PAGE_CACHE_SIZE); in io_ctl_read_bitmap()
582 io_ctl_unmap_page(io_ctl); in io_ctl_read_bitmap()
593 struct io_ctl io_ctl; in __load_free_space_cache() local
642 ret = io_ctl_init(&io_ctl, inode, root); in __load_free_space_cache()
650 ret = io_ctl_prepare_pages(&io_ctl, inode, 1); in __load_free_space_cache()
654 ret = io_ctl_check_crc(&io_ctl, 0); in __load_free_space_cache()
658 ret = io_ctl_check_generation(&io_ctl, generation); in __load_free_space_cache()
668 ret = io_ctl_read_entry(&io_ctl, e, &type); in __load_free_space_cache()
715 io_ctl_unmap_page(&io_ctl); in __load_free_space_cache()
723 ret = io_ctl_read_bitmap(&io_ctl, e); in __load_free_space_cache()
728 io_ctl_drop_pages(&io_ctl); in __load_free_space_cache()
731 io_ctl_free(&io_ctl); in __load_free_space_cache()
734 io_ctl_drop_pages(&io_ctl); in __load_free_space_cache()
841 struct io_ctl io_ctl; in __btrfs_write_out_cache() local
855 ret = io_ctl_init(&io_ctl, inode, root); in __btrfs_write_out_cache()
866 io_ctl_prepare_pages(&io_ctl, inode, 0); in __btrfs_write_out_cache()
878 if (io_ctl.check_crcs && in __btrfs_write_out_cache()
879 (io_ctl.num_pages * sizeof(u32)) >= PAGE_CACHE_SIZE) { in __btrfs_write_out_cache()
884 io_ctl_set_generation(&io_ctl, trans->transid); in __btrfs_write_out_cache()
893 ret = io_ctl_add_entry(&io_ctl, e->offset, e->bytes, in __btrfs_write_out_cache()
944 ret = io_ctl_add_entry(&io_ctl, extent_start, len, NULL); in __btrfs_write_out_cache()
956 ret = io_ctl_add_bitmap(&io_ctl, entry->bitmap); in __btrfs_write_out_cache()
963 io_ctl_zero_remaining_pages(&io_ctl); in __btrfs_write_out_cache()
965 ret = btrfs_dirty_pages(root, inode, io_ctl.pages, io_ctl.num_pages, in __btrfs_write_out_cache()
967 io_ctl_drop_pages(&io_ctl); in __btrfs_write_out_cache()
1018 io_ctl_free(&io_ctl); in __btrfs_write_out_cache()
1032 io_ctl_drop_pages(&io_ctl); in __btrfs_write_out_cache()