1 /* Internal data structures for ADFS */
3 #define ADFS_FREE_FRAG 0
4 #define ADFS_BAD_FRAG 1
5 #define ADFS_ROOT_FRAG 2
7 #define ADFS_NDA_OWNER_READ (1 << 0)
8 #define ADFS_NDA_OWNER_WRITE (1 << 1)
9 #define ADFS_NDA_LOCKED (1 << 2)
10 #define ADFS_NDA_DIRECTORY (1 << 3)
11 #define ADFS_NDA_EXECUTE (1 << 4)
12 #define ADFS_NDA_PUBLIC_READ (1 << 5)
13 #define ADFS_NDA_PUBLIC_WRITE (1 << 6)
23 struct super_block
*sb
;
26 struct buffer_head
*bh
[4];
28 unsigned int parent_id
;
30 struct adfs_dirheader dirhead
;
31 union adfs_dirtail dirtail
;
35 * This is the overall maximum name length
37 #define ADFS_MAX_NAME_LEN 256
39 __u32 parent_id
; /* parent object id */
40 __u32 file_id
; /* object id */
41 __u32 loadaddr
; /* load address */
42 __u32 execaddr
; /* execution address */
43 __u32 size
; /* size */
44 __u8 attr
; /* RISC OS attributes */
45 unsigned char name_len
; /* name length */
46 char name
[ADFS_MAX_NAME_LEN
];/* file name */
50 int (*read
)(struct super_block
*sb
, unsigned int id
, unsigned int sz
, struct adfs_dir
*dir
);
51 int (*setpos
)(struct adfs_dir
*dir
, unsigned int fpos
);
52 int (*getnext
)(struct adfs_dir
*dir
, struct object_info
*obj
);
53 int (*update
)(struct adfs_dir
*dir
, struct object_info
*obj
);
54 int (*create
)(struct adfs_dir
*dir
, struct object_info
*obj
);
55 int (*remove
)(struct adfs_dir
*dir
, struct object_info
*obj
);
56 void (*free
)(struct adfs_dir
*dir
);
60 struct buffer_head
*dm_bh
;
62 unsigned int dm_startbit
;
63 unsigned int dm_endbit
;
70 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
71 int adfs_get_block(struct inode
*inode
, sector_t block
,
72 struct buffer_head
*bh
, int create
);
74 int adfs_bmap(struct inode
*inode
, int block
);
76 struct inode
*adfs_iget(struct super_block
*sb
, struct object_info
*obj
);
77 void adfs_read_inode(struct inode
*inode
);
78 void adfs_write_inode(struct inode
*inode
,int unused
);
79 int adfs_notify_change(struct dentry
*dentry
, struct iattr
*attr
);
82 extern int adfs_map_lookup(struct super_block
*sb
, unsigned int frag_id
, unsigned int offset
);
83 extern unsigned int adfs_map_free(struct super_block
*sb
);
86 void __adfs_error(struct super_block
*sb
, const char *function
,
87 const char *fmt
, ...);
88 #define adfs_error(sb, fmt...) __adfs_error(sb, __FUNCTION__, fmt)
91 extern struct dentry
*adfs_lookup(struct inode
*dir
, struct dentry
*dentry
, struct nameidata
*);
96 * Inodes and file operations
100 extern struct inode_operations adfs_dir_inode_operations
;
101 extern struct file_operations adfs_dir_operations
;
102 extern struct dentry_operations adfs_dentry_operations
;
103 extern struct adfs_dir_ops adfs_f_dir_ops
;
104 extern struct adfs_dir_ops adfs_fplus_dir_ops
;
106 extern int adfs_dir_update(struct super_block
*sb
, struct object_info
*obj
);
109 extern struct inode_operations adfs_file_inode_operations
;
110 extern struct file_operations adfs_file_operations
;
112 extern inline __u32
signed_asl(__u32 val
, signed int shift
)
122 * Calculate the address of a block in an object given the block offset
123 * and the object identity.
125 * The root directory ID should always be looked up in the map [3.4]
128 __adfs_block_map(struct super_block
*sb
, unsigned int object_id
,
131 if (object_id
& 255) {
134 off
= (object_id
& 255) - 1;
135 block
+= off
<< ADFS_SB(sb
)->s_log2sharesize
;
138 return adfs_map_lookup(sb
, object_id
>> 8, block
);