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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Internal data structures for ADFS */
  2. #define ADFS_FREE_FRAG  0
  3. #define ADFS_BAD_FRAG  1
  4. #define ADFS_ROOT_FRAG  2
  5. #define ADFS_NDA_OWNER_READ (1 << 0)
  6. #define ADFS_NDA_OWNER_WRITE (1 << 1)
  7. #define ADFS_NDA_LOCKED (1 << 2)
  8. #define ADFS_NDA_DIRECTORY (1 << 3)
  9. #define ADFS_NDA_EXECUTE (1 << 4)
  10. #define ADFS_NDA_PUBLIC_READ (1 << 5)
  11. #define ADFS_NDA_PUBLIC_WRITE (1 << 6)
  12. #include "dir_f.h"
  13. /*
  14.  * Directory handling
  15.  */
  16. struct adfs_dir {
  17. struct super_block *sb;
  18. int nr_buffers;
  19. struct buffer_head *bh[4];
  20. unsigned int pos;
  21. unsigned int parent_id;
  22. struct adfs_dirheader dirhead;
  23. union  adfs_dirtail dirtail;
  24. };
  25. /*
  26.  * This is the overall maximum name length
  27.  */
  28. #define ADFS_MAX_NAME_LEN 256
  29. struct object_info {
  30. __u32 parent_id; /* parent object id */
  31. __u32 file_id; /* object id */
  32. __u32 loadaddr; /* load address */
  33. __u32 execaddr; /* execution address */
  34. __u32 size; /* size */
  35. __u8 attr; /* RISC OS attributes */
  36. unsigned char name_len; /* name length */
  37. char name[ADFS_MAX_NAME_LEN];/* file name */
  38. };
  39. struct adfs_dir_ops {
  40. int (*read)(struct super_block *sb, unsigned int id, unsigned int sz, struct adfs_dir *dir);
  41. int (*setpos)(struct adfs_dir *dir, unsigned int fpos);
  42. int (*getnext)(struct adfs_dir *dir, struct object_info *obj);
  43. int (*update)(struct adfs_dir *dir, struct object_info *obj);
  44. int (*create)(struct adfs_dir *dir, struct object_info *obj);
  45. int (*remove)(struct adfs_dir *dir, struct object_info *obj);
  46. void (*free)(struct adfs_dir *dir);
  47. };
  48. struct adfs_discmap {
  49. struct buffer_head *dm_bh;
  50. __u32 dm_startblk;
  51. unsigned int dm_startbit;
  52. unsigned int dm_endbit;
  53. };
  54. /* dir stuff */
  55. /* Inode stuff */
  56. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
  57. int adfs_get_block(struct inode *inode, long block,
  58.    struct buffer_head *bh, int create);
  59. #else
  60. int adfs_bmap(struct inode *inode, int block);
  61. #endif
  62. struct inode *adfs_iget(struct super_block *sb, struct object_info *obj);
  63. void adfs_read_inode(struct inode *inode);
  64. void adfs_write_inode(struct inode *inode,int unused);
  65. int adfs_notify_change(struct dentry *dentry, struct iattr *attr);
  66. /* map.c */
  67. extern int adfs_map_lookup(struct super_block *sb, int frag_id, int offset);
  68. extern unsigned int adfs_map_free(struct super_block *sb);
  69. /* Misc */
  70. void __adfs_error(struct super_block *sb, const char *function,
  71.   const char *fmt, ...);
  72. #define adfs_error(sb, fmt...) __adfs_error(sb, __FUNCTION__, fmt)
  73. /* namei.c */
  74. extern struct dentry *adfs_lookup(struct inode *dir, struct dentry *dentry);
  75. /* super.c */
  76. /*
  77.  * Inodes and file operations
  78.  */
  79. /* dir_*.c */
  80. extern struct inode_operations adfs_dir_inode_operations;
  81. extern struct file_operations adfs_dir_operations;
  82. extern struct dentry_operations adfs_dentry_operations;
  83. extern struct adfs_dir_ops adfs_f_dir_ops;
  84. extern struct adfs_dir_ops adfs_fplus_dir_ops;
  85. extern int adfs_dir_update(struct super_block *sb, struct object_info *obj);
  86. /* file.c */
  87. extern struct inode_operations adfs_file_inode_operations;
  88. extern struct file_operations adfs_file_operations;
  89. extern inline __u32 signed_asl(__u32 val, signed int shift)
  90. {
  91. if (shift >= 0)
  92. val <<= shift;
  93. else
  94. val >>= -shift;
  95. return val;
  96. }
  97. /*
  98.  * Calculate the address of a block in an object given the block offset
  99.  * and the object identity.
  100.  *
  101.  * The root directory ID should always be looked up in the map [3.4]
  102.  */
  103. extern inline int
  104. __adfs_block_map(struct super_block *sb, unsigned int object_id,
  105.  unsigned int block)
  106. {
  107. if (object_id & 255) {
  108. unsigned int off;
  109. off = (object_id & 255) - 1;
  110. block += off << sb->u.adfs_sb.s_log2sharesize;
  111. }
  112. return adfs_map_lookup(sb, object_id >> 8, block);
  113. }