1 diff -Nur linux-2.4.16/drivers/block/loop.c linux-int-2.4.16/drivers/block/loop.c
2 --- linux-2.4.16/drivers/block/loop.c Mon Nov 19 23:48:02 2001
3 +++ linux-int-2.4.16/drivers/block/loop.c Tue Dec 4 16:05:50 2001
7 static int transfer_none(struct loop_device *lo, int cmd, char *raw_buf,
8 - char *loop_buf, int size, int real_block)
9 + char *loop_buf, int size, loop_iv_t IV)
11 if (raw_buf != loop_buf) {
16 static int transfer_xor(struct loop_device *lo, int cmd, char *raw_buf,
17 - char *loop_buf, int size, int real_block)
18 + char *loop_buf, int size, loop_iv_t IV)
26 - int IV = index * (PAGE_CACHE_SIZE/bsize) + offset/bsize;
27 + const loop_iv_t IV = (index << (PAGE_CACHE_SHIFT - LOOP_IV_SECTOR_BITS)) + (offset >> LOOP_IV_SECTOR_BITS);
30 size = PAGE_CACHE_SIZE - offset;
32 unsigned long count = desc->count;
33 struct lo_read_data *p = (struct lo_read_data*)desc->buf;
34 struct loop_device *lo = p->lo;
35 - int IV = page->index * (PAGE_CACHE_SIZE/p->bsize) + offset/p->bsize;
36 + const loop_iv_t IV = (page->index << (PAGE_CACHE_SHIFT - LOOP_IV_SECTOR_BITS)) + (offset >> LOOP_IV_SECTOR_BITS);
44 -static inline unsigned long loop_get_iv(struct loop_device *lo,
45 - unsigned long sector)
47 - int bs = loop_get_bs(lo);
48 - unsigned long offset, IV;
50 - IV = sector / (bs >> 9) + lo->lo_offset / bs;
51 - offset = ((sector % (bs >> 9)) << 9) + lo->lo_offset % bs;
58 static int do_bh_filebacked(struct loop_device *lo, struct buffer_head *bh, int rw)
63 struct buffer_head *bh = NULL;
64 struct loop_device *lo;
68 if (!buffer_locked(rbh))
71 * piggy old buffer on original, and submit for I/O
73 bh = loop_get_buffer(lo, rbh);
74 - IV = loop_get_iv(lo, rbh->b_rsector);
75 + IV = rbh->b_rsector + (lo->lo_offset >> LOOP_IV_SECTOR_BITS);
77 set_bit(BH_Dirty, &bh->b_state);
78 if (lo_do_transfer(lo, WRITE, bh->b_data, rbh->b_data,
80 bh->b_end_io(bh, !ret);
82 struct buffer_head *rbh = bh->b_private;
83 - unsigned long IV = loop_get_iv(lo, rbh->b_rsector);
84 + const loop_iv_t IV = rbh->b_rsector + (lo->lo_offset >> LOOP_IV_SECTOR_BITS);
86 ret = lo_do_transfer(lo, READ, bh->b_data, rbh->b_data,
88 diff -Nur linux-2.4.16/include/linux/loop.h linux-int-2.4.16/include/linux/loop.h
89 --- linux-2.4.16/include/linux/loop.h Mon Sep 17 22:16:30 2001
90 +++ linux-int-2.4.16/include/linux/loop.h Tue Dec 4 16:06:03 2001
95 +/* definitions for IV metric */
96 +#define LOOP_IV_SECTOR_BITS 9
97 +#define LOOP_IV_SECTOR_SIZE (1 << LOOP_IV_SECTOR_BITS)
99 +typedef int loop_iv_t;
101 /* Possible states of device */
110 +typedef int (* transfer_proc_t)(struct loop_device *, int cmd,
111 + char *raw_buf, char *loop_buf, int size,
119 int lo_encrypt_key_size;
121 - int (*transfer)(struct loop_device *, int cmd,
122 - char *raw_buf, char *loop_buf, int size,
124 + transfer_proc_t transfer;
125 char lo_name[LO_NAME_SIZE];
126 char lo_encrypt_key[LO_KEY_SIZE];
132 -typedef int (* transfer_proc_t)(struct loop_device *, int cmd,
133 - char *raw_buf, char *loop_buf, int size,
136 static inline int lo_do_transfer(struct loop_device *lo, int cmd, char *rbuf,
137 - char *lbuf, int size, int rblock)
138 + char *lbuf, int size, loop_iv_t IV)
143 - return lo->transfer(lo, cmd, rbuf, lbuf, size, rblock);
144 + return lo->transfer(lo, cmd, rbuf, lbuf, size, IV);
146 #endif /* __KERNEL__ */
149 #define LO_CRYPT_IDEA 6
150 #define LO_CRYPT_DUMMY 9
151 #define LO_CRYPT_SKIPJACK 10
152 +#define LO_CRYPT_AES 16 /* loop-AES */
153 +#define LO_CRYPT_CRYPTOAPI 18 /* international crypto patch */
154 #define MAX_LO_CRYPT 20
158 struct loop_func_table {
159 int number; /* filter type */
160 int (*transfer)(struct loop_device *lo, int cmd, char *raw_buf,
161 - char *loop_buf, int size, int real_block);
162 + char *loop_buf, int size, loop_iv_t IV);
163 int (*init)(struct loop_device *, struct loop_info *);
164 /* release is called from loop_unregister_transfer or clr_fd */
165 int (*release)(struct loop_device *);