1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_LOOP_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_LOOP_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * include/linux/loop.h 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Written by Theodore Ts'o, 3/29/93. 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright 1993 by Theodore Ts'o. Redistribution of this file is 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * permitted under the GNU General Public License. 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_NAME_SIZE 64 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_KEY_SIZE 32 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/bio.h> 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/blkdev.h> 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/spinlock.h> 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/mutex.h> 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Possible states of device */ 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru Lo_unbound, 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru Lo_bound, 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru Lo_rundown, 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct loop_func_table; 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct loop_device { 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_number; 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_refcnt; 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru loff_t lo_offset; 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru loff_t lo_sizelimit; 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_flags; 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*transfer)(struct loop_device *, int cmd, 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page *raw_page, unsigned raw_off, 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page *loop_page, unsigned loop_off, 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int size, sector_t real_block); 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char lo_file_name[LO_NAME_SIZE]; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char lo_crypt_name[LO_NAME_SIZE]; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char lo_encrypt_key[LO_KEY_SIZE]; 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_encrypt_key_size; 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct loop_func_table *lo_encryption; 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 lo_init[2]; 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru uid_t lo_key_owner; /* Who set the key */ 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*ioctl)(struct loop_device *, int cmd, 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long arg); 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct file * lo_backing_file; 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct block_device *lo_device; 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned lo_blocksize; 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru void *key_data; 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru gfp_t old_gfp_mask; 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru spinlock_t lo_lock; 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bio *lo_bio; 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct bio *lo_biotail; 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_state; 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct completion lo_done; 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct completion lo_bh_done; 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct mutex lo_ctl_mutex; 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_pending; 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru request_queue_t *lo_queue; 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* __KERNEL__ */ 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Loop flags 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruenum { 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru LO_FLAGS_READ_ONLY = 1, 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru LO_FLAGS_USE_AOPS = 2, 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/posix_types.h> /* for __kernel_old_dev_t */ 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/types.h> /* for __u64 */ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Backwards compatibility version */ 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct loop_info { 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_number; /* ioctl r/o */ 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __kernel_old_dev_t lo_device; /* ioctl r/o */ 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long lo_inode; /* ioctl r/o */ 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __kernel_old_dev_t lo_rdevice; /* ioctl r/o */ 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_offset; 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_encrypt_type; 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_encrypt_key_size; /* ioctl w/o */ 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int lo_flags; /* ioctl r/o */ 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char lo_name[LO_NAME_SIZE]; 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned long lo_init[2]; 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru char reserved[4]; 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct loop_info64 { 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 lo_device; /* ioctl r/o */ 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 lo_inode; /* ioctl r/o */ 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 lo_rdevice; /* ioctl r/o */ 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 lo_offset; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 lo_sizelimit;/* bytes, 0 == max available */ 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 lo_number; /* ioctl r/o */ 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 lo_encrypt_type; 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 lo_encrypt_key_size; /* ioctl w/o */ 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u32 lo_flags; /* ioctl r/o */ 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 lo_file_name[LO_NAME_SIZE]; 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 lo_crypt_name[LO_NAME_SIZE]; 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u8 lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __u64 lo_init[2]; 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Loop filter types 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_NONE 0 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_XOR 1 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_DES 2 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_FISH2 3 /* Twofish encryption */ 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_BLOW 4 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_CAST128 5 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_IDEA 6 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_DUMMY 9 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_SKIPJACK 10 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LO_CRYPT_CRYPTOAPI 18 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define MAX_LO_CRYPT 20 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 132c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Support for loadable transfer modules */ 133c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct loop_func_table { 134c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int number; /* filter type */ 135c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*transfer)(struct loop_device *lo, int cmd, 136c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page *raw_page, unsigned raw_off, 137c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct page *loop_page, unsigned loop_off, 138c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int size, sector_t real_block); 139c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*init)(struct loop_device *, const struct loop_info64 *); 140c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru /* release is called from loop_unregister_transfer or clr_fd */ 141c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*release)(struct loop_device *); 142c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru int (*ioctl)(struct loop_device *, int cmd, unsigned long arg); 143c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct module *owner; 144c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}; 145c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 146c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint loop_register_transfer(struct loop_func_table *funcs); 147c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint loop_unregister_transfer(int number); 148c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 149c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 150c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 151c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * IOCTL commands --- we will commandeer 0x4C ('L') 152c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 153c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 154c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_SET_FD 0x4C00 155c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_CLR_FD 0x4C01 156c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_SET_STATUS 0x4C02 157c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_GET_STATUS 0x4C03 158c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_SET_STATUS64 0x4C04 159c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_GET_STATUS64 0x4C05 160c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define LOOP_CHANGE_FD 0x4C06 161c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 162c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 163