162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Internal header file _only_ for device mapper core 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2016 Red Hat, Inc. All rights reserved. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This file is released under the LGPL. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef DM_CORE_INTERNAL_H 1162306a36Sopenharmony_ci#define DM_CORE_INTERNAL_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/kthread.h> 1462306a36Sopenharmony_ci#include <linux/ktime.h> 1562306a36Sopenharmony_ci#include <linux/blk-mq.h> 1662306a36Sopenharmony_ci#include <linux/blk-crypto-profile.h> 1762306a36Sopenharmony_ci#include <linux/jump_label.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <trace/events/block.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include "dm.h" 2262306a36Sopenharmony_ci#include "dm-ima.h" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define DM_RESERVED_MAX_IOS 1024 2562306a36Sopenharmony_ci#define DM_MAX_TARGETS 1048576 2662306a36Sopenharmony_ci#define DM_MAX_TARGET_PARAMS 1024 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct dm_io; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct dm_kobject_holder { 3162306a36Sopenharmony_ci struct kobject kobj; 3262306a36Sopenharmony_ci struct completion completion; 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * DM core internal structures used directly by dm.c, dm-rq.c and dm-table.c. 3762306a36Sopenharmony_ci * DM targets must _not_ deference a mapped_device or dm_table to directly 3862306a36Sopenharmony_ci * access their members! 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* 4262306a36Sopenharmony_ci * For mempools pre-allocation at the table loading time. 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_cistruct dm_md_mempools { 4562306a36Sopenharmony_ci struct bio_set bs; 4662306a36Sopenharmony_ci struct bio_set io_bs; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct mapped_device { 5062306a36Sopenharmony_ci struct mutex suspend_lock; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci struct mutex table_devices_lock; 5362306a36Sopenharmony_ci struct list_head table_devices; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* 5662306a36Sopenharmony_ci * The current mapping (struct dm_table *). 5762306a36Sopenharmony_ci * Use dm_get_live_table{_fast} or take suspend_lock for 5862306a36Sopenharmony_ci * dereference. 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci void __rcu *map; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci unsigned long flags; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci /* Protect queue and type against concurrent access. */ 6562306a36Sopenharmony_ci struct mutex type_lock; 6662306a36Sopenharmony_ci enum dm_queue_mode type; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci int numa_node_id; 6962306a36Sopenharmony_ci struct request_queue *queue; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci atomic_t holders; 7262306a36Sopenharmony_ci atomic_t open_count; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci struct dm_target *immutable_target; 7562306a36Sopenharmony_ci struct target_type *immutable_target_type; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci char name[16]; 7862306a36Sopenharmony_ci struct gendisk *disk; 7962306a36Sopenharmony_ci struct dax_device *dax_dev; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci wait_queue_head_t wait; 8262306a36Sopenharmony_ci unsigned long __percpu *pending_io; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* forced geometry settings */ 8562306a36Sopenharmony_ci struct hd_geometry geometry; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci /* 8862306a36Sopenharmony_ci * Processing queue (flush) 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_ci struct workqueue_struct *wq; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* 9362306a36Sopenharmony_ci * A list of ios that arrived while we were suspended. 9462306a36Sopenharmony_ci */ 9562306a36Sopenharmony_ci struct work_struct work; 9662306a36Sopenharmony_ci spinlock_t deferred_lock; 9762306a36Sopenharmony_ci struct bio_list deferred; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci /* 10062306a36Sopenharmony_ci * requeue work context is needed for cloning one new bio 10162306a36Sopenharmony_ci * to represent the dm_io to be requeued, since each 10262306a36Sopenharmony_ci * dm_io may point to the original bio from FS. 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_ci struct work_struct requeue_work; 10562306a36Sopenharmony_ci struct dm_io *requeue_list; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci void *interface_ptr; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci /* 11062306a36Sopenharmony_ci * Event handling. 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_ci wait_queue_head_t eventq; 11362306a36Sopenharmony_ci atomic_t event_nr; 11462306a36Sopenharmony_ci atomic_t uevent_seq; 11562306a36Sopenharmony_ci struct list_head uevent_list; 11662306a36Sopenharmony_ci spinlock_t uevent_lock; /* Protect access to uevent_list */ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* for blk-mq request-based DM support */ 11962306a36Sopenharmony_ci bool init_tio_pdu:1; 12062306a36Sopenharmony_ci struct blk_mq_tag_set *tag_set; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci struct dm_stats stats; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci /* the number of internal suspends */ 12562306a36Sopenharmony_ci unsigned int internal_suspend_count; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci int swap_bios; 12862306a36Sopenharmony_ci struct semaphore swap_bios_semaphore; 12962306a36Sopenharmony_ci struct mutex swap_bios_lock; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci /* 13262306a36Sopenharmony_ci * io objects are allocated from here. 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_ci struct dm_md_mempools *mempools; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci /* kobject and completion */ 13762306a36Sopenharmony_ci struct dm_kobject_holder kobj_holder; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci struct srcu_struct io_barrier; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#ifdef CONFIG_BLK_DEV_ZONED 14262306a36Sopenharmony_ci unsigned int nr_zones; 14362306a36Sopenharmony_ci unsigned int *zwp_offset; 14462306a36Sopenharmony_ci#endif 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#ifdef CONFIG_IMA 14762306a36Sopenharmony_ci struct dm_ima_measurements ima; 14862306a36Sopenharmony_ci#endif 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci/* 15262306a36Sopenharmony_ci * Bits for the flags field of struct mapped_device. 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_ci#define DMF_BLOCK_IO_FOR_SUSPEND 0 15562306a36Sopenharmony_ci#define DMF_SUSPENDED 1 15662306a36Sopenharmony_ci#define DMF_FROZEN 2 15762306a36Sopenharmony_ci#define DMF_FREEING 3 15862306a36Sopenharmony_ci#define DMF_DELETING 4 15962306a36Sopenharmony_ci#define DMF_NOFLUSH_SUSPENDING 5 16062306a36Sopenharmony_ci#define DMF_DEFERRED_REMOVE 6 16162306a36Sopenharmony_ci#define DMF_SUSPENDED_INTERNALLY 7 16262306a36Sopenharmony_ci#define DMF_POST_SUSPENDING 8 16362306a36Sopenharmony_ci#define DMF_EMULATE_ZONE_APPEND 9 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_civoid disable_discard(struct mapped_device *md); 16662306a36Sopenharmony_civoid disable_write_zeroes(struct mapped_device *md); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistatic inline sector_t dm_get_size(struct mapped_device *md) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci return get_capacity(md->disk); 17162306a36Sopenharmony_ci} 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistatic inline struct dm_stats *dm_get_stats(struct mapped_device *md) 17462306a36Sopenharmony_ci{ 17562306a36Sopenharmony_ci return &md->stats; 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ciDECLARE_STATIC_KEY_FALSE(stats_enabled); 17962306a36Sopenharmony_ciDECLARE_STATIC_KEY_FALSE(swap_bios_enabled); 18062306a36Sopenharmony_ciDECLARE_STATIC_KEY_FALSE(zoned_enabled); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_cistatic inline bool dm_emulate_zone_append(struct mapped_device *md) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci if (blk_queue_is_zoned(md->queue)) 18562306a36Sopenharmony_ci return test_bit(DMF_EMULATE_ZONE_APPEND, &md->flags); 18662306a36Sopenharmony_ci return false; 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci#define DM_TABLE_MAX_DEPTH 16 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistruct dm_table { 19262306a36Sopenharmony_ci struct mapped_device *md; 19362306a36Sopenharmony_ci enum dm_queue_mode type; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci /* btree table */ 19662306a36Sopenharmony_ci unsigned int depth; 19762306a36Sopenharmony_ci unsigned int counts[DM_TABLE_MAX_DEPTH]; /* in nodes */ 19862306a36Sopenharmony_ci sector_t *index[DM_TABLE_MAX_DEPTH]; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci unsigned int num_targets; 20162306a36Sopenharmony_ci unsigned int num_allocated; 20262306a36Sopenharmony_ci sector_t *highs; 20362306a36Sopenharmony_ci struct dm_target *targets; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci struct target_type *immutable_target_type; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci bool integrity_supported:1; 20862306a36Sopenharmony_ci bool singleton:1; 20962306a36Sopenharmony_ci unsigned integrity_added:1; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci /* 21262306a36Sopenharmony_ci * Indicates the rw permissions for the new logical device. This 21362306a36Sopenharmony_ci * should be a combination of BLK_OPEN_READ and BLK_OPEN_WRITE. 21462306a36Sopenharmony_ci */ 21562306a36Sopenharmony_ci blk_mode_t mode; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci /* a list of devices used by this table */ 21862306a36Sopenharmony_ci struct list_head devices; 21962306a36Sopenharmony_ci struct rw_semaphore devices_lock; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci /* events get handed up using this callback */ 22262306a36Sopenharmony_ci void (*event_fn)(void *data); 22362306a36Sopenharmony_ci void *event_context; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci struct dm_md_mempools *mempools; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#ifdef CONFIG_BLK_INLINE_ENCRYPTION 22862306a36Sopenharmony_ci struct blk_crypto_profile *crypto_profile; 22962306a36Sopenharmony_ci#endif 23062306a36Sopenharmony_ci}; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic inline struct dm_target *dm_table_get_target(struct dm_table *t, 23362306a36Sopenharmony_ci unsigned int index) 23462306a36Sopenharmony_ci{ 23562306a36Sopenharmony_ci BUG_ON(index >= t->num_targets); 23662306a36Sopenharmony_ci return t->targets + index; 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci/* 24062306a36Sopenharmony_ci * One of these is allocated per clone bio. 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_ci#define DM_TIO_MAGIC 28714 24362306a36Sopenharmony_cistruct dm_target_io { 24462306a36Sopenharmony_ci unsigned short magic; 24562306a36Sopenharmony_ci blk_short_t flags; 24662306a36Sopenharmony_ci unsigned int target_bio_nr; 24762306a36Sopenharmony_ci struct dm_io *io; 24862306a36Sopenharmony_ci struct dm_target *ti; 24962306a36Sopenharmony_ci unsigned int *len_ptr; 25062306a36Sopenharmony_ci sector_t old_sector; 25162306a36Sopenharmony_ci struct bio clone; 25262306a36Sopenharmony_ci}; 25362306a36Sopenharmony_ci#define DM_TARGET_IO_BIO_OFFSET (offsetof(struct dm_target_io, clone)) 25462306a36Sopenharmony_ci#define DM_IO_BIO_OFFSET \ 25562306a36Sopenharmony_ci (offsetof(struct dm_target_io, clone) + offsetof(struct dm_io, tio)) 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/* 25862306a36Sopenharmony_ci * dm_target_io flags 25962306a36Sopenharmony_ci */ 26062306a36Sopenharmony_cienum { 26162306a36Sopenharmony_ci DM_TIO_INSIDE_DM_IO, 26262306a36Sopenharmony_ci DM_TIO_IS_DUPLICATE_BIO 26362306a36Sopenharmony_ci}; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic inline bool dm_tio_flagged(struct dm_target_io *tio, unsigned int bit) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci return (tio->flags & (1U << bit)) != 0; 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cistatic inline void dm_tio_set_flag(struct dm_target_io *tio, unsigned int bit) 27162306a36Sopenharmony_ci{ 27262306a36Sopenharmony_ci tio->flags |= (1U << bit); 27362306a36Sopenharmony_ci} 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cistatic inline bool dm_tio_is_normal(struct dm_target_io *tio) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci return (dm_tio_flagged(tio, DM_TIO_INSIDE_DM_IO) && 27862306a36Sopenharmony_ci !dm_tio_flagged(tio, DM_TIO_IS_DUPLICATE_BIO)); 27962306a36Sopenharmony_ci} 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/* 28262306a36Sopenharmony_ci * One of these is allocated per original bio. 28362306a36Sopenharmony_ci * It contains the first clone used for that original. 28462306a36Sopenharmony_ci */ 28562306a36Sopenharmony_ci#define DM_IO_MAGIC 19577 28662306a36Sopenharmony_cistruct dm_io { 28762306a36Sopenharmony_ci unsigned short magic; 28862306a36Sopenharmony_ci blk_short_t flags; 28962306a36Sopenharmony_ci spinlock_t lock; 29062306a36Sopenharmony_ci unsigned long start_time; 29162306a36Sopenharmony_ci void *data; 29262306a36Sopenharmony_ci struct dm_io *next; 29362306a36Sopenharmony_ci struct dm_stats_aux stats_aux; 29462306a36Sopenharmony_ci blk_status_t status; 29562306a36Sopenharmony_ci atomic_t io_count; 29662306a36Sopenharmony_ci struct mapped_device *md; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci /* The three fields represent mapped part of original bio */ 29962306a36Sopenharmony_ci struct bio *orig_bio; 30062306a36Sopenharmony_ci unsigned int sector_offset; /* offset to end of orig_bio */ 30162306a36Sopenharmony_ci unsigned int sectors; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci /* last member of dm_target_io is 'struct bio' */ 30462306a36Sopenharmony_ci struct dm_target_io tio; 30562306a36Sopenharmony_ci}; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci/* 30862306a36Sopenharmony_ci * dm_io flags 30962306a36Sopenharmony_ci */ 31062306a36Sopenharmony_cienum { 31162306a36Sopenharmony_ci DM_IO_ACCOUNTED, 31262306a36Sopenharmony_ci DM_IO_WAS_SPLIT, 31362306a36Sopenharmony_ci DM_IO_BLK_STAT 31462306a36Sopenharmony_ci}; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_cistatic inline bool dm_io_flagged(struct dm_io *io, unsigned int bit) 31762306a36Sopenharmony_ci{ 31862306a36Sopenharmony_ci return (io->flags & (1U << bit)) != 0; 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic inline void dm_io_set_flag(struct dm_io *io, unsigned int bit) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci io->flags |= (1U << bit); 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_civoid dm_io_rewind(struct dm_io *io, struct bio_set *bs); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic inline struct completion *dm_get_completion_from_kobject(struct kobject *kobj) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci return &container_of(kobj, struct dm_kobject_holder, kobj)->completion; 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ciunsigned int __dm_get_module_param(unsigned int *module_param, unsigned int def, unsigned int max); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cistatic inline bool dm_message_test_buffer_overflow(char *result, unsigned int maxlen) 33662306a36Sopenharmony_ci{ 33762306a36Sopenharmony_ci return !maxlen || strlen(result) + 1 >= maxlen; 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ciextern atomic_t dm_global_event_nr; 34162306a36Sopenharmony_ciextern wait_queue_head_t dm_global_eventq; 34262306a36Sopenharmony_civoid dm_issue_global_event(void); 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci#endif 345