13
#include <kernel/spinlock.h>
14
#include <lib/libds/dlist.h>
18
void vfs_super_block_init(struct super_block *sb,
19
const struct vfs_driver *drv) {
24
sb->bind_mount = false;
25
sb->mount_point.ino = VFS_BAD_INO;
26
sb->mount_point.sb = NULL;
28
dlist_init(&sb->list_item);
29
dlist_init(&sb->mount_list);
30
spin_init(&sb->lock, __SPIN_UNLOCKED);
32
mpt.ino = VFS_MPT_INO;
35
vfs_inode_init(&mpt, S_IRWXA | S_IFDIR);
38
void vfs_super_block_deinit(struct super_block *sb) {
39
dlist_del(&sb->list_item);
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;
47
drv = vfs_driver_find(name);
49
return err2ptr(ENOENT);
52
sb = drv->ops.mount(bdev);
57
vfs_super_block_init(sb, drv);
58
sb->bind_mount = bind_mount;
63
int vfs_super_block_unmount(struct super_block *sb) {
64
if (!dlist_empty(&sb->mount_list) || (sb->usage_count != 0)) {
68
return sb->drv->ops.umount(sb);