embox

Форк
0
/
mount.c 
83 строки · 1.3 Кб
1
/**
2
 * @brief
3
 *
4
 * @date 15.03.24
5
 * @author Aleksey Zhmulin
6
 */
7

8
#include <errno.h>
9
#include <posix_errno.h>
10
#include <stdbool.h>
11
#include <sys/mount.h>
12

13
#include <util/err.h>
14
#include <vfs/core.h>
15

16
int mount(const char *source, const char *target, const char *filesystemtype,
17
    unsigned long mountflags, const void *data) {
18
	struct super_block *sb;
19
	struct inode mpt;
20
	int err;
21

22
	vfs_inode_ops_lock();
23
	{
24
		err = vfs_path_lookup(target, &mpt);
25
		if (err) {
26
			goto out_unlock;
27
		}
28

29
		sb = vfs_super_block_mount(filesystemtype, NULL, mountflags & MS_BIND);
30
		if ((err = ptr2err(sb))) {
31
			goto out_unlock;
32
		}
33

34
		vfs_mount_point_get_last(&mpt, &mpt);
35
		vfs_mount_point_add_next(&mpt, sb);
36

37
		vfs_inode_lock(&mpt);
38
	}
39
out_unlock:
40
	vfs_inode_ops_unlock();
41

42
	if (err) {
43
		return SET_ERRNO(-err);
44
	}
45

46
	return 0;
47
}
48

49
int umount(const char *target) {
50
	struct inode tmp;
51
	struct inode mpt;
52
	int err;
53

54
	vfs_inode_ops_lock();
55
	{
56
		err = vfs_path_lookup(target, &tmp);
57
		if (err) {
58
			goto out_unlock;
59
		}
60

61
		vfs_mount_point_get_last(&tmp, &tmp);
62

63
		if (!vfs_mount_point_get_prev(&tmp, &mpt)) {
64
			err = -EINVAL;
65
			goto out_unlock;
66
		}
67

68
		err = vfs_super_block_unmount(tmp.sb);
69
		if (err) {
70
			goto out_unlock;
71
		}
72

73
		vfs_inode_unlock(&mpt);
74
	}
75
out_unlock:
76
	vfs_inode_ops_unlock();
77

78
	if (err) {
79
		return SET_ERRNO(-err);
80
	}
81

82
	return 0;
83
}
84

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

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

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

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