Subversion Repositories shark

Rev

Rev 3 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1063 tullio 1
 
2 pj 2
/*
1063 tullio 3
 * This program is free software; you can redistribute it and/or modify
4
 * it under the terms of the GNU General Public License as published by
5
 * the Free Software Foundation; either version 2 of the License, or
6
 * (at your option) any later version.
2 pj 7
 *
1063 tullio 8
 * This program is distributed in the hope that it will be useful,
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 * GNU General Public License for more details.
2 pj 12
 *
1063 tullio 13
 * You should have received a copy of the GNU General Public License
14
 * along with this program; if not, write to the Free Software
15
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2 pj 16
 *
17
 */
18
 
1063 tullio 19
 
2 pj 20
#ifndef __MSDOS_H__
21
#define __MSDOS_H__
22
 
23
#include "dentry.h"
24
#include "inode.h"
25
#include "super.h"
26
 
27
#include "dentryop.h"
28
#include "inodeop.h"
29
#include "superop.h"
30
 
31
extern struct dentry_operations msdos_dentry_operations;
32
extern struct inode_operations  msdos_inode_ro_operations;
33
extern struct file_operations   msdos_file_ro_operations;
34
extern struct super_operations  msdos_super_operations;
35
 
36
extern struct inode_operations  msdos_inode_rw_operations;
37
extern struct file_operations   msdos_file_rw_operations;
38
 
39
/*
40
 * directory entry
41
 */
42
 
43
#define ATTR_RDONLY 0x01
44
#define ATTR_HIDDEN 0x02
45
#define ATTR_SYSTEM 0x04
46
#define ATTR_VOLUME 0x08
47
#define ATTR_DIR    0x10
48
#define ATTR_ARCH   0x20
49
 
50
struct directoryentry {
51
  __uint8_t  name[8];
52
  __uint8_t  ext[3];
53
  __uint8_t  attribute;
54
  __uint8_t  reserved[10];
55
  __uint16_t time;
56
  __uint16_t date;
57
  __uint16_t cluster;
58
  __uint32_t size;
59
} __attribute__ ((packed));
60
 
61
/* for debugging */
62
extern void msdos_dump_direntry(struct directoryentry *ptr);
63
 
64
/* directory entry types */
65
 
66
#define LASTENTRYCHAR   0x00
67
#define ERASEDENTRYCHAR 0xe5
68
 
69
extern __inline__ int msdos_islastentry(struct directoryentry *de)
70
{
71
  return (*((de)->name)==LASTENTRYCHAR);
72
}
73
 
74
extern __inline__ int msdos_isfreeentry(struct directoryentry *de)
75
{
76
  return (*((de)->name)==LASTENTRYCHAR||
77
          *((de)->name)==ERASEDENTRYCHAR);
78
}
79
 
80
extern __inline__ int msdos_isunvalidentry(struct directoryentry *de)
81
{
82
  return (*((de)->name)==ERASEDENTRYCHAR)||
83
    ((de)->attribute&ATTR_VOLUME)||
84
    (msdos_islastentry(de));
85
}
86
 
87
extern __inline__ void msdos_markentrybusy(struct directoryentry *de)
88
{
89
  *((de)->name)='~';
90
}
91
 
92
extern __inline__ void msdos_markentryfree(struct directoryentry *de)
93
{
94
  *((de)->name)=ERASEDENTRYCHAR;
95
}
96
 
97
/* */
98
extern int msdos_formatname(struct directoryentry *de, struct qstr *str);
99
 
100
/*
101
 * constants
102
 */
103
 
104
#define CLUSTER_MASK    0xffff0000
105
#define CLUSTER_SHIFT   16
106
#define DENTRY_MASK     0x0000ffff
107
#define DENTRY_SHIFT    0
108
 
109
#define ROOT_CLUSTER    0x0000
110
#define SPECIAL_CLUSTER 0x0001
111
#define FREE_CLUSTER    0xfffe
112
#define NO_CLUSTER      0xffff
113
 
114
#define DIRENTRYSIZE    32
115
#define SECTORSIZE      512
116
 
117
/* first cluster of a msdos volume */
118
#define STARTCLUSTER    2
119
 
120
/* these on msdos directory structure */
121
#define FREECLUSTER 0x0000
122
#define LASTCLUSTER 0xffff
123
#define BADCLUSTER  0xfff7
124
 
125
/* max numbers of fats for volume (that must be supported) */
126
#define MAXFATS         4
127
/*
128
 * 0x01230008 e' la 8' entry del 123 cluster
129
 * 0x00000000 e' la root dir (non ha entry)
130
 * 0x00010005 e' la 5' entry nella root
131
 */
132
 
133
#define CLUOFF2INODE(cluster,deoffs) ((((__uint32_t)cluster)<<CLUSTER_SHIFT)|\
134
                                       ((deoffs)&DENTRY_MASK)\
135
                                       )
136
#define INODE2CLUSTER(inode) ((__uint16_t)((inode)>>CLUSTER_SHIFT))
137
#define INODE2DEOFFS(inode)  ((__uint16_t)((inode)&DENTRY_MASK))
138
 
139
#define ROOT_INODE      CLUOFF2INODE(ROOT_CLUSTER,0)
140
 
141
/*
142
 *
143
 */
144
 
145
/* what is the logical sector of a cluster */
146
extern __inline__ __uint32_t msdos_cluster2sector(struct inode *in,
147
                                                  __uint16_t cluster)
148
{
149
  if (cluster==NO_CLUSTER||
150
      cluster==SPECIAL_CLUSTER||
151
      cluster==FREE_CLUSTER) return (__uint32_t)(-1);
152
  if (cluster==ROOT_CLUSTER) return MSDOS_SB(in->i_sb).lroot;
153
  return (cluster-2)*MSDOS_SB(in->i_sb).spc+MSDOS_SB(in->i_sb).ldata;  
154
}
155
 
156
/*
157
#define msdos_cluster2sector(in,cl) \
158
( \
159
 ((cl)==NO_CLUSTER||(cl)==SPECIAL_CLUSTER||(cl)==FREE_CLUSTER)? \
160
 (-1): \
161
 ( \
162
  ((cl)==ROOT_CLUSTER?) \
163
  MSDOS_SB((in-)>i_sb).lroot: \
164
  ((cl)-2)*MSDOS_SB((in)->i_sb).spc+MSDOS_SB((in)->i_sb).ldata \
165
 ) \
166
)
167
*/
168
 
169
__uint32_t msdos_cluster2sector(struct inode *in, __uint16_t cluster);
170
 
171
__uint16_t msdos_nextcluster(struct super_block *sb, __uint16_t cluster);
172
void msdos_freecluster(struct super_block *sb, __uint16_t cluster);
173
void msdos_lastcluster(struct super_block *sb, __uint16_t cluster);
174
__uint16_t msdos_addcluster(struct super_block *sb, __uint16_t lacluster);
175
void msdos_freeclusterchain(struct super_block *sb, __uint16_t cluster);
176
 
177
#endif