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 struct page *brd_insert_page(struct brd_device *brd, sector_t sector, in brd_insert_page() argument
72 xa_lock(&brd->brd_pages); in brd_insert_page()
73 ret = __xa_cmpxchg(&brd->brd_pages, sector >> PAGE_SECTORS_SHIFT, NULL, in brd_insert_page()
77 xa_unlock(&brd->brd_pages); in brd_insert_page()
83 brd->brd_nr_pages++; in brd_insert_page()
84 xa_unlock(&brd->brd_pages); in brd_insert_page()
92 static void brd_free_pages(struct brd_device *brd) in brd_free_pages() argument
97 xa_for_each(&brd->brd_pages, idx, page) { in brd_free_pages()
102 xa_destroy(&brd->brd_pages); in brd_free_pages()
109 static bool brd_rw_bvec(struct brd_device *brd, struct bio *bio) in brd_rw_bvec() argument
121 page = brd_lookup_page(brd, sector); in brd_rw_bvec()
123 page = brd_insert_page(brd, sector, opf); in brd_rw_bvec()
159 static void brd_do_discard(struct brd_device *brd, sector_t sector, u32 size) in brd_do_discard() argument
169 xa_lock(&brd->brd_pages); in brd_do_discard()
171 page = __xa_erase(&brd->brd_pages, aligned_sector >> PAGE_SECTORS_SHIFT); in brd_do_discard()
174 brd->brd_nr_pages--; in brd_do_discard()
178 xa_unlock(&brd->brd_pages); in brd_do_discard()
183 struct brd_device *brd = bio->bi_bdev->bd_disk->private_data; in brd_submit_bio() local
186 brd_do_discard(brd, bio->bi_iter.bi_sector, in brd_submit_bio()
193 if (!brd_rw_bvec(brd, bio)) in brd_submit_bio()
245 struct brd_device *brd; in brd_find_or_alloc_device() local
248 list_for_each_entry(brd, &brd_devices, brd_list) { in brd_find_or_alloc_device()
249 if (brd->brd_number == i) { in brd_find_or_alloc_device()
255 brd = kzalloc(sizeof(*brd), GFP_KERNEL); in brd_find_or_alloc_device()
256 if (!brd) { in brd_find_or_alloc_device()
260 brd->brd_number = i; in brd_find_or_alloc_device()
261 list_add_tail(&brd->brd_list, &brd_devices); in brd_find_or_alloc_device()
263 return brd; in brd_find_or_alloc_device()
266 static void brd_free_device(struct brd_device *brd) in brd_free_device() argument
269 list_del(&brd->brd_list); in brd_free_device()
271 kfree(brd); in brd_free_device()
276 struct brd_device *brd; in brd_alloc() local
296 brd = brd_find_or_alloc_device(i); in brd_alloc()
297 if (IS_ERR(brd)) in brd_alloc()
298 return PTR_ERR(brd); in brd_alloc()
300 xa_init(&brd->brd_pages); in brd_alloc()
305 &brd->brd_nr_pages); in brd_alloc()
307 disk = brd->brd_disk = blk_alloc_disk(&lim, NUMA_NO_NODE); in brd_alloc()
316 disk->private_data = brd; in brd_alloc()
329 brd_free_device(brd); in brd_alloc()
340 struct brd_device *brd, *next; in brd_cleanup() local
344 list_for_each_entry_safe(brd, next, &brd_devices, brd_list) { in brd_cleanup()
345 del_gendisk(brd->brd_disk); in brd_cleanup()
346 put_disk(brd->brd_disk); in brd_cleanup()
347 brd_free_pages(brd); in brd_cleanup()
348 brd_free_device(brd); in brd_cleanup()