1 #ifndef _LINUX_MSDOS_FS_H
   2 #define _LINUX_MSDOS_FS_H
   3 
   4 
   5 
   6 
   7 #include <linux/fs.h>
   8 #include <linux/stat.h>
   9 #include <linux/fd.h>
  10 
  11 #define MSDOS_ROOT_INO  1 
  12 #define SECTOR_SIZE     512 
  13 #define SECTOR_BITS     9 
  14 #define MSDOS_DPB       (MSDOS_DPS) 
  15 #define MSDOS_DPB_BITS  4 
  16 #define MSDOS_DPS       (SECTOR_SIZE/sizeof(struct msdos_dir_entry))
  17 #define MSDOS_DPS_BITS  4 
  18 #define MSDOS_DIR_BITS  5 
  19 
  20 #define MSDOS_SUPER_MAGIC 0x4d44 
  21 
  22 #define FAT_CACHE    8 
  23 
  24 #define MSDOS_MAX_EXTRA 3 
  25 
  26 
  27 #define ATTR_RO      1  
  28 #define ATTR_HIDDEN  2  
  29 #define ATTR_SYS     4  
  30 #define ATTR_VOLUME  8  
  31 #define ATTR_DIR     16 
  32 #define ATTR_ARCH    32 
  33 
  34 #define ATTR_NONE    0 
  35 #define ATTR_UNUSED  (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
  36         
  37 #define ATTR_EXT     (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
  38         
  39 
  40 #define CASE_LOWER_BASE 8       
  41 #define CASE_LOWER_EXT  16      
  42 
  43 #define SCAN_ANY     0  
  44 #define SCAN_HID     1  
  45 #define SCAN_NOTHID  2  
  46 #define SCAN_NOTANY  3  
  47 
  48 #define DELETED_FLAG 0xe5 
  49 #define IS_FREE(n) (!*(n) || *(const unsigned char *) (n) == DELETED_FLAG || \
  50   *(const unsigned char *) (n) == FD_FILL_BYTE)
  51 
  52 #define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
  53         
  54 
  55 #define MSDOS_SB(s) (&((s)->u.msdos_sb))
  56 #define MSDOS_I(i) (&((i)->u.msdos_i))
  57 
  58 #define MSDOS_NAME 11 
  59 #define MSDOS_LONGNAME 256 
  60 #define MSDOS_SLOTS 21  
  61 #define MSDOS_DOT    ".          " 
  62 #define MSDOS_DOTDOT "..         " 
  63 
  64 #define MSDOS_FAT12 4078 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 #define CF_LE_W(v) (v)
  74 #define CF_LE_L(v) (v)
  75 #define CT_LE_W(v) (v)
  76 #define CT_LE_L(v) (v)
  77 
  78 
  79 struct msdos_boot_sector {
  80         __s8    ignored[3];     
  81         __s8    system_id[8];   
  82 
  83         __u8    sector_size[2]; 
  84         __u8    cluster_size;   
  85         __u16   reserved;       
  86         __u8    fats;           
  87         __u8    dir_entries[2]; 
  88         __u8    sectors[2];     
  89         __u8    media;          
  90         __u16   fat_length;     
  91         __u16   secs_track;     
  92         __u16   heads;          
  93         __u32   hidden;         
  94         __u32   total_sect;     
  95 };
  96 
  97 struct msdos_dir_entry {
  98         __s8    name[8],ext[3]; 
  99         __u8    attr;           
 100         __u8    lcase;          
 101         __u8    ctime_ms;       
 102         __u16   ctime;          
 103         __u16   cdate;          
 104         __u16   adate;          
 105         __u8    unused[2];
 106         __u16   time,date,start;
 107         __u32   size;           
 108 };
 109 
 110 
 111 struct msdos_dir_slot {
 112         __u8    id;             
 113         __u8    name0_4[10];    
 114         __u8    attr;           
 115         __u8    reserved;       
 116         __u8    alias_checksum; 
 117         __u8    name5_10[12];   
 118         __u8    start[2];       
 119         __u8    name11_12[4];   
 120 };
 121 
 122 struct slot_info {
 123         int is_long;                   
 124         int long_slots;                
 125         int total_slots;               
 126         loff_t longname_offset;        
 127         loff_t shortname_offset;       
 128         int ino;                       
 129 };
 130 
 131 struct fat_cache {
 132         kdev_t device; 
 133         int ino; 
 134         int file_cluster; 
 135         int disk_cluster; 
 136         struct fat_cache *next; 
 137 };
 138 
 139 
 140 #define MSDOS_CAN_BMAP(mib) (!(((mib)->cluster_size & 1) || \
 141     ((mib)->data_start & 1)))
 142 
 143 
 144 #define MSDOS_MKMODE(a,m) (m & (a & ATTR_RO ? S_IRUGO|S_IXUGO : S_IRWXUGO))
 145 
 146 
 147 #define MSDOS_MKATTR(m) ((m & S_IWUGO) ? ATTR_NONE : ATTR_RO)
 148 
 149 
 150 #ifdef __KERNEL__
 151 
 152 
 153 extern int is_binary(char conversion,char *extension);
 154 extern void lock_fat(struct super_block *sb);
 155 extern void unlock_fat(struct super_block *sb);
 156 extern int fat_add_cluster(struct inode *inode);
 157 extern int date_dos2unix(__u16 time, __u16 date);
 158 extern void fat_fs_panic(struct super_block *s,const char *msg);
 159 extern void fat_lock_creation(void);
 160 extern void fat_unlock_creation(void);
 161 extern void fat_date_unix2dos(int unix_date,__u16 *time, __u16 *date);
 162 extern int fat_get_entry(struct inode *dir,loff_t *pos,struct buffer_head **bh,
 163                          struct msdos_dir_entry **de);
 164 extern int fat_scan(struct inode *dir,const char *name,struct buffer_head **res_bh,
 165                     struct msdos_dir_entry **res_de,int *ino,char scantype);
 166 extern int fat_parent_ino(struct inode *dir,int locked);
 167 extern int fat_subdirs(struct inode *dir);
 168 
 169 
 170 extern int fat_access(struct super_block *sb,int nr,int new_value);
 171 extern int fat_smap(struct inode *inode,int sector);
 172 extern int fat_free(struct inode *inode,int skip);
 173 void fat_cache_inval_inode(struct inode *inode);
 174 void fat_cache_inval_dev(kdev_t device);
 175 extern void cache_init(void);
 176 void cache_lookup(struct inode *inode,int cluster,int *f_clu,int *d_clu);
 177 void cache_add(struct inode *inode,int f_clu,int d_clu);
 178 int get_cluster(struct inode *inode,int cluster);
 179 
 180 
 181 extern int fat_bmap(struct inode *inode,int block);
 182 extern int fat_notify_change(struct inode *,struct iattr *);
 183 extern void fat_put_inode(struct inode *inode);
 184 extern void fat_put_super(struct super_block *sb);
 185 extern void fat_read_inode(struct inode *inode, struct inode_operations *dir_ops);
 186 extern struct super_block *fat_read_super(struct super_block *s, void *data, int silent);
 187 extern void msdos_put_super(struct super_block *sb);
 188 extern void fat_statfs(struct super_block *sb,struct statfs *buf, int);
 189 extern void fat_write_inode(struct inode *inode);
 190 
 191 
 192 extern struct file_operations fat_dir_operations;
 193 extern int fat_readdir(struct inode *inode, struct file *filp,
 194                        void *dirent, filldir_t);
 195 extern int fat_dir_ioctl(struct inode * inode, struct file * filp,
 196                          unsigned int cmd, unsigned long arg);
 197 
 198 
 199 extern struct inode_operations fat_file_inode_operations;
 200 extern struct inode_operations fat_file_inode_operations_1024;
 201 extern int fat_file_read(struct inode *, struct file *, char *, int);
 202 extern int fat_file_write(struct inode *, struct file *, const char *, int);
 203 extern void fat_truncate(struct inode *inode);
 204 
 205 
 206 extern int fat_mmap(struct inode *, struct file *, struct vm_area_struct *);
 207 
 208 
 209 
 210 extern int init_vfat_fs(void);
 211 
 212 
 213 
 214 extern int init_msdos_fs(void);
 215 extern struct file_system_type msdos_fs_type;
 216 
 217 
 218 extern struct super_block *msdos_read_super(struct super_block *sb,void *data, int silent);
 219 
 220 
 221 extern void msdos_read_inode(struct inode *inode);
 222 extern int msdos_lookup(struct inode *dir,const char *name,int len, 
 223                         struct inode **result);
 224 extern int msdos_create(struct inode *dir,const char *name,int len,int mode,
 225                         struct inode **result);
 226 extern int msdos_rmdir(struct inode *dir,const char *name,int len);
 227 extern int msdos_mkdir(struct inode *dir,const char *name,int len,int mode);
 228 extern int msdos_unlink(struct inode *dir,const char *name,int len);
 229 extern int msdos_unlink_umsdos(struct inode *dir,const char *name,int len);
 230 extern int msdos_rename(struct inode *old_dir,const char *old_name,int old_len,
 231                         struct inode *new_dir,const char *new_name,int new_len);
 232 
 233 
 234 extern int init_fat_fs(void);
 235 
 236 #endif 
 237 
 238 #endif