clean
[linux-2.4.21-pre4.git] / include / linux / loop.h
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
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