12
#include <mem/sysmalloc.h>
14
#include <drivers/block_dev.h>
17
#include <fs/super_block.h>
18
#include <fs/fs_driver.h>
20
#include <fs/iso9660.h>
22
int cdfs_destroy_inode(struct inode *inode) {
23
struct cdfs_file_info *fi;
25
fi = inode_priv(inode);
29
inode_priv_set(inode, NULL);
34
extern struct super_block_operations cdfs_sbops;
36
extern struct inode_operations cdfs_iops;
37
extern struct file_operations cdfsfs_fop;
39
extern struct block_dev *bdev_by_path(const char *source);
42
extern int iso9660_fsi_init(struct inode *root_node);
44
int cdfs_fill_sb(struct super_block *sb, const char *source) {
46
struct block_dev *bdev;
47
struct cdfs_fs_info *fsi;
48
struct cdfs_file_info *fi;
50
struct block_dev_cache *cache;
52
bdev = bdev_by_path(source);
60
fsi = iso9660_fsi_alloc();
64
memset(fsi, 0, sizeof(struct cdfs_fs_info));
67
sb->sb_ops = &cdfs_sbops;
68
sb->sb_iops = &cdfs_iops;
69
sb->sb_fops = &cdfsfs_fop;
74
fi = iso9660_fi_alloc();
79
memset(fi, 0, sizeof(struct cdfs_file_info));
81
inode_priv_set(dest, fi);
84
cache = block_dev_cache_init(sb->bdev, CDFS_POOLDEPTH);
90
rc = iso9660_fsi_init(dest);
98
block_dev_cache_free(sb->bdev);
102
iso9660_fsi_free(fsi);
107
int cdfs_clean_sb(struct super_block *sb) {
108
struct cdfs_fs_info *fsi = sb->sb_data;
111
if (fsi->path_table_buffer) {
112
sysfree(fsi->path_table_buffer);
114
if (fsi->path_table) {
115
sysfree(fsi->path_table);
118
iso9660_fsi_free(fsi);
120
iso9660_fi_free(inode_priv(sb->sb_root));
122
block_dev_cache_free(sb->bdev);
127
static struct fs_driver cdfsfs_driver = {
129
.fill_sb = cdfs_fill_sb,
130
.clean_sb = cdfs_clean_sb,
133
DECLARE_FILE_SYSTEM_DRIVER(cdfsfs_driver);