aboutsummaryrefslogtreecommitdiff
path: root/include/linux/msdos_fs.h
blob: b8387c06df725e2418f3b8c3a1182f4729d0e6f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#ifndef _LINUX_MSDOS_FS_H
#define _LINUX_MSDOS_FS_H

#include <linux/types.h>
#include <linux/magic.h>
#include <asm/byteorder.h>


#define SECTOR_SIZE	512		
#define SECTOR_BITS	9		
#define MSDOS_DPB	(MSDOS_DPS)	
#define MSDOS_DPB_BITS	4		
#define MSDOS_DPS	(SECTOR_SIZE / sizeof(struct msdos_dir_entry))
#define MSDOS_DPS_BITS	4		
#define MSDOS_LONGNAME	256		
#define CF_LE_W(v)	le16_to_cpu(v)
#define CF_LE_L(v)	le32_to_cpu(v)
#define CT_LE_W(v)	cpu_to_le16(v)
#define CT_LE_L(v)	cpu_to_le32(v)


#define MSDOS_ROOT_INO	1	
#define MSDOS_DIR_BITS	5	

#define FAT_MAX_DIR_ENTRIES	(65536)
#define FAT_MAX_DIR_SIZE	(FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS)

#define ATTR_NONE	0	
#define ATTR_RO		1	
#define ATTR_HIDDEN	2	
#define ATTR_SYS	4	
#define ATTR_VOLUME	8	
#define ATTR_DIR	16	
#define ATTR_ARCH	32	

#define ATTR_UNUSED	(ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
#define ATTR_EXT	(ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)

#define CASE_LOWER_BASE	8	
#define CASE_LOWER_EXT	16	

#define DELETED_FLAG	0xe5	
#define IS_FREE(n)	(!*(n) || *(n) == DELETED_FLAG)

#define FAT_LFN_LEN	255	
#define MSDOS_NAME	11	
#define MSDOS_SLOTS	21	
#define MSDOS_DOT	".          "	
#define MSDOS_DOTDOT	"..         "	

#define FAT_FIRST_ENT(s, x)	((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
	MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))

#define FAT_START_ENT	2

#define MAX_FAT12	0xFF4
#define MAX_FAT16	0xFFF4
#define MAX_FAT32	0x0FFFFFF6
#define MAX_FAT(s)	(MSDOS_SB(s)->fat_bits == 32 ? MAX_FAT32 : \
	MSDOS_SB(s)->fat_bits == 16 ? MAX_FAT16 : MAX_FAT12)

#define BAD_FAT12	0xFF7
#define BAD_FAT16	0xFFF7
#define BAD_FAT32	0x0FFFFFF7

#define EOF_FAT12	0xFFF
#define EOF_FAT16	0xFFFF
#define EOF_FAT32	0x0FFFFFFF

#define FAT_ENT_FREE	(0)
#define FAT_ENT_BAD	(BAD_FAT32)
#define FAT_ENT_EOF	(EOF_FAT32)

#define FAT_FSINFO_SIG1	0x41615252
#define FAT_FSINFO_SIG2	0x61417272
#define IS_FSINFO(x)	(le32_to_cpu((x)->signature1) == FAT_FSINFO_SIG1 \
			 && le32_to_cpu((x)->signature2) == FAT_FSINFO_SIG2)

struct __fat_dirent {
	long		d_ino;
	__kernel_off_t	d_off;
	unsigned short	d_reclen;
	char		d_name[256]; 
};

#define VFAT_IOCTL_READDIR_BOTH		_IOR('r', 1, struct __fat_dirent[2])
#define VFAT_IOCTL_READDIR_SHORT	_IOR('r', 2, struct __fat_dirent[2])
#define FAT_IOCTL_GET_ATTRIBUTES	_IOR('r', 0x10, __u32)
#define FAT_IOCTL_SET_ATTRIBUTES	_IOW('r', 0x11, __u32)
#define VFAT_IOCTL_GET_VOLUME_ID	_IOR('r', 0x12, __u32)

struct fat_boot_sector {
	__u8	ignored[3];	
	__u8	system_id[8];	
	__u8	sector_size[2];	
	__u8	sec_per_clus;	
	__le16	reserved;	
	__u8	fats;		
	__u8	dir_entries[2];	
	__u8	sectors[2];	
	__u8	media;		
	__le16	fat_length;	
	__le16	secs_track;	
	__le16	heads;		
	__le32	hidden;		
	__le32	total_sect;	

	
	__le32	fat32_length;	
	__le16	flags;		
	__u8	version[2];	
	__le32	root_cluster;	
	__le16	info_sector;	
	__le16	backup_boot;	
	__le16	reserved2[6];	
};

struct fat_boot_fsinfo {
	__le32   signature1;	
	__le32   reserved1[120];	
	__le32   signature2;	
	__le32   free_clusters;	
	__le32   next_cluster;	
	__le32   reserved2[4];
};

struct fat_boot_bsx {
	__u8     drive;		    
	__u8     reserved1;
	__u8     signature;	    
	__u8     vol_id[4];     
	__u8     vol_label[11]; 
	__u8     type[8];       
};
#define FAT16_BSX_OFFSET	36 
#define FAT32_BSX_OFFSET	64 

struct msdos_dir_entry {
	__u8	name[MSDOS_NAME];
	__u8	attr;		
	__u8    lcase;		
	__u8	ctime_cs;	
	__le16	ctime;		
	__le16	cdate;		
	__le16	adate;		
	__le16	starthi;	
	__le16	time,date,start;
	__le32	size;		
};

struct msdos_dir_slot {
	__u8    id;		
	__u8    name0_4[10];	
	__u8    attr;		
	__u8    reserved;	
	__u8    alias_checksum;	
	__u8    name5_10[12];	
	__le16   start;		
	__u8    name11_12[4];	
};

#ifdef __KERNEL__
static inline int fat_valid_media(u8 media)
{
	return 0xf8 <= media || media == 0xf0;
}
#endif 
#endif