Lines Matching refs:brd
49 static struct page *brd_lookup_page(struct brd_device *brd, sector_t sector) in brd_lookup_page() argument
51 return xa_load(&brd->brd_pages, sector >> PAGE_SECTORS_SHIFT); in brd_lookup_page()
57 static int brd_insert_page(struct brd_device *brd, sector_t sector, gfp_t gfp) in brd_insert_page() argument
63 page = brd_lookup_page(brd, sector); in brd_insert_page()
71 xa_lock(&brd->brd_pages); in brd_insert_page()
72 ret = __xa_insert(&brd->brd_pages, idx, page, gfp); in brd_insert_page()
74 brd->brd_nr_pages++; in brd_insert_page()
75 xa_unlock(&brd->brd_pages); in brd_insert_page()
89 static void brd_free_pages(struct brd_device *brd) in brd_free_pages() argument
94 xa_for_each(&brd->brd_pages, idx, page) { in brd_free_pages()
99 xa_destroy(&brd->brd_pages); in brd_free_pages()
105 static int copy_to_brd_setup(struct brd_device *brd, sector_t sector, size_t n, in copy_to_brd_setup() argument
113 ret = brd_insert_page(brd, sector, gfp); in copy_to_brd_setup()
118 ret = brd_insert_page(brd, sector, gfp); in copy_to_brd_setup()
126 static void copy_to_brd(struct brd_device *brd, const void *src, in copy_to_brd() argument
135 page = brd_lookup_page(brd, sector); in copy_to_brd()
146 page = brd_lookup_page(brd, sector); in copy_to_brd()
158 static void copy_from_brd(void *dst, struct brd_device *brd, in copy_from_brd() argument
167 page = brd_lookup_page(brd, sector); in copy_from_brd()
179 page = brd_lookup_page(brd, sector); in copy_from_brd()
192 static int brd_do_bvec(struct brd_device *brd, struct page *page, in brd_do_bvec() argument
206 err = copy_to_brd_setup(brd, sector, len, gfp); in brd_do_bvec()
213 copy_from_brd(mem + off, brd, sector, len); in brd_do_bvec()
217 copy_to_brd(brd, mem + off, sector, len); in brd_do_bvec()
225 static void brd_do_discard(struct brd_device *brd, sector_t sector, u32 size) in brd_do_discard() argument
231 xa_lock(&brd->brd_pages); in brd_do_discard()
233 page = __xa_erase(&brd->brd_pages, aligned_sector >> PAGE_SECTORS_SHIFT); in brd_do_discard()
236 brd->brd_nr_pages--; in brd_do_discard()
241 xa_unlock(&brd->brd_pages); in brd_do_discard()
246 struct brd_device *brd = bio->bi_bdev->bd_disk->private_data; in brd_submit_bio() local
252 brd_do_discard(brd, sector, bio->bi_iter.bi_size); in brd_submit_bio()
265 err = brd_do_bvec(brd, bvec.bv_page, len, bvec.bv_offset, in brd_submit_bio()
326 struct brd_device *brd; in brd_find_or_alloc_device() local
329 list_for_each_entry(brd, &brd_devices, brd_list) { in brd_find_or_alloc_device()
330 if (brd->brd_number == i) { in brd_find_or_alloc_device()
336 brd = kzalloc(sizeof(*brd), GFP_KERNEL); in brd_find_or_alloc_device()
337 if (!brd) { in brd_find_or_alloc_device()
341 brd->brd_number = i; in brd_find_or_alloc_device()
342 list_add_tail(&brd->brd_list, &brd_devices); in brd_find_or_alloc_device()
344 return brd; in brd_find_or_alloc_device()
347 static void brd_free_device(struct brd_device *brd) in brd_free_device() argument
350 list_del(&brd->brd_list); in brd_free_device()
352 kfree(brd); in brd_free_device()
357 struct brd_device *brd; in brd_alloc() local
377 brd = brd_find_or_alloc_device(i); in brd_alloc()
378 if (IS_ERR(brd)) in brd_alloc()
379 return PTR_ERR(brd); in brd_alloc()
381 xa_init(&brd->brd_pages); in brd_alloc()
386 &brd->brd_nr_pages); in brd_alloc()
388 disk = brd->brd_disk = blk_alloc_disk(&lim, NUMA_NO_NODE); in brd_alloc()
397 disk->private_data = brd; in brd_alloc()
410 brd_free_device(brd); in brd_alloc()
421 struct brd_device *brd, *next; in brd_cleanup() local
425 list_for_each_entry_safe(brd, next, &brd_devices, brd_list) { in brd_cleanup()
426 del_gendisk(brd->brd_disk); in brd_cleanup()
427 put_disk(brd->brd_disk); in brd_cleanup()
428 brd_free_pages(brd); in brd_cleanup()
429 brd_free_device(brd); in brd_cleanup()