]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
83a87611 | 2 | * loop.h |
1da177e4 LT |
3 | * |
4 | * Written by Theodore Ts'o, 3/29/93. | |
5 | * | |
6 | * Copyright 1993 by Theodore Ts'o. Redistribution of this file is | |
7 | * permitted under the GNU General Public License. | |
8 | */ | |
607ca46e DH |
9 | #ifndef _LINUX_LOOP_H |
10 | #define _LINUX_LOOP_H | |
1da177e4 | 11 | |
1da177e4 LT |
12 | #include <linux/bio.h> |
13 | #include <linux/blkdev.h> | |
78e367a3 | 14 | #include <linux/blk-mq.h> |
1da177e4 | 15 | #include <linux/spinlock.h> |
f85221dd | 16 | #include <linux/mutex.h> |
607ca46e | 17 | #include <uapi/linux/loop.h> |
1da177e4 LT |
18 | |
19 | /* Possible states of device */ | |
20 | enum { | |
21 | Lo_unbound, | |
22 | Lo_bound, | |
23 | Lo_rundown, | |
990e7811 | 24 | Lo_deleting, |
1da177e4 LT |
25 | }; |
26 | ||
27 | struct loop_func_table; | |
28 | ||
29 | struct loop_device { | |
30 | int lo_number; | |
f8933667 | 31 | atomic_t lo_refcnt; |
1da177e4 LT |
32 | loff_t lo_offset; |
33 | loff_t lo_sizelimit; | |
34 | int lo_flags; | |
35 | int (*transfer)(struct loop_device *, int cmd, | |
36 | struct page *raw_page, unsigned raw_off, | |
37 | struct page *loop_page, unsigned loop_off, | |
38 | int size, sector_t real_block); | |
39 | char lo_file_name[LO_NAME_SIZE]; | |
40 | char lo_crypt_name[LO_NAME_SIZE]; | |
41 | char lo_encrypt_key[LO_KEY_SIZE]; | |
42 | int lo_encrypt_key_size; | |
43 | struct loop_func_table *lo_encryption; | |
44 | __u32 lo_init[2]; | |
e4849737 | 45 | kuid_t lo_key_owner; /* Who set the key */ |
1da177e4 LT |
46 | int (*ioctl)(struct loop_device *, int cmd, |
47 | unsigned long arg); | |
48 | ||
49 | struct file * lo_backing_file; | |
50 | struct block_device *lo_device; | |
1da177e4 LT |
51 | void *key_data; |
52 | ||
b4e3ca1a | 53 | gfp_t old_gfp_mask; |
1da177e4 LT |
54 | |
55 | spinlock_t lo_lock; | |
1da177e4 | 56 | int lo_state; |
87579e9b DS |
57 | spinlock_t lo_work_lock; |
58 | struct workqueue_struct *workqueue; | |
59 | struct work_struct rootcg_work; | |
60 | struct list_head rootcg_cmd_list; | |
61 | struct list_head idle_worker_list; | |
62 | struct rb_root worker_tree; | |
63 | struct timer_list timer; | |
2e5ab5f3 | 64 | bool use_dio; |
d3349b6b | 65 | bool sysfs_inited; |
1da177e4 | 66 | |
01e457cf | 67 | struct request_queue *lo_queue; |
b5dd2f60 | 68 | struct blk_mq_tag_set tag_set; |
73285082 | 69 | struct gendisk *lo_disk; |
6cc8e743 | 70 | struct mutex lo_mutex; |
1c500ad7 | 71 | bool idr_visible; |
1da177e4 LT |
72 | }; |
73 | ||
b5dd2f60 | 74 | struct loop_cmd { |
87579e9b | 75 | struct list_head list_entry; |
e5313c14 OS |
76 | bool use_aio; /* use AIO interface to handle I/O */ |
77 | atomic_t ref; /* only for aio */ | |
fe2cb290 | 78 | long ret; |
bc07c10a | 79 | struct kiocb iocb; |
40326d8a | 80 | struct bio_vec *bvec; |
c74d40e8 DS |
81 | struct cgroup_subsys_state *blkcg_css; |
82 | struct cgroup_subsys_state *memcg_css; | |
b5dd2f60 ML |
83 | }; |
84 | ||
1da177e4 LT |
85 | /* Support for loadable transfer modules */ |
86 | struct loop_func_table { | |
87 | int number; /* filter type */ | |
88 | int (*transfer)(struct loop_device *lo, int cmd, | |
89 | struct page *raw_page, unsigned raw_off, | |
90 | struct page *loop_page, unsigned loop_off, | |
91 | int size, sector_t real_block); | |
92 | int (*init)(struct loop_device *, const struct loop_info64 *); | |
93 | /* release is called from loop_unregister_transfer or clr_fd */ | |
94 | int (*release)(struct loop_device *); | |
95 | int (*ioctl)(struct loop_device *, int cmd, unsigned long arg); | |
96 | struct module *owner; | |
97 | }; | |
98 | ||
99 | int loop_register_transfer(struct loop_func_table *funcs); | |
100 | int loop_unregister_transfer(int number); | |
101 | ||
102 | #endif |