^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2017 Western Digital Corporation or its affiliates.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * This file is released under the GPL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef DM_ZONED_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define DM_ZONED_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/device-mapper.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/dm-kcopyd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/rwsem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/rbtree.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/radix-tree.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/shrinker.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * dm-zoned creates block devices with 4KB blocks, always.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define DMZ_BLOCK_SHIFT 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define DMZ_BLOCK_SIZE (1 << DMZ_BLOCK_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define DMZ_BLOCK_MASK (DMZ_BLOCK_SIZE - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define DMZ_BLOCK_SHIFT_BITS (DMZ_BLOCK_SHIFT + 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define DMZ_BLOCK_SIZE_BITS (1 << DMZ_BLOCK_SHIFT_BITS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define DMZ_BLOCK_MASK_BITS (DMZ_BLOCK_SIZE_BITS - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define DMZ_BLOCK_SECTORS_SHIFT (DMZ_BLOCK_SHIFT - SECTOR_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define DMZ_BLOCK_SECTORS (DMZ_BLOCK_SIZE >> SECTOR_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define DMZ_BLOCK_SECTORS_MASK (DMZ_BLOCK_SECTORS - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * 4KB block <-> 512B sector conversion.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define dmz_blk2sect(b) ((sector_t)(b) << DMZ_BLOCK_SECTORS_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define dmz_sect2blk(s) ((sector_t)(s) >> DMZ_BLOCK_SECTORS_SHIFT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define dmz_bio_block(bio) dmz_sect2blk((bio)->bi_iter.bi_sector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define dmz_bio_blocks(bio) dmz_sect2blk(bio_sectors(bio))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct dmz_metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct dmz_reclaim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * Zoned block device information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct dmz_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct block_device *bdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct dmz_metadata *metadata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct dmz_reclaim *reclaim;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) char name[BDEVNAME_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) uuid_t uuid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) sector_t capacity;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned int dev_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) unsigned int nr_zones;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) unsigned int zone_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) unsigned int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) sector_t zone_nr_sectors;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) unsigned int nr_rnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) atomic_t unmap_nr_rnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) struct list_head unmap_rnd_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct list_head map_rnd_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) unsigned int nr_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) atomic_t unmap_nr_seq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct list_head unmap_seq_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct list_head map_seq_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define dmz_bio_chunk(zmd, bio) ((bio)->bi_iter.bi_sector >> \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) dmz_zone_nr_sectors_shift(zmd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define dmz_chunk_block(zmd, b) ((b) & (dmz_zone_nr_blocks(zmd) - 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* Device flags. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define DMZ_BDEV_DYING (1 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define DMZ_CHECK_BDEV (2 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #define DMZ_BDEV_REGULAR (4 << 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * Zone descriptor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct dm_zone {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* For listing the zone depending on its state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct list_head link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* Device containing this zone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct dmz_dev *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* Zone type and state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* Zone activation reference count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) atomic_t refcount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* Zone id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) unsigned int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* Zone write pointer block (relative to the zone start block) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) unsigned int wp_block;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* Zone weight (number of valid blocks in the zone) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) unsigned int weight;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) /* The chunk that the zone maps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) unsigned int chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * For a sequential data zone, pointer to the random zone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * used as a buffer for processing unaligned writes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * For a buffer zone, this points back to the data zone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct dm_zone *bzone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * Zone flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* Zone write type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) DMZ_CACHE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) DMZ_RND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) DMZ_SEQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* Zone critical condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) DMZ_OFFLINE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) DMZ_READ_ONLY,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* How the zone is being used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) DMZ_META,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) DMZ_DATA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) DMZ_BUF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) DMZ_RESERVED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* Zone internal state */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) DMZ_RECLAIM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) DMZ_SEQ_WRITE_ERR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) DMZ_RECLAIM_TERMINATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * Zone data accessors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define dmz_is_cache(z) test_bit(DMZ_CACHE, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define dmz_is_rnd(z) test_bit(DMZ_RND, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define dmz_is_seq(z) test_bit(DMZ_SEQ, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define dmz_is_empty(z) ((z)->wp_block == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define dmz_is_offline(z) test_bit(DMZ_OFFLINE, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define dmz_is_readonly(z) test_bit(DMZ_READ_ONLY, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define dmz_in_reclaim(z) test_bit(DMZ_RECLAIM, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define dmz_is_reserved(z) test_bit(DMZ_RESERVED, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define dmz_seq_write_err(z) test_bit(DMZ_SEQ_WRITE_ERR, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #define dmz_reclaim_should_terminate(z) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) test_bit(DMZ_RECLAIM_TERMINATE, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define dmz_is_meta(z) test_bit(DMZ_META, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define dmz_is_buf(z) test_bit(DMZ_BUF, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define dmz_is_data(z) test_bit(DMZ_DATA, &(z)->flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define dmz_weight(z) ((z)->weight)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) * Message functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define dmz_dev_info(dev, format, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) DMINFO("(%s): " format, (dev)->name, ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define dmz_dev_err(dev, format, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) DMERR("(%s): " format, (dev)->name, ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define dmz_dev_warn(dev, format, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) DMWARN("(%s): " format, (dev)->name, ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define dmz_dev_debug(dev, format, args...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) DMDEBUG("(%s): " format, (dev)->name, ## args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * Functions defined in dm-zoned-metadata.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int dmz_ctr_metadata(struct dmz_dev *dev, int num_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) struct dmz_metadata **zmd, const char *devname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) void dmz_dtr_metadata(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) int dmz_resume_metadata(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) void dmz_lock_map(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) void dmz_unlock_map(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) void dmz_lock_metadata(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) void dmz_unlock_metadata(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) void dmz_lock_flush(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) void dmz_unlock_flush(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) int dmz_flush_metadata(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) const char *dmz_metadata_label(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) sector_t dmz_start_sect(struct dmz_metadata *zmd, struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) unsigned int dmz_nr_chunks(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) bool dmz_check_dev(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) bool dmz_dev_is_dying(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) #define DMZ_ALLOC_RND 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) #define DMZ_ALLOC_CACHE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define DMZ_ALLOC_SEQ 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define DMZ_ALLOC_RECLAIM 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct dm_zone *dmz_alloc_zone(struct dmz_metadata *zmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) unsigned int dev_idx, unsigned long flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) void dmz_free_zone(struct dmz_metadata *zmd, struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) void dmz_map_zone(struct dmz_metadata *zmd, struct dm_zone *zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) unsigned int chunk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) unsigned int dmz_nr_zones(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) unsigned int dmz_nr_cache_zones(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) unsigned int dmz_nr_unmap_cache_zones(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) unsigned int dmz_zone_nr_blocks_shift(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) unsigned int dmz_zone_nr_sectors(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) unsigned int dmz_zone_nr_sectors_shift(struct dmz_metadata *zmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * Activate a zone (increment its reference count).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static inline void dmz_activate_zone(struct dm_zone *zone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) atomic_inc(&zone->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) int dmz_lock_zone_reclaim(struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) void dmz_unlock_zone_reclaim(struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) unsigned int dev_idx, bool idle);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) struct dm_zone *dmz_get_chunk_mapping(struct dmz_metadata *zmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) unsigned int chunk, int op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) void dmz_put_chunk_mapping(struct dmz_metadata *zmd, struct dm_zone *zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) struct dm_zone *dmz_get_chunk_buffer(struct dmz_metadata *zmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) struct dm_zone *dzone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) int dmz_validate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) sector_t chunk_block, unsigned int nr_blocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) int dmz_invalidate_blocks(struct dmz_metadata *zmd, struct dm_zone *zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) sector_t chunk_block, unsigned int nr_blocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) int dmz_block_valid(struct dmz_metadata *zmd, struct dm_zone *zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) sector_t chunk_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) int dmz_first_valid_block(struct dmz_metadata *zmd, struct dm_zone *zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) sector_t *chunk_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) int dmz_copy_valid_blocks(struct dmz_metadata *zmd, struct dm_zone *from_zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) struct dm_zone *to_zone);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int dmz_merge_valid_blocks(struct dmz_metadata *zmd, struct dm_zone *from_zone,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) struct dm_zone *to_zone, sector_t chunk_block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * Functions defined in dm-zoned-reclaim.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int dmz_ctr_reclaim(struct dmz_metadata *zmd, struct dmz_reclaim **zrc, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) void dmz_dtr_reclaim(struct dmz_reclaim *zrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) void dmz_suspend_reclaim(struct dmz_reclaim *zrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) void dmz_resume_reclaim(struct dmz_reclaim *zrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) void dmz_reclaim_bio_acc(struct dmz_reclaim *zrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) void dmz_schedule_reclaim(struct dmz_reclaim *zrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) * Functions defined in dm-zoned-target.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) bool dmz_bdev_is_dying(struct dmz_dev *dmz_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) bool dmz_check_bdev(struct dmz_dev *dmz_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) * Deactivate a zone. This decrement the zone reference counter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) * indicating that all BIOs to the zone have completed when the count is 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) static inline void dmz_deactivate_zone(struct dm_zone *zone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) dmz_reclaim_bio_acc(zone->dev->reclaim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) atomic_dec(&zone->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * Test if a zone is active, that is, has a refcount > 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) static inline bool dmz_is_active(struct dm_zone *zone)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) return atomic_read(&zone->refcount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #endif /* DM_ZONED_H */