embox

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

8
#include <stdbool.h>
9
#include <string.h>
10
#include <sys/stat.h>
11
#include <sys/types.h>
12

13
#include <kernel/spinlock.h>
14
#include <lib/libds/dlist.h>
15
#include <util/err.h>
16
#include <vfs/core.h>
17

18
void vfs_super_block_init(struct super_block *sb,
19
    const struct vfs_driver *drv) {
20
	struct inode mpt;
21

22
	sb->drv = drv;
23
	sb->usage_count = 0;
24
	sb->bind_mount = false;
25
	sb->mount_point.ino = VFS_BAD_INO;
26
	sb->mount_point.sb = NULL;
27

28
	dlist_init(&sb->list_item);
29
	dlist_init(&sb->mount_list);
30
	spin_init(&sb->lock, __SPIN_UNLOCKED);
31

32
	mpt.ino = VFS_MPT_INO;
33
	mpt.sb = sb;
34

35
	vfs_inode_init(&mpt, S_IRWXA | S_IFDIR);
36
}
37

38
void vfs_super_block_deinit(struct super_block *sb) {
39
	dlist_del(&sb->list_item);
40
}
41

42
struct super_block *vfs_super_block_mount(const char *name,
43
    struct block_dev *bdev, bool bind_mount) {
44
	const struct vfs_driver *drv;
45
	struct super_block *sb;
46

47
	drv = vfs_driver_find(name);
48
	if (!drv) {
49
		return err2ptr(ENOENT);
50
	}
51

52
	sb = drv->ops.mount(bdev);
53
	if (ptr2err(sb)) {
54
		return sb;
55
	}
56

57
	vfs_super_block_init(sb, drv);
58
	sb->bind_mount = bind_mount;
59

60
	return sb;
61
}
62

63
int vfs_super_block_unmount(struct super_block *sb) {
64
	if (!dlist_empty(&sb->mount_list) || (sb->usage_count != 0)) {
65
		return -EBUSY;
66
	}
67

68
	return sb->drv->ops.umount(sb);
69
}
70

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

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

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

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