1 #ifndef _LINUX_LOOP_H
2 #define _LINUX_LOOP_H
3 
4 #include <linux/kdev_t.h>
5 
6 /*
7  * include/linux/loop.h
8  *
9  * Written by Theodore Ts'o, 3/29/93.
10  *
11  * Copyright 1993 by Theodore Ts'o.  Redistribution of this file is
12  * permitted under the GNU General Public License.
13  */
14 
15 #define LO_NAME_SIZE	64
16 #define LO_KEY_SIZE	32
17 
18 #ifdef __KERNEL__
19 
20 /* Possible states of device */
21 enum {
22 	Lo_unbound,
23 	Lo_bound,
24 	Lo_rundown,
25 };
26 
27 struct loop_device {
28 	int		lo_number;
29 	int		lo_refcnt;
30 	kdev_t		lo_device;
31 	int		lo_offset;
32 	int		lo_encrypt_type;
33 	int		lo_encrypt_key_size;
34 	int		lo_flags;
35 	int		(*transfer)(struct loop_device *, int cmd,
36 				    char *raw_buf, char *loop_buf, int size,
37 				    int real_block);
38 	char		lo_name[LO_NAME_SIZE];
39 	char		lo_encrypt_key[LO_KEY_SIZE];
40 	__u32           lo_init[2];
41 	uid_t		lo_key_owner;	/* Who set the key */
42 	int		(*ioctl)(struct loop_device *, int cmd,
43 				 unsigned long arg);
44 
45 	struct file *	lo_backing_file;
46 	void		*key_data;
47 	char		key_reserved[48]; /* for use by the filter modules */
48 
49 	int		old_gfp_mask;
50 
51 	spinlock_t		lo_lock;
52 	struct buffer_head	*lo_bh;
53 	struct buffer_head	*lo_bhtail;
54 	int			lo_state;
55 	struct semaphore	lo_sem;
56 	struct semaphore	lo_ctl_mutex;
57 	struct semaphore	lo_bh_mutex;
58 	atomic_t		lo_pending;
59 };
60 
61 typedef	int (* transfer_proc_t)(struct loop_device *, int cmd,
62 				char *raw_buf, char *loop_buf, int size,
63 				int real_block);
64 
lo_do_transfer(struct loop_device * lo,int cmd,char * rbuf,char * lbuf,int size,int rblock)65 static inline int lo_do_transfer(struct loop_device *lo, int cmd, char *rbuf,
66 				 char *lbuf, int size, int rblock)
67 {
68 	if (!lo->transfer)
69 		return 0;
70 
71 	return lo->transfer(lo, cmd, rbuf, lbuf, size, rblock);
72 }
73 #endif /* __KERNEL__ */
74 
75 /*
76  * Loop flags
77  */
78 #define LO_FLAGS_DO_BMAP	1
79 #define LO_FLAGS_READ_ONLY	2
80 #define LO_FLAGS_BH_REMAP	4
81 
82 /*
83  * Note that this structure gets the wrong offsets when directly used
84  * from a glibc program, because glibc has a 32bit dev_t.
85  * Prevent people from shooting in their own foot.
86  */
87 #if __GLIBC__ >= 2 && !defined(dev_t)
88 #error "Wrong dev_t in loop.h"
89 #endif
90 
91 /*
92  *	This uses kdev_t because glibc currently has no appropiate
93  *	conversion version for the loop ioctls.
94  * 	The situation is very unpleasant
95  */
96 
97 struct loop_info {
98 	int		lo_number;	/* ioctl r/o */
99 	dev_t		lo_device; 	/* ioctl r/o */
100 	unsigned long	lo_inode; 	/* ioctl r/o */
101 	dev_t		lo_rdevice; 	/* ioctl r/o */
102 	int		lo_offset;
103 	int		lo_encrypt_type;
104 	int		lo_encrypt_key_size; 	/* ioctl w/o */
105 	int		lo_flags;	/* ioctl r/o */
106 	char		lo_name[LO_NAME_SIZE];
107 	unsigned char	lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
108 	unsigned long	lo_init[2];
109 	char		reserved[4];
110 };
111 
112 /*
113  * Loop filter types
114  */
115 
116 #define LO_CRYPT_NONE	  0
117 #define LO_CRYPT_XOR	  1
118 #define LO_CRYPT_DES	  2
119 #define LO_CRYPT_FISH2    3    /* Brand new Twofish encryption */
120 #define LO_CRYPT_BLOW     4
121 #define LO_CRYPT_CAST128  5
122 #define LO_CRYPT_IDEA     6
123 #define LO_CRYPT_DUMMY    9
124 #define LO_CRYPT_SKIPJACK 10
125 #define MAX_LO_CRYPT	20
126 
127 #ifdef __KERNEL__
128 /* Support for loadable transfer modules */
129 struct loop_func_table {
130 	int number; 	/* filter type */
131 	int (*transfer)(struct loop_device *lo, int cmd, char *raw_buf,
132 			char *loop_buf, int size, int real_block);
133 	int (*init)(struct loop_device *, struct loop_info *);
134 	/* release is called from loop_unregister_transfer or clr_fd */
135 	int (*release)(struct loop_device *);
136 	int (*ioctl)(struct loop_device *, int cmd, unsigned long arg);
137 	/* lock and unlock manage the module use counts */
138 	void (*lock)(struct loop_device *);
139 	void (*unlock)(struct loop_device *);
140 };
141 
142 int  loop_register_transfer(struct loop_func_table *funcs);
143 int loop_unregister_transfer(int number);
144 
145 #endif
146 /*
147  * IOCTL commands --- we will commandeer 0x4C ('L')
148  */
149 
150 #define LOOP_SET_FD	0x4C00
151 #define LOOP_CLR_FD	0x4C01
152 #define LOOP_SET_STATUS	0x4C02
153 #define LOOP_GET_STATUS	0x4C03
154 
155 #endif
156