1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright 2023 Red Hat 4 */ 5 6 #ifndef VDO_LOGICAL_ZONE_H 7 #define VDO_LOGICAL_ZONE_H 8 9 #include <linux/list.h> 10 11 #include "admin-state.h" 12 #include "int-map.h" 13 #include "types.h" 14 15 struct physical_zone; 16 17 struct logical_zone { 18 /* The completion for flush notifications */ 19 struct vdo_completion completion; 20 /* The owner of this zone */ 21 struct logical_zones *zones; 22 /* Which logical zone this is */ 23 zone_count_t zone_number; 24 /* The thread id for this zone */ 25 thread_id_t thread_id; 26 /* In progress operations keyed by LBN */ 27 struct int_map *lbn_operations; 28 /* The logical to physical map */ 29 struct block_map_zone *block_map_zone; 30 /* The current flush generation */ 31 sequence_number_t flush_generation; 32 /* 33 * The oldest active generation in this zone. This is mutated only on the logical zone 34 * thread but is queried from the flusher thread. 35 */ 36 sequence_number_t oldest_active_generation; 37 /* The number of IOs in the current flush generation */ 38 block_count_t ios_in_flush_generation; 39 /* The youngest generation of the current notification */ 40 sequence_number_t notification_generation; 41 /* Whether a notification is in progress */ 42 bool notifying; 43 /* The queue of active data write VIOs */ 44 struct list_head write_vios; 45 /* The administrative state of the zone */ 46 struct admin_state state; 47 /* The physical zone from which to allocate */ 48 struct physical_zone *allocation_zone; 49 /* The number of allocations done from the current allocation_zone */ 50 block_count_t allocation_count; 51 /* The next zone */ 52 struct logical_zone *next; 53 }; 54 55 struct logical_zones { 56 /* The vdo whose zones these are */ 57 struct vdo *vdo; 58 /* The manager for administrative actions */ 59 struct action_manager *manager; 60 /* The number of zones */ 61 zone_count_t zone_count; 62 /* The logical zones themselves */ 63 struct logical_zone zones[]; 64 }; 65 66 int __must_check vdo_make_logical_zones(struct vdo *vdo, 67 struct logical_zones **zones_ptr); 68 69 void vdo_free_logical_zones(struct logical_zones *zones); 70 71 void vdo_drain_logical_zones(struct logical_zones *zones, 72 const struct admin_state_code *operation, 73 struct vdo_completion *completion); 74 75 void vdo_resume_logical_zones(struct logical_zones *zones, 76 struct vdo_completion *parent); 77 78 void vdo_increment_logical_zone_flush_generation(struct logical_zone *zone, 79 sequence_number_t expected_generation); 80 81 void vdo_acquire_flush_generation_lock(struct data_vio *data_vio); 82 83 void vdo_release_flush_generation_lock(struct data_vio *data_vio); 84 85 struct physical_zone * __must_check vdo_get_next_allocation_zone(struct logical_zone *zone); 86 87 void vdo_dump_logical_zone(const struct logical_zone *zone); 88 89 #endif /* VDO_LOGICAL_ZONE_H */ 90