21
#include <fs/file_desc.h>
22
#include <fs/super_block.h>
23
#include <fs/fs_driver.h>
24
#include <fs/inode_operation.h>
27
#include <drivers/block_dev.h>
32
extern struct block_dev *bdev_by_path(const char *source);
34
extern struct file_operations fat_fops;
36
extern int fat_clean_sb(struct super_block *sb);
37
extern int fat_create(struct inode *i_new, struct inode *i_dir, int mode);
41
#define DEFAULT_FAT_VERSION OPTION_GET(NUMBER, default_fat_version)
49
int fat_format(struct block_dev *dev, void *priv) {
50
int fat_n = priv ? atoi((char*) priv) : 0;
51
struct block_dev *bdev = dev;
56
fat_n = DEFAULT_FAT_VERSION;
59
if (fat_n != 12 && fat_n != 16 && fat_n != 32) {
60
log_error("Unsupported FAT version: FAT%d "
61
"(FAT12/FAT16/FAT32 available)", fat_n);
65
fat_create_partition(bdev, fat_n);
66
fat_root_dir_record(bdev);
71
extern struct inode_operations fat_iops;
72
extern struct super_block_operations fat_sbops;
73
extern struct file_operations fat_fops;
80
int fat_fill_sb(struct super_block *sb, const char *source) {
81
struct fat_fs_info *fsi;
82
struct block_dev *bdev;
83
uint32_t pstart, psize;
84
uint8_t pactive, ptype;
85
struct dirinfo *di = NULL;
90
bdev = bdev_by_path(source);
97
*fsi = (struct fat_fs_info) {
101
sb->sb_iops = &fat_iops;
102
sb->sb_fops = &fat_fops;
103
sb->sb_ops = &fat_sbops;
107
pstart = fat_get_ptn_start(bdev, 0, &pactive, &ptype, &psize);
108
if (pstart == 0xffffffff) {
113
if (fat_get_volinfo(bdev, &fsi->vi, pstart)) {
118
if (NULL == (di = fat_dirinfo_alloc())) {
122
memset(di, 0, sizeof(struct dirinfo));
123
di->p_scratch = fat_sector_buff;
125
if (fat_open_rootdir(fsi, di)) {
131
di->fi.volinfo = &fsi->vi;
133
inode_priv_set(sb->sb_root, di);
134
sb->sb_root->i_ops = &fat_iops;
140
fat_dirinfo_free(di);
155
int fat_clean_sb(struct super_block *sb) {
156
struct fat_fs_info *fsi;
166
fat_dirinfo_free(inode_priv(sb->sb_root));
172
static const struct fs_driver fatfs_driver = {
174
.format = fat_format,
175
.fill_sb = fat_fill_sb,
176
.clean_sb = fat_clean_sb,
179
DECLARE_FILE_SYSTEM_DRIVER(fatfs_driver);