diff options
Diffstat (limited to 'src/kernel/xloop_main_5.15.h')
-rw-r--r-- | src/kernel/xloop_main_5.15.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/kernel/xloop_main_5.15.h b/src/kernel/xloop_main_5.15.h new file mode 100644 index 0000000..4126460 --- /dev/null +++ b/src/kernel/xloop_main_5.15.h @@ -0,0 +1,109 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * loop_main.h + * + * Written by Theodore Ts'o, 3/29/93. + * + * Copyright 1993 by Theodore Ts'o. Redistribution of this file is + * permitted under the GNU General Public License. + */ +#ifndef _LINUX_XLOOP_H +#define _LINUX_XLOOP_H + +#include <linux/bio.h> +#include <linux/blkdev.h> +#include <linux/blk-mq.h> +#include <linux/spinlock.h> +#include <linux/mutex.h> +#include "uapi_xloop.h" +#ifdef CONFIG_DEBUG_FS +#include <linux/debugfs.h> +#endif + +#include "xloop_file_fmt.h" + +/* Possible states of device */ +enum { + Xlo_unbound, + Xlo_bound, + Xlo_rundown, + Xlo_deleting, +}; + +struct xloop_func_table; + +struct xloop_device { + int xlo_number; + atomic_t xlo_refcnt; + loff_t xlo_offset; + loff_t xlo_sizelimit; + int xlo_flags; + int (*transfer)(struct xloop_device *xlo, int cmd, struct page *raw_page, unsigned raw_off, struct page *xloop_page, unsigned xloop_off, int size, sector_t real_block); + char xlo_file_name[XLO_NAME_SIZE]; + char xlo_crypt_name[XLO_NAME_SIZE]; + char xlo_encrypt_key[XLO_KEY_SIZE]; + int xlo_encrypt_key_size; + struct xloop_func_table *xlo_encryption; + __u32 xlo_init[2]; + kuid_t xlo_key_owner; /* Who set the key */ + int (*ioctl)(struct xloop_device *xlo, int cmd, unsigned long arg); + + struct xloop_file_fmt *xlo_fmt; + + struct file *xlo_backing_file; + struct block_device *xlo_device; + void *key_data; + + gfp_t old_gfp_mask; + + spinlock_t xlo_lock; + int xlo_state; + spinlock_t xlo_work_lock; + struct workqueue_struct *workqueue; + struct work_struct rootcg_work; + struct list_head rootcg_cmd_list; + struct list_head idle_worker_list; + struct rb_root worker_tree; + struct timer_list timer; + bool use_dio; + bool sysfs_inited; + + struct request_queue *xlo_queue; + struct blk_mq_tag_set tag_set; + struct gendisk *xlo_disk; + struct mutex xlo_mutex; + bool idr_visible; + +#ifdef CONFIG_DEBUG_FS + struct dentry *xlo_dbgfs_dir; +#endif +}; + +struct xloop_cmd { + struct list_head list_entry; + bool use_aio; /* use AIO interface to handle I/O */ + atomic_t ref; /* only for aio */ + long ret; + struct kiocb iocb; + struct bio_vec *bvec; + struct cgroup_subsys_state *blkcg_css; + struct cgroup_subsys_state *memcg_css; +}; + +/* Support for loadable transfer modules */ +struct xloop_func_table { + int number; /* filter type */ + int (*transfer)(struct xloop_device *xlo, int cmd, struct page *raw_page, unsigned raw_off, struct page *xloop_page, unsigned xloop_off, int size, sector_t real_block); + int (*init)(struct xloop_device *xlo, const struct xloop_info64 *info); + /* release is called from xloop_unregister_transfer or clr_fd */ + int (*release)(struct xloop_device *xlo); + int (*ioctl)(struct xloop_device *xlo, int cmd, unsigned long arg); + struct module *owner; +}; + +extern inline struct device *xloop_device_to_dev(struct xloop_device *xlo); + +int xloop_register_transfer(struct xloop_func_table *funcs); +int xloop_unregister_transfer(int number); + +#endif |