cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

free-space-cache.h (5419B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2009 Oracle.  All rights reserved.
      4 */
      5
      6#ifndef BTRFS_FREE_SPACE_CACHE_H
      7#define BTRFS_FREE_SPACE_CACHE_H
      8
      9/*
     10 * This is the trim state of an extent or bitmap.
     11 *
     12 * BTRFS_TRIM_STATE_TRIMMING is special and used to maintain the state of a
     13 * bitmap as we may need several trims to fully trim a single bitmap entry.
     14 * This is reset should any free space other than trimmed space be added to the
     15 * bitmap.
     16 */
     17enum btrfs_trim_state {
     18	BTRFS_TRIM_STATE_UNTRIMMED,
     19	BTRFS_TRIM_STATE_TRIMMED,
     20	BTRFS_TRIM_STATE_TRIMMING,
     21};
     22
     23struct btrfs_free_space {
     24	struct rb_node offset_index;
     25	struct rb_node bytes_index;
     26	u64 offset;
     27	u64 bytes;
     28	u64 max_extent_size;
     29	unsigned long *bitmap;
     30	struct list_head list;
     31	enum btrfs_trim_state trim_state;
     32	s32 bitmap_extents;
     33};
     34
     35static inline bool btrfs_free_space_trimmed(struct btrfs_free_space *info)
     36{
     37	return (info->trim_state == BTRFS_TRIM_STATE_TRIMMED);
     38}
     39
     40static inline bool btrfs_free_space_trimming_bitmap(
     41					    struct btrfs_free_space *info)
     42{
     43	return (info->trim_state == BTRFS_TRIM_STATE_TRIMMING);
     44}
     45
     46struct btrfs_free_space_ctl {
     47	spinlock_t tree_lock;
     48	struct rb_root free_space_offset;
     49	struct rb_root_cached free_space_bytes;
     50	u64 free_space;
     51	int extents_thresh;
     52	int free_extents;
     53	int total_bitmaps;
     54	int unit;
     55	u64 start;
     56	s32 discardable_extents[BTRFS_STAT_NR_ENTRIES];
     57	s64 discardable_bytes[BTRFS_STAT_NR_ENTRIES];
     58	const struct btrfs_free_space_op *op;
     59	struct btrfs_block_group *block_group;
     60	struct mutex cache_writeout_mutex;
     61	struct list_head trimming_ranges;
     62};
     63
     64struct btrfs_free_space_op {
     65	bool (*use_bitmap)(struct btrfs_free_space_ctl *ctl,
     66			   struct btrfs_free_space *info);
     67};
     68
     69struct btrfs_io_ctl {
     70	void *cur, *orig;
     71	struct page *page;
     72	struct page **pages;
     73	struct btrfs_fs_info *fs_info;
     74	struct inode *inode;
     75	unsigned long size;
     76	int index;
     77	int num_pages;
     78	int entries;
     79	int bitmaps;
     80};
     81
     82struct inode *lookup_free_space_inode(struct btrfs_block_group *block_group,
     83		struct btrfs_path *path);
     84int create_free_space_inode(struct btrfs_trans_handle *trans,
     85			    struct btrfs_block_group *block_group,
     86			    struct btrfs_path *path);
     87int btrfs_remove_free_space_inode(struct btrfs_trans_handle *trans,
     88				  struct inode *inode,
     89				  struct btrfs_block_group *block_group);
     90
     91int btrfs_check_trunc_cache_free_space(struct btrfs_fs_info *fs_info,
     92				       struct btrfs_block_rsv *rsv);
     93int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans,
     94				    struct btrfs_block_group *block_group,
     95				    struct inode *inode);
     96int load_free_space_cache(struct btrfs_block_group *block_group);
     97int btrfs_wait_cache_io(struct btrfs_trans_handle *trans,
     98			struct btrfs_block_group *block_group,
     99			struct btrfs_path *path);
    100int btrfs_write_out_cache(struct btrfs_trans_handle *trans,
    101			  struct btrfs_block_group *block_group,
    102			  struct btrfs_path *path);
    103
    104void btrfs_init_free_space_ctl(struct btrfs_block_group *block_group,
    105			       struct btrfs_free_space_ctl *ctl);
    106int __btrfs_add_free_space(struct btrfs_block_group *block_group, u64 bytenr,
    107			   u64 size, enum btrfs_trim_state trim_state);
    108int btrfs_add_free_space(struct btrfs_block_group *block_group,
    109			 u64 bytenr, u64 size);
    110int btrfs_add_free_space_unused(struct btrfs_block_group *block_group,
    111				u64 bytenr, u64 size);
    112int btrfs_add_free_space_async_trimmed(struct btrfs_block_group *block_group,
    113				       u64 bytenr, u64 size);
    114int btrfs_remove_free_space(struct btrfs_block_group *block_group,
    115			    u64 bytenr, u64 size);
    116void __btrfs_remove_free_space_cache(struct btrfs_free_space_ctl *ctl);
    117void btrfs_remove_free_space_cache(struct btrfs_block_group *block_group);
    118bool btrfs_is_free_space_trimmed(struct btrfs_block_group *block_group);
    119u64 btrfs_find_space_for_alloc(struct btrfs_block_group *block_group,
    120			       u64 offset, u64 bytes, u64 empty_size,
    121			       u64 *max_extent_size);
    122void btrfs_dump_free_space(struct btrfs_block_group *block_group,
    123			   u64 bytes);
    124int btrfs_find_space_cluster(struct btrfs_block_group *block_group,
    125			     struct btrfs_free_cluster *cluster,
    126			     u64 offset, u64 bytes, u64 empty_size);
    127void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster);
    128u64 btrfs_alloc_from_cluster(struct btrfs_block_group *block_group,
    129			     struct btrfs_free_cluster *cluster, u64 bytes,
    130			     u64 min_start, u64 *max_extent_size);
    131void btrfs_return_cluster_to_free_space(
    132			       struct btrfs_block_group *block_group,
    133			       struct btrfs_free_cluster *cluster);
    134int btrfs_trim_block_group(struct btrfs_block_group *block_group,
    135			   u64 *trimmed, u64 start, u64 end, u64 minlen);
    136int btrfs_trim_block_group_extents(struct btrfs_block_group *block_group,
    137				   u64 *trimmed, u64 start, u64 end, u64 minlen,
    138				   bool async);
    139int btrfs_trim_block_group_bitmaps(struct btrfs_block_group *block_group,
    140				   u64 *trimmed, u64 start, u64 end, u64 minlen,
    141				   u64 maxlen, bool async);
    142
    143bool btrfs_free_space_cache_v1_active(struct btrfs_fs_info *fs_info);
    144int btrfs_set_free_space_cache_v1_active(struct btrfs_fs_info *fs_info, bool active);
    145/* Support functions for running our sanity tests */
    146#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
    147int test_add_free_space_entry(struct btrfs_block_group *cache,
    148			      u64 offset, u64 bytes, bool bitmap);
    149int test_check_exists(struct btrfs_block_group *cache, u64 offset, u64 bytes);
    150#endif
    151
    152#endif