embox

Форк
0
/
iso9660_drv.c 
133 строки · 2.3 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @date 10.02.2024
6
 * @author Anton Bondarev
7
 */
8

9
#include <errno.h>
10
#include <string.h>
11

12
#include <mem/sysmalloc.h>
13

14
#include <drivers/block_dev.h>
15

16
#include <fs/inode.h>
17
#include <fs/super_block.h>
18
#include <fs/fs_driver.h>
19

20
#include <fs/iso9660.h>
21

22
int cdfs_destroy_inode(struct inode *inode) {
23
	struct cdfs_file_info *fi;
24

25
	fi = inode_priv(inode);
26

27
	iso9660_fi_free(fi);
28

29
	inode_priv_set(inode, NULL);
30
	
31
	return 0;
32
}
33

34
extern struct super_block_operations cdfs_sbops;
35

36
extern struct inode_operations cdfs_iops;
37
extern struct file_operations cdfsfs_fop;
38
/* FIXME bdev_by_path is declared in dvfs.h and fs/mount.h */
39
extern struct block_dev *bdev_by_path(const char *source);
40

41

42
extern int iso9660_fsi_init(struct inode *root_node);
43

44
int cdfs_fill_sb(struct super_block *sb, const char *source) {
45
	struct inode *dest;
46
	struct block_dev *bdev;
47
	struct cdfs_fs_info *fsi;
48
	struct cdfs_file_info *fi;
49
	int rc;
50
	struct block_dev_cache *cache;
51

52
	bdev = bdev_by_path(source);
53
	if (NULL == bdev) {
54
		return -ENODEV;
55
	}
56

57
	sb->bdev = bdev;
58

59
	/* allocate this fs info */
60
	fsi = iso9660_fsi_alloc();
61
	if (NULL == fsi) {
62
		return -ENOMEM;
63
	}
64
	memset(fsi, 0, sizeof(struct cdfs_fs_info));
65

66
	sb->sb_data = fsi;
67
	sb->sb_ops = &cdfs_sbops;
68
	sb->sb_iops = &cdfs_iops;
69
	sb->sb_fops = &cdfsfs_fop;
70

71
	dest = sb->sb_root;
72

73
	/* allocate this directory info */
74
	fi = iso9660_fi_alloc();
75
	if(NULL == fi) {
76
		rc = -ENOMEM;
77
		goto error1;
78
	}
79
	memset(fi, 0, sizeof(struct cdfs_file_info));
80

81
	inode_priv_set(dest, fi);
82

83
	/* Allocate bdev cache */
84
	cache = block_dev_cache_init(sb->bdev, CDFS_POOLDEPTH);
85
	if (NULL == cache) {
86
		rc = -ENOMEM;
87
		goto error2;
88
	}
89

90
	rc = iso9660_fsi_init(dest);
91
	if(0 != rc) {
92
		goto error3;
93
	}
94

95
	return 0;
96

97
error3:
98
	block_dev_cache_free(sb->bdev);
99
error2:
100
	iso9660_fi_free(fi);
101
error1:
102
	iso9660_fsi_free(fsi);
103

104
	return rc;
105
}
106

107
int cdfs_clean_sb(struct super_block *sb) {
108
	struct cdfs_fs_info *fsi = sb->sb_data;
109

110
	/* Deallocate file system */
111
	if (fsi->path_table_buffer) {
112
		sysfree(fsi->path_table_buffer);
113
	}
114
	if (fsi->path_table) {
115
		sysfree(fsi->path_table);
116
	}
117

118
	iso9660_fsi_free(fsi);
119

120
	iso9660_fi_free(inode_priv(sb->sb_root));
121

122
	block_dev_cache_free(sb->bdev);
123

124
	return 0;
125
}
126

127
static struct fs_driver cdfsfs_driver = {
128
	.name = "iso9660",
129
	.fill_sb = cdfs_fill_sb,
130
	.clean_sb = cdfs_clean_sb,
131
};
132

133
DECLARE_FILE_SYSTEM_DRIVER(cdfsfs_driver);
134

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.