]>
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> |
e03a3d7a | 17 | #include <linux/kthread.h> |
607ca46e | 18 | #include <uapi/linux/loop.h> |
1da177e4 LT |
19 | |
20 | /* Possible states of device */ | |
21 | enum { | |
22 | Lo_unbound, | |
23 | Lo_bound, | |
24 | Lo_rundown, | |
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; | |
51 | unsigned lo_blocksize; | |
52 | void *key_data; | |
53 | ||
b4e3ca1a | 54 | gfp_t old_gfp_mask; |
1da177e4 LT |
55 | |
56 | spinlock_t lo_lock; | |
1da177e4 | 57 | int lo_state; |
f85221dd | 58 | struct mutex lo_ctl_mutex; |
e03a3d7a ML |
59 | struct kthread_worker worker; |
60 | struct task_struct *worker_task; | |
2e5ab5f3 | 61 | bool use_dio; |
1da177e4 | 62 | |
01e457cf | 63 | struct request_queue *lo_queue; |
b5dd2f60 | 64 | struct blk_mq_tag_set tag_set; |
73285082 | 65 | struct gendisk *lo_disk; |
1da177e4 LT |
66 | }; |
67 | ||
b5dd2f60 | 68 | struct loop_cmd { |
e03a3d7a | 69 | struct kthread_work work; |
b5dd2f60 ML |
70 | struct request *rq; |
71 | struct list_head list; | |
bc07c10a | 72 | bool use_aio; /* use AIO interface to handle I/O */ |
fe2cb290 | 73 | long ret; |
bc07c10a | 74 | struct kiocb iocb; |
b5dd2f60 ML |
75 | }; |
76 | ||
1da177e4 LT |
77 | /* Support for loadable transfer modules */ |
78 | struct loop_func_table { | |
79 | int number; /* filter type */ | |
80 | int (*transfer)(struct loop_device *lo, int cmd, | |
81 | struct page *raw_page, unsigned raw_off, | |
82 | struct page *loop_page, unsigned loop_off, | |
83 | int size, sector_t real_block); | |
84 | int (*init)(struct loop_device *, const struct loop_info64 *); | |
85 | /* release is called from loop_unregister_transfer or clr_fd */ | |
86 | int (*release)(struct loop_device *); | |
87 | int (*ioctl)(struct loop_device *, int cmd, unsigned long arg); | |
88 | struct module *owner; | |
89 | }; | |
90 | ||
91 | int loop_register_transfer(struct loop_func_table *funcs); | |
92 | int loop_unregister_transfer(int number); | |
93 | ||
94 | #endif |