Lines Matching refs:brd
54 static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector) in brd_lookup_page() argument
72 page = radix_tree_lookup(&brd->brd_pages, idx); in brd_lookup_page()
85 static struct page *brd_insert_page(struct brd_device *brd, sector_t sector) in brd_insert_page() argument
91 page = brd_lookup_page(brd, sector); in brd_insert_page()
109 spin_lock(&brd->brd_lock); in brd_insert_page()
112 if (radix_tree_insert(&brd->brd_pages, idx, page)) { in brd_insert_page()
114 page = radix_tree_lookup(&brd->brd_pages, idx); in brd_insert_page()
118 brd->brd_nr_pages++; in brd_insert_page()
120 spin_unlock(&brd->brd_lock); in brd_insert_page()
132 static void brd_free_pages(struct brd_device *brd) in brd_free_pages() argument
141 nr_pages = radix_tree_gang_lookup(&brd->brd_pages, in brd_free_pages()
149 ret = radix_tree_delete(&brd->brd_pages, pos); in brd_free_pages()
173 static int copy_to_brd_setup(struct brd_device *brd, sector_t sector, size_t n) in copy_to_brd_setup() argument
179 if (!brd_insert_page(brd, sector)) in copy_to_brd_setup()
183 if (!brd_insert_page(brd, sector)) in copy_to_brd_setup()
192 static void copy_to_brd(struct brd_device *brd, const void *src, in copy_to_brd() argument
201 page = brd_lookup_page(brd, sector); in copy_to_brd()
212 page = brd_lookup_page(brd, sector); in copy_to_brd()
224 static void copy_from_brd(void *dst, struct brd_device *brd, in copy_from_brd() argument
233 page = brd_lookup_page(brd, sector); in copy_from_brd()
245 page = brd_lookup_page(brd, sector); in copy_from_brd()
258 static int brd_do_bvec(struct brd_device *brd, struct page *page, in brd_do_bvec() argument
266 err = copy_to_brd_setup(brd, sector, len); in brd_do_bvec()
273 copy_from_brd(mem + off, brd, sector, len); in brd_do_bvec()
277 copy_to_brd(brd, mem + off, sector, len); in brd_do_bvec()
287 struct brd_device *brd = bio->bi_bdev->bd_disk->private_data; in brd_submit_bio() local
300 err = brd_do_bvec(brd, bvec.bv_page, len, bvec.bv_offset, in brd_submit_bio()
317 struct brd_device *brd = bdev->bd_disk->private_data; in brd_rw_page() local
322 err = brd_do_bvec(brd, page, PAGE_SIZE, 0, op, sector); in brd_rw_page()
372 struct brd_device *brd; in brd_alloc() local
377 list_for_each_entry(brd, &brd_devices, brd_list) { in brd_alloc()
378 if (brd->brd_number == i) { in brd_alloc()
383 brd = kzalloc(sizeof(*brd), GFP_KERNEL); in brd_alloc()
384 if (!brd) { in brd_alloc()
388 brd->brd_number = i; in brd_alloc()
389 list_add_tail(&brd->brd_list, &brd_devices); in brd_alloc()
392 spin_lock_init(&brd->brd_lock); in brd_alloc()
393 INIT_RADIX_TREE(&brd->brd_pages, GFP_ATOMIC); in brd_alloc()
398 &brd->brd_nr_pages); in brd_alloc()
400 disk = brd->brd_disk = blk_alloc_disk(NUMA_NO_NODE); in brd_alloc()
408 disk->private_data = brd; in brd_alloc()
431 list_del(&brd->brd_list); in brd_alloc()
433 kfree(brd); in brd_alloc()
442 static void brd_del_one(struct brd_device *brd) in brd_del_one() argument
444 del_gendisk(brd->brd_disk); in brd_del_one()
445 blk_cleanup_disk(brd->brd_disk); in brd_del_one()
446 brd_free_pages(brd); in brd_del_one()
448 list_del(&brd->brd_list); in brd_del_one()
450 kfree(brd); in brd_del_one()
474 struct brd_device *brd, *next; in brd_init() local
512 list_for_each_entry_safe(brd, next, &brd_devices, brd_list) in brd_init()
513 brd_del_one(brd); in brd_init()
521 struct brd_device *brd, *next; in brd_exit() local
526 list_for_each_entry_safe(brd, next, &brd_devices, brd_list) in brd_exit()
527 brd_del_one(brd); in brd_exit()