embox

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

8
#include <errno.h>
9

10
#include <fs/inode.h>
11
#include <fs/perm.h>
12
#include <fs/vfs.h>
13
#include <fs/path.h>
14

15
#include <security/security.h>
16

17
#include <fs/kfsop.h>
18

19
static int umount_walker(struct inode *node) {
20
	struct inode *child;
21

22
	if (S_ISDIR(node->i_mode)) {
23
		while (NULL != (child = vfs_subtree_get_child_next(node, NULL))) {
24
			umount_walker(child);
25
		}
26
	}
27

28
	vfs_del_leaf(node);
29

30
	return 0;
31
}
32

33
int kumount(const char *dir) {
34
	struct path dir_node, node;
35
	const struct fs_driver *drv;
36
	const char *lastpath;
37
	int res;
38

39
	/* find directory */
40
	res = fs_perm_lookup(dir, &lastpath, &dir_node);
41
	if (0 != res) {
42
		errno = -res;
43
		return -1;
44
	}
45

46
	if_mounted_follow_down(&dir_node);
47
	node = dir_node;
48

49
	drv = dir_node.node->i_sb->fs_drv;
50

51
	if (!drv) {
52
		return -EINVAL;
53
	}
54
	res = security_umount(dir_node.node);
55
	if (0 != res) {
56
		return res;
57
	}
58

59
	res = umount_walker(dir_node.node);
60
	if (0 != res) {
61
		return res;
62
	}
63

64
	super_block_free(dir_node.node->i_sb);
65

66
	if (dir_node.node != vfs_get_root()) {
67
		inode_free(dir_node.node);
68
	}
69

70
	mount_table_del(node.mnt_desc);
71

72
	return 0;
73
}
74

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

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

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

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