Lines Matching full:zone
234 struct reada_zone *zone; in reada_find_zone() local
240 zone = NULL; in reada_find_zone()
242 ret = radix_tree_gang_lookup(&dev->reada_zones, (void **)&zone, in reada_find_zone()
244 if (ret == 1 && logical >= zone->start && logical <= zone->end) { in reada_find_zone()
245 kref_get(&zone->refcnt); in reada_find_zone()
247 return zone; in reada_find_zone()
260 zone = kzalloc(sizeof(*zone), GFP_KERNEL); in reada_find_zone()
261 if (!zone) in reada_find_zone()
266 kfree(zone); in reada_find_zone()
270 zone->start = start; in reada_find_zone()
271 zone->end = end; in reada_find_zone()
272 INIT_LIST_HEAD(&zone->list); in reada_find_zone()
273 spin_lock_init(&zone->lock); in reada_find_zone()
274 zone->locked = 0; in reada_find_zone()
275 kref_init(&zone->refcnt); in reada_find_zone()
276 zone->elems = 0; in reada_find_zone()
277 zone->device = dev; /* our device always sits at index 0 */ in reada_find_zone()
280 zone->devs[i] = bbio->stripes[i].dev; in reada_find_zone()
282 zone->ndevs = bbio->num_stripes; in reada_find_zone()
286 (unsigned long)(zone->end >> fs_info->sectorsize_bits), in reada_find_zone()
287 zone); in reada_find_zone()
290 kfree(zone); in reada_find_zone()
291 ret = radix_tree_gang_lookup(&dev->reada_zones, (void **)&zone, in reada_find_zone()
293 if (ret == 1 && logical >= zone->start && logical <= zone->end) in reada_find_zone()
294 kref_get(&zone->refcnt); in reada_find_zone()
296 zone = NULL; in reada_find_zone()
301 return zone; in reada_find_zone()
361 struct reada_zone *zone; in reada_find_extent() local
369 zone = reada_find_zone(dev, logical, bbio); in reada_find_extent()
370 if (!zone) in reada_find_extent()
373 re->zones[re->nzones++] = zone; in reada_find_extent()
374 spin_lock(&zone->lock); in reada_find_extent()
375 if (!zone->elems) in reada_find_extent()
376 kref_get(&zone->refcnt); in reada_find_extent()
377 ++zone->elems; in reada_find_extent()
378 spin_unlock(&zone->lock); in reada_find_extent()
380 kref_put(&zone->refcnt, reada_zone_release); in reada_find_extent()
384 /* not a single zone found, error and out */ in reada_find_extent()
421 * in case of DUP, just add the first zone. As both in reada_find_extent()
472 struct reada_zone *zone; in reada_find_extent() local
474 zone = re->zones[nzones]; in reada_find_extent()
475 kref_get(&zone->refcnt); in reada_find_extent()
476 spin_lock(&zone->lock); in reada_find_extent()
477 --zone->elems; in reada_find_extent()
478 if (zone->elems == 0) { in reada_find_extent()
483 kref_put(&zone->refcnt, reada_zone_release); in reada_find_extent()
485 spin_unlock(&zone->lock); in reada_find_extent()
488 kref_put(&zone->refcnt, reada_zone_release); in reada_find_extent()
510 struct reada_zone *zone = re->zones[i]; in reada_extent_put() local
512 radix_tree_delete(&zone->device->reada_extents, index); in reada_extent_put()
518 struct reada_zone *zone = re->zones[i]; in reada_extent_put() local
520 kref_get(&zone->refcnt); in reada_extent_put()
521 spin_lock(&zone->lock); in reada_extent_put()
522 --zone->elems; in reada_extent_put()
523 if (zone->elems == 0) { in reada_extent_put()
526 kref_put(&zone->refcnt, reada_zone_release); in reada_extent_put()
528 spin_unlock(&zone->lock); in reada_extent_put()
531 kref_put(&zone->refcnt, reada_zone_release); in reada_extent_put()
540 struct reada_zone *zone = container_of(kref, struct reada_zone, refcnt); in reada_zone_release() local
541 struct btrfs_fs_info *fs_info = zone->device->fs_info; in reada_zone_release()
545 radix_tree_delete(&zone->device->reada_zones, in reada_zone_release()
546 zone->end >> fs_info->sectorsize_bits); in reada_zone_release()
548 kfree(zone); in reada_zone_release()
594 static void reada_peer_zones_set_lock(struct reada_zone *zone, int lock) in reada_peer_zones_set_lock() argument
597 unsigned long index = zone->end >> zone->device->fs_info->sectorsize_bits; in reada_peer_zones_set_lock()
599 for (i = 0; i < zone->ndevs; ++i) { in reada_peer_zones_set_lock()
601 peer = radix_tree_lookup(&zone->devs[i]->reada_zones, index); in reada_peer_zones_set_lock()
602 if (peer && peer->device != zone->device) in reada_peer_zones_set_lock()
624 /* pick the zone with the most elements */ in reada_pick_zone()
626 struct reada_zone *zone; in reada_pick_zone() local
629 (void **)&zone, index, 1); in reada_pick_zone()
632 index = (zone->end >> dev->fs_info->sectorsize_bits) + 1; in reada_pick_zone()
633 if (zone->locked) { in reada_pick_zone()
634 if (zone->elems > top_locked_elems) { in reada_pick_zone()
635 top_locked_elems = zone->elems; in reada_pick_zone()
636 top_locked_zone = zone; in reada_pick_zone()
639 if (zone->elems > top_elems) { in reada_pick_zone()
640 top_elems = zone->elems; in reada_pick_zone()
641 top_zone = zone; in reada_pick_zone()
873 struct reada_zone *zone; in dump_devs() local
875 (void **)&zone, index, 1); in dump_devs()
878 pr_debug(" zone %llu-%llu elems %llu locked %d devs", in dump_devs()
879 zone->start, zone->end, zone->elems, in dump_devs()
880 zone->locked); in dump_devs()
881 for (j = 0; j < zone->ndevs; ++j) { in dump_devs()
883 zone->devs[j]->devid); in dump_devs()
885 if (device->reada_curr_zone == zone) in dump_devs()
887 device->reada_next - zone->start); in dump_devs()
889 index = (zone->end >> fs_info->sectorsize_bits) + 1; in dump_devs()
905 pr_cont(" zone %llu-%llu devs", in dump_devs()
937 pr_cont(" zone %llu-%llu devs", in dump_devs()