embox

Форк
0
/
kmount.c 
98 строк · 1.7 Кб
1
/*
2
 * @file
3
 *
4
 * @date Nov 29, 2012
5
 * @author: Anton Bondarev
6
 */
7

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

12
#include <fs/dir_context.h>
13
#include <fs/inode.h>
14
#include <fs/super_block.h>
15
#include <fs/inode_operation.h>
16
#include <fs/perm.h>
17
#include <fs/vfs.h>
18
#include <fs/path.h>
19

20
static int vfs_mount_walker(struct inode *dir) {
21
	int res;
22
	struct dir_ctx dir_context = { };
23

24
	assert(dir);
25

26
	do {
27
		struct inode *node;
28

29
		node = inode_new(dir->i_sb);
30
		if (NULL == node) {
31
			return -ENOMEM;
32
		}
33

34
		assert(dir->i_ops);
35
		res = dir->i_ops->ino_iterate(node,
36
				inode_name(node),
37
				dir,
38
				&dir_context);
39

40
		if (res == -1){
41
			/* End of directory */
42
			inode_free(node);
43
			return 0;
44
		}
45

46
		node->i_ops = dir->i_ops;
47

48
		node->i_sb = dir->i_sb;
49

50
		vfs_add_leaf(node, dir);
51

52
		if (S_ISDIR(node->i_mode)) {
53
			vfs_mount_walker(node);
54
		}
55
	} while (1);
56
}
57

58
int kmount(const char *source, const char *dest, const char *fs_type) {
59
	struct path dir_node;
60
	struct super_block *sb;
61
	const char *lastpath;
62
	struct mount_descriptor *mnt_desc;
63
	int res;
64

65
	sb = super_block_alloc(fs_type, source);
66
	if (NULL == sb) {
67
		return -ENOMEM;
68
	}
69

70
	if (!strcmp("/", dest)) {
71
		vfs_set_root(sb->sb_root);
72
	}
73

74
	res = fs_perm_lookup(dest, &lastpath, &dir_node);
75
	if (ENOERR != res) {
76
		errno = -res;
77
		return -1;
78
	}
79

80
	if (sb->sb_root->i_ops && sb->sb_root->i_ops->ino_iterate) {
81
		/* If FS provides iterate handler, then we assume
82
		 * that we should use it to actually mount all these
83
		 * files */
84
		vfs_mount_walker(sb->sb_root);
85
	}
86

87
	mnt_desc = dir_node.mnt_desc;
88

89
	mnt_desc = mount_table_add(&dir_node, mnt_desc, sb->sb_root, source);
90
	if (NULL == mnt_desc) {
91
		super_block_free(sb);
92
		//todo free root
93
		errno = -res;
94
		return -1;
95
	}
96

97
	return ENOERR;
98
}
99

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

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

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

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