Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | pj | 1 | /* |
2 | * |
||
3 | * |
||
4 | * |
||
5 | */ |
||
6 | |||
7 | #ifndef __MSDOS_H__ |
||
8 | #define __MSDOS_H__ |
||
9 | |||
10 | #include "dentry.h" |
||
11 | #include "inode.h" |
||
12 | #include "super.h" |
||
13 | |||
14 | #include "dentryop.h" |
||
15 | #include "inodeop.h" |
||
16 | #include "superop.h" |
||
17 | |||
18 | extern struct dentry_operations msdos_dentry_operations; |
||
19 | extern struct inode_operations msdos_inode_ro_operations; |
||
20 | extern struct file_operations msdos_file_ro_operations; |
||
21 | extern struct super_operations msdos_super_operations; |
||
22 | |||
23 | extern struct inode_operations msdos_inode_rw_operations; |
||
24 | extern struct file_operations msdos_file_rw_operations; |
||
25 | |||
26 | /* |
||
27 | * directory entry |
||
28 | */ |
||
29 | |||
30 | #define ATTR_RDONLY 0x01 |
||
31 | #define ATTR_HIDDEN 0x02 |
||
32 | #define ATTR_SYSTEM 0x04 |
||
33 | #define ATTR_VOLUME 0x08 |
||
34 | #define ATTR_DIR 0x10 |
||
35 | #define ATTR_ARCH 0x20 |
||
36 | |||
37 | struct directoryentry { |
||
38 | __uint8_t name[8]; |
||
39 | __uint8_t ext[3]; |
||
40 | __uint8_t attribute; |
||
41 | __uint8_t reserved[10]; |
||
42 | __uint16_t time; |
||
43 | __uint16_t date; |
||
44 | __uint16_t cluster; |
||
45 | __uint32_t size; |
||
46 | } __attribute__ ((packed)); |
||
47 | |||
48 | /* for debugging */ |
||
49 | extern void msdos_dump_direntry(struct directoryentry *ptr); |
||
50 | |||
51 | /* directory entry types */ |
||
52 | |||
53 | #define LASTENTRYCHAR 0x00 |
||
54 | #define ERASEDENTRYCHAR 0xe5 |
||
55 | |||
56 | extern __inline__ int msdos_islastentry(struct directoryentry *de) |
||
57 | { |
||
58 | return (*((de)->name)==LASTENTRYCHAR); |
||
59 | } |
||
60 | |||
61 | extern __inline__ int msdos_isfreeentry(struct directoryentry *de) |
||
62 | { |
||
63 | return (*((de)->name)==LASTENTRYCHAR|| |
||
64 | *((de)->name)==ERASEDENTRYCHAR); |
||
65 | } |
||
66 | |||
67 | extern __inline__ int msdos_isunvalidentry(struct directoryentry *de) |
||
68 | { |
||
69 | return (*((de)->name)==ERASEDENTRYCHAR)|| |
||
70 | ((de)->attribute&ATTR_VOLUME)|| |
||
71 | (msdos_islastentry(de)); |
||
72 | } |
||
73 | |||
74 | extern __inline__ void msdos_markentrybusy(struct directoryentry *de) |
||
75 | { |
||
76 | *((de)->name)='~'; |
||
77 | } |
||
78 | |||
79 | extern __inline__ void msdos_markentryfree(struct directoryentry *de) |
||
80 | { |
||
81 | *((de)->name)=ERASEDENTRYCHAR; |
||
82 | } |
||
83 | |||
84 | /* */ |
||
85 | extern int msdos_formatname(struct directoryentry *de, struct qstr *str); |
||
86 | |||
87 | /* |
||
88 | * constants |
||
89 | */ |
||
90 | |||
91 | #define CLUSTER_MASK 0xffff0000 |
||
92 | #define CLUSTER_SHIFT 16 |
||
93 | #define DENTRY_MASK 0x0000ffff |
||
94 | #define DENTRY_SHIFT 0 |
||
95 | |||
96 | #define ROOT_CLUSTER 0x0000 |
||
97 | #define SPECIAL_CLUSTER 0x0001 |
||
98 | #define FREE_CLUSTER 0xfffe |
||
99 | #define NO_CLUSTER 0xffff |
||
100 | |||
101 | #define DIRENTRYSIZE 32 |
||
102 | #define SECTORSIZE 512 |
||
103 | |||
104 | /* first cluster of a msdos volume */ |
||
105 | #define STARTCLUSTER 2 |
||
106 | |||
107 | /* these on msdos directory structure */ |
||
108 | #define FREECLUSTER 0x0000 |
||
109 | #define LASTCLUSTER 0xffff |
||
110 | #define BADCLUSTER 0xfff7 |
||
111 | |||
112 | /* max numbers of fats for volume (that must be supported) */ |
||
113 | #define MAXFATS 4 |
||
114 | /* |
||
115 | * 0x01230008 e' la 8' entry del 123 cluster |
||
116 | * 0x00000000 e' la root dir (non ha entry) |
||
117 | * 0x00010005 e' la 5' entry nella root |
||
118 | */ |
||
119 | |||
120 | #define CLUOFF2INODE(cluster,deoffs) ((((__uint32_t)cluster)<<CLUSTER_SHIFT)|\ |
||
121 | ((deoffs)&DENTRY_MASK)\ |
||
122 | ) |
||
123 | #define INODE2CLUSTER(inode) ((__uint16_t)((inode)>>CLUSTER_SHIFT)) |
||
124 | #define INODE2DEOFFS(inode) ((__uint16_t)((inode)&DENTRY_MASK)) |
||
125 | |||
126 | #define ROOT_INODE CLUOFF2INODE(ROOT_CLUSTER,0) |
||
127 | |||
128 | /* |
||
129 | * |
||
130 | */ |
||
131 | |||
132 | /* what is the logical sector of a cluster */ |
||
133 | extern __inline__ __uint32_t msdos_cluster2sector(struct inode *in, |
||
134 | __uint16_t cluster) |
||
135 | { |
||
136 | if (cluster==NO_CLUSTER|| |
||
137 | cluster==SPECIAL_CLUSTER|| |
||
138 | cluster==FREE_CLUSTER) return (__uint32_t)(-1); |
||
139 | if (cluster==ROOT_CLUSTER) return MSDOS_SB(in->i_sb).lroot; |
||
140 | return (cluster-2)*MSDOS_SB(in->i_sb).spc+MSDOS_SB(in->i_sb).ldata; |
||
141 | } |
||
142 | |||
143 | /* |
||
144 | #define msdos_cluster2sector(in,cl) \ |
||
145 | ( \ |
||
146 | ((cl)==NO_CLUSTER||(cl)==SPECIAL_CLUSTER||(cl)==FREE_CLUSTER)? \ |
||
147 | (-1): \ |
||
148 | ( \ |
||
149 | ((cl)==ROOT_CLUSTER?) \ |
||
150 | MSDOS_SB((in-)>i_sb).lroot: \ |
||
151 | ((cl)-2)*MSDOS_SB((in)->i_sb).spc+MSDOS_SB((in)->i_sb).ldata \ |
||
152 | ) \ |
||
153 | ) |
||
154 | */ |
||
155 | |||
156 | __uint32_t msdos_cluster2sector(struct inode *in, __uint16_t cluster); |
||
157 | |||
158 | __uint16_t msdos_nextcluster(struct super_block *sb, __uint16_t cluster); |
||
159 | void msdos_freecluster(struct super_block *sb, __uint16_t cluster); |
||
160 | void msdos_lastcluster(struct super_block *sb, __uint16_t cluster); |
||
161 | __uint16_t msdos_addcluster(struct super_block *sb, __uint16_t lacluster); |
||
162 | void msdos_freeclusterchain(struct super_block *sb, __uint16_t cluster); |
||
163 | |||
164 | #endif |