summaryrefslogtreecommitdiffstats
path: root/src/kernel/xloop_main.h
blob: 41264607d8d52bebc64e89d0fd3227f36c171304 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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