loop.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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